سؤال

أبحث عن وسيلة لزيادة أو تقليل سرعة الحركة الدائرية.

باستخدام المعادلة المعلمة الدائرة، يمكنني نقل كائن في دائرة مع مرور الوقت:

x = center_x + radius * sin(time * speed)
y = center_y + radius * cos(time * speed)

المشكلة في هذا النهج هي أنني لا أستطيع القيام به ببساطة speed = speed + 1 لتسريع الكائن لأنه يؤدي إلى حركة متشنج. هذا منطقي أنه يتم إعادة حساب قيم x و y لكل إطار يعتمد على القيم المطلقة بدلا من النسبية إلى موضع الكائن السابق.

قد يكون نهج آخر استخدام ناقل يمثل سرعة الكائن، ثم قم بتطبيق حركة دائرية على ناقل بدلا من ذلك:

v_x = radius * sin(time * speed)
v_y = radius * cos(time * speed)
x = x + v_x
y = y + v_y

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

تنفيذ واحد يمكنني التفكير في ذلك قد يعمل يستخدم متجه يندرج من الكائن إلى مركز الدائرة. ثم يمكنني حساب الظل من الدائرة في موضع الكائن باستخدام ناقل عمودي، وتطبيعها وتوسيع نطاقها بالسرعة. لم أفعل ذلك حتى الآن لأنه يبدو وكأنه مبالغة لمشكلة مثل هذا، لذا اسمحوا لي أن أعرف ما إذا كان هناك حل أبسط موجود. شكرا!

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

المحلول

السرعة هي معدل تغيير الزاوية، تغيير السرعة يؤثر فقط على تغيير الزاوية للفترة الزمنية الأخيرة، لذلك:

delta = time - lastTime
angle = angle + delta * speed

x = center_x + radius * sin(angle)
y = center_y + radius * cos(angle)

حيث يجب أن يحمل وقت التحير في وقت آخر، فهم؟

نصائح أخرى

قلت ذلك بنفسك: هل تريد تغيير السرعة الزاوي. وبعد الآن تتغير في السرعة الزاوية، في العالم الحقيقي، محدود من خلال الاتصال الزاوي للكائن. هذا يعني أنه لا يمكن أن يذهب "منفصل" في خطوات من 1.

بدلا من ذلك، فإن السرعة الزاوية هي جزء لا يتجزأ من التسارع الزاوي. الزاوي وضع هو جزء لا يتجزأ من السرعة الزاوية.

لذلك لتسارع الزاوي ثابت، يمكنك القول

السرعة (T) = T * ACC + فيلT = 0.

و

زاوية (ر) = ر 2 * ACC / 2 + فيلT = 0 * T + زاويةT = 0.

ثم يمكنك حساب موقفك الكارشي مع الخطيئة و COS من الزاوية.

التسارع الزاوي يمكن تختلف (تماما) بشكل جيد.

أنت لا تستخدم التسارع بشكل صحيح إذا كنت تفعل ببساطة speed = speed + 1. وبعد أكثر واقعية، تريد القيام بذلك:

accel = 1;
speed = speed + (accel * timeDelta);

أيضا، accel = 1 هو تغيير السرعة الزاوية الكبيرة في راديان - جرب قيمة أصغر، قل PI / 16. وبعد إذا كنت بحاجة إلى التسارع لتكون كبيرة وتريد تقليل ظهور حركات متشنج، فقد ترغب في تجربة استخدام بعض طمس الحركة.

للحصول على زيادة سلسة في السرعة الزاوية، تحتاج إلى إضافة تسارع الزاوي

X = دائرة نصف قطرها * كوس (THETA)
Y = RADIUS * SIN (THETA)

Theta (T) = Theta (0) + Omega (0) * T + 0.5 * Alpha * t ^ 2

حيث هو الوقت، Theta (0) هو الموضع الزاوي في الوقت المناسب 0، أوميغا (0) هو السرعة الزاوية في الوقت المناسب 0 (سيكون مساويا لمعلمة السرعة الخاصة بك) و Alpha هي المعلمة التسارع الزاوي، والتي تختارها شيء مناسب.

استخدام

time * speed

للإشارة إلى مدى سافر الدائرة غير خاطئ. من المنطقي فقط إذا كانت السرعة لا تتغير أبدا.

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

الاقتراحات الأخرى يجب أن تستخدم التسارع جيدة أيضا. جرب شيئا مثل

v = v + a;
d = d + delta * v;

x = center_x + radius * sin(d)
y = center_y + radius * cos(d)

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

x = center_x + radius * sin(time * speed + offset)
y = center_y + radius * cos(time * speed + offset)

def change_speed(new_speed):
    offset = time * (speed - new_speed) + offset
    speed = new_speed

offset يمكن أن تبدأ عند 0 أو حقا أي قيمة ... تستخدم للحفاظ على الاستمرارية، كما

time * old_speed + old_offset == time * new_speed + new_offset
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top