Обчислення сили обертання 2D спрайта


35

Мені цікаво, чи є у когось елегантний спосіб розрахунку наступного сценарію.

У мене є об'єкт (n) кількості квадратів, випадкових фігур, але ми будемо робити вигляд, що це всі прямокутники.

Ми маємо справу з силою тяжіння, тому розгляньте об'єкт у просторі з точки зору зверху вниз. Я прикладаю силу до об'єкта до певного квадрата (як показано нижче).

Застосування сили

Як я обчислюю кут обертання, виходячи із прикладеної сили, у місці, що застосовується. Якщо застосовувати його на центральній площі, він би йшов прямо. Як слід поводитись, чим далі я рухаюся від центру? Як обчислити швидкість обертання?


Що ви хочете, щоб ця сила сталася через час, коли об’єкт обертається? Чи завжди це стосується одного і того ж квадрата в одному напрямку? Чи "підмітається" по краю предмета? За допомогою наданої вами інформації ви можете отримати лише відповідну силу обертання (ака. Крутний момент), але якщо ви хочете вивести з цього швидкість обертання, вам потрібно буде надати імпульс (а не силу) або пояснити, як силу слід застосовувати з плином часу.
sam hocevar

Чесно кажучи, це, мабуть, буде кращим питанням для physics.stackexchange.com, оскільки це повністю питання базової механіки.
BlueRaja - Danny Pflughoeft

Відповіді:


44

Ви намагаєтеся обчислити момент. Крутний момент залежить від прикладеної сили F, точки прикладання та центру маси предмета.

1) Центр меси . Визначте центр маси предмета.

2) Точка застосування : Визначте точку, в якій діє сила.

3) Момент Arm : відстань між двома точками, визначеними вище.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Кутова сила : Розділіть свою силу F на два ортогональні вектори, один паралельний прямій у 3) та перпендикулярний. Паралельна складова не впливає на імпульс кута. Перпендикулярний. Можна обчислити паралельну складову за векторною проекцією. Ви можете відняти це від початкового, щоб отримати перпендикулярну складову. У псевдокоді ( dotозначає крапка-продукт)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5) Крутний момент : перпендикулярна складова сили, помножена на довжину моменту руки.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Щоб дістатися від Крутного моменту до кутової швидкості:

1) Момент інерції : визначення кількості інерції обертання даного об'єкта. Наприклад, для обертання довгого бруска потрібно більше крутного моменту, ніж сфера тієї ж маси. Якщо вас не турбує реалізм, ви можете зробити вигляд, що момент інерції є відносно маси, або ви могли повністю ігнорувати форму та масу предмета.

2) Кутове прискорення :

Vector angularAcceleration = torque / momentOfInertia

3) Кутова швидкість : Кутова швидкість буде постійно зростати, поки застосовується крутний момент. Таким чином, формула буде приблизно "Кутова швидкість у часі T - це сукупна сума кутового прискорення до T ". Це виражається в псевдокоді як

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;

Однак чудова інформація, яка мені найбільше незрозуміла, - це як визначити, якою має бути сила крутного моменту. У мене всі компоненти на місці, як ви описали.
jgallant

@Jon: у вас є компоненти, тобто ви маєте кроки 1 - 3 і не можете зрозуміти, як обчислити крок 4? Це насамперед хитрий крок. Я додам трохи детальніше туди.
Джиммі

3
Орієнтація, що є сукупною сумою кутової швидкості, orientation += angularVelocity * elapsedSecondsпомилкова, оскільки вона завищує швидкість за кроком часу, тобто різні рамки даватимуть різні орієнтації. Правильна формула буде: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Крім того, оскільки немає сили тяжіння, я пропоную замість цього використовувати «центр маси». Хоча +1 за дуже хороше пояснення.
sam hocevar

1
Частина перпендикулярної сили буде діяти для прискорення центру маси, а в міру прикладання сили ближче до центру маси цей коефіцієнт збільшується. Відповідь хороша і дуже чітка, але, здається, неповна у цьому плані.
Сем Уоткінс

Щоб відповісти на власний коментар, я читаю статті Кріса Хекера з фізики: chrishecker.com/Rigid_body_dynamics . Виявляється, що сила чи імпульс у будь-якій точці добре відомий вплив на центр маси згідно F = ma або a2 = a1 + p, як ніби тіло не змогло обертатися. Це випливає із закону збереження лінійного імпульсу. Компонент сили, перпендикулярний радіусу, також викликає крутний момент і зміну імпульсу кута, як це описано у відповіді Джиммі.
Сем Уоткінс

7

якщо сили не надто сильні, набагато простіше моделювати обертання за допомогою декількох точок і пружин, що з'єднують їх. у такому випадку ви просто припускаєте, що ваша форма складається з декількох точок, з'єднаних пружинами. кожна крапка являє собою масу, і кожна річ у формі має масу, рівну нулю.

весна та крапки

вгорі зображення чорної точки являють собою маси, а червона лінія - пружини. то щоб застосувати силу, потрібно просто застосувати її до найближчої точки, і ви побачите, що ваш об'єкт буде обертатися так, як вам подобається. щоб ваша форма виглядала як суцільна структура, краще визначити пружини з високим значенням демпфування та високим значенням k.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.