XNA Collision Detection - Vector2.Reflect - مساعدة في حساب طبيعية Sprite Circle - C #

StackOverflow https://stackoverflow.com/questions/2212042

سؤال

أواجه مشكلة في التفاف عقلي حول كيفية حساب الطبيعي لدائرة متحركة في مساحة ثنائية الأبعاد. لقد حصلت بقدر ما أفترض أن أقوم بحساب طبيعية السرعة (السرعة الاتجاهية) للكائن، ولكن هذا هو المكان الذي تعاني منه أجبري على درجات حرارية، أي أعود مع دوائر ثنائية الأبعاد المركز، دائرة نصف قطرها، السرعة، والموقف.

في النهاية، أرغب في استخدام طريقة Vector2.Reflect للحصول على الفيزياء الأكثر واقعية قليلا من هذا التمرين.

شكرا في وقت مبكر.

تحرير: أضيفت بعض التعليمات البرمجية التي تحاول الاقتراحات (دون جدوى)، ربما أسيء فهم الاقتراح. أنا هنا أستخدم كرة السلة وبيسبول، وبالتالي قاعدة وسلة سلة. لدي أيضا موقف، والسرعة التي تتم إضافتها إلى وضع لإنشاء الحركة.

if ((Vector2.Distance(baseMid, basketMid)) < baseRadius + basketRadius)
{
    Vector2 baseNorm = basketMid - baseMid;
    baseNorm.Normalize();
    Vector2 basketNorm = baseMid - basketMid;
    basketNorm.Normalize();
    baseVelocity = Vector2.Reflect(baseVelocity, baseNorm);
    basketVelocity = Vector2.Reflect(basketVelocity, basketNorm);
}

basePos.Y += baseVelocity.Y;
basePos.X += baseVelocity.X;
basketPos.Y += basketVelocity.Y;
basketPos.X += basketVelocity.X;
basketMid = new Vector2((basketballTex.Width / 2 + basketPos.X), (basketballTex.Height / 2 + basketPos.Y));
baseMid = new Vector2((baseballTex.Width / 2 + basePos.X), (baseballTex.Height / 2 + basePos.Y));
هل كانت مفيدة؟

المحلول

أول انعكاس. إذا كنت أقرأ رمز التعليمات البرمجية الصحيحة، فإن الحجة الثانية إلى Vector2.reflect هي طبيعية إلى سطح. يحتوي مستوى الطابق على مستوى طبيعي (0،1)، وكرة مع سرعة (4، -3) يضربها ويطير بسرعة (4،3). هل هذا صحيح؟ إذا لم يكن الأمر صحيحا، فسيتعين علينا تغيير نص البيان إذا. (لاحظ أنه يمكنك حفظ بعض الدورات عن طريق إعداد Basketnorm = -Basenorm.)

الآن الفيزياء. كما هو مكتوب، عندما تصطدم الكرات، كل ترتد، كما لو كانت قد ضربت جدار زجاجي على كلا المجالات، وهذا ليس واقعيا. تخيل لعب البلياردو: كرة حمراء سريعة تضرب مركزا ثابتا للكرة الأزرق الثابتة. هل انتعاش الكرة الحمراء وترك الكرة الزرقاء حيث كان؟ لا، يتم طرح الكرة الزرقاء والكرة الحمراء التي تفقد معظم سرعتها (كل شيء، في حالة مثالية). ماذا عن Cannonball وكرة الجولف، سواء تتحرك بنفس السرعة ولكن في اتجاهين متعاكسين، تصطاد رأسه. هل كلاهما يرتد بنفس القدر؟ لا، ستستمر المدفع، بالكاد يلاحظ التأثير، ولكن كرة الجولف سوف عكس الاتجاه وتطير بعيدا أسرع مما جاء.

لفهم هذه التصادمات عليك أن تفهم الزخم (وإذا كنت تريد اصطدام غير مرنة تماما، مثل عندما تصطدم أكياس القبعات، عليك أيضا فهم الطاقة). سيغطي كتاب الفيزياء الأساسي هذا في فصل مبكر. إذا كنت ترغب فقط في أن تكون قادرا على محاكاة هذه الأشياء، استخدم إطار مركز الشامل:

Vector2 cmvelocity = (session.mass * basket.velocity + base.mass * base.velocity) / (session.mass + base.mass)؛ basevelocity - = cmvelocity؛ basevelocity = vector2.reflect (basevelocity، basenorm)؛ basevelocity + = cmvelocity؛ السلة - = cmvelocity؛ Baskinvelocity = vector2.reflect (السلة، ستورم)؛ السلة + = cmvelocity؛

نصائح أخرى

إن طبيعية الدائرة في نقطة معينة على حافةها ستكون الاتجاه من مركزها لهذه النقطة. على افتراض أنك تعمل مع اصطدامات الدوائر هنا، فإن طريقة واحدة سهلة "مختارة" للعمل ستكون في وقت الاصطدام (عندما تكون الدوائر التي تلمس)، فإن ما يلي سيعقد صحيحا:

واسمحوا أن يكون مركز دائرة واحدة و ب مركز الآخر. عادة ما تكون طبيعية لدائرة أ تطبيع (BA) وستكون العادي لدائرة B تطبيع (AB). هذا صحيح لأن النقطة التي لمسها ستكون دائما colinear مع مراكز الدائرتين.

التحذير: لن أفترض أن هذا صحيح تماما. الفيزياء ليس تخصصي.

الحركة ليس لها تأثير على طبيعي. عادة ما يكون عادي فقط ناقلات طبيعي (الطول 1) يشير إلى اتجاه، عادة ما يكون الاتجاه الذي يواجه بولي كائن ثلاثي الأبعاد.

ما أعتقد أنك تريد القيام به هو العثور على تصادم طبيعي بين دائرتين، نعم؟ إذا كان الأمر كذلك، فإن إحدى الخصائص الرائعة للمجالات هي أنه إذا وجدت المسافة بين مراكزها، فيمكنك تطبيع ذلك للحصول على طبيعي المجال.

ماذا يبدو صحيح للفيزياء 2D هو أنك تأخذ السرعة * الكتلة (الطاقة) من المجال، وتضاعف ذلك من قبل المتجه الطبيعي إلى المجال الآخر. أضف النتيجة إلى طاقة Sphere الخاصة بجهة الوجهة، وطرحها من طاقة Sphere الأصلية، وقسم كل منها، بشكل فردي، بالكتلة للحصول على السرعة الناتجة. إذا كان المجال الآخر يتحرك، فقم بذلك في الاتجاه المعاكس. ربما يمكنك تبسيط الرياضيات من هناك، بالطبع، لكنها متأخرة ولا أشعر أنني أفعل ذلك :)

إذا تنتقل كلا المجالين، كرر العملية للكرة الأخرى (على الرغم من أنك ربما تبسيط هذه المعادلة للحصول على بعض الرياضيات أكثر كفاءة).

هذا هو مجرد الرياضيات من منديل، ولكن يبدو أنه يعطي النتائج الصحيحة. و، مهلا، أنا ذات يوم زوايا الزراعة المشتقة بمفردي، لذلك في بعض الأحيان تعمل الرياضيات الخلفية من منديل في الواقع.

هذا يفترض أيضا تصادمات مرنة تماما.

إذا كنت غير صحيحة، سأكون سعيدا لمعرفة أين :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top