حساب السرعة الأولية لتحريك مسافة محددة مع القصور الذاتي

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

سؤال

أريد تحريك شيء مسافة محددة. ولكن في نظامي هناك الجمود/السحب/التسارع السلبي. أنا أستخدم حسابًا بسيطًا مثل هذا:

v = oldV + ((targetV - oldV) * inertia)

إن تطبيق ذلك على عدد من الإطارات يجعل الحركة "ترتفع" أو تتحلل ، على سبيل المثال:

v = 10 + ((0 - 10) * 0.25) = 7.5 // velocity changes from 10 to 7.5 this frame

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

لقد كنت أبحث في معادلات الحركة (http://en.wikipedia.org/wiki/equations_of_motion) لكن لا يمكن أن تعرف ما هو الصحيح لمشكلتي ...

أيه أفكار؟ شكرا - أنا من تصميم وليس خلفية علمية.

استكمال: لدى Fiirhok حلاً ذي قيمة تسريع ثابتة ؛ HTML+JQuery Demo:
http://pastebin.com/ekdwcyvj
هل هناك أي طريقة للقيام بذلك بقيمة كسرية أو وظيفة تخفيف؟ تتمثل فائدة ذلك في تجربتي في أن التسارع الثابت والرسوم المتحركة القائمة على الإطار يتجاوزون في بعض الأحيان النقطة النهائية ويحتاج إلى إجباره ، مما يخلق خللًا بسيطًا.

هل كانت مفيدة؟

المحلول

هذه مشكلة حركية بسيطة.

في وقت ما t ، يتم وصف السرعة (v) للكائن تحت تسارع ثابت بواسطة:

v = v0 + at

حيث V0 هي السرعة الأولية و A هي التسارع. في حالتك ، تكون السرعة النهائية هي الصفر (يتم إيقاف الكائن) حتى نتمكن من حل T:

t = -v0/a

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

d = v0t + 1/2 * at^2

يمكننا أن نستبدل في معادلة T قمنا بتطوير ealier:

d = v0^2/a + 1/2 * v0^2 / a

وحل V0:

v0 = sqrt(-2ad)

أو بتنسيق أكثر باللغة البرمجية:

initialVelocity = sqrt( -2 * acceleration * distance );

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

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

position = 0;
currentVelocity = initialVelocity;
while( currentVelocity > 0 )
{
    averageVelocity = currentVelocity + (acceleration / 2);
    position = position + averageVelocity;
    currentVelocity += acceleration;
}

نصائح أخرى

إذا كنت ترغب في نقل مسافة محددة ، فاستخدم ما يلي:

alt text

المسافة المقطوعة هي مجرد جزء لا يتجزأ من السرعة فيما يتعلق بالوقت. تحتاج إلى دمج تعبيرك فيما يتعلق بالوقت مع الحدود [V ، 0] وسيعطيك هذا تعبيرًا للمسافة من حيث V (السرعة الأولية).

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