Ви намагаєтеся обчислити момент. Крутний момент залежить від прикладеної сили 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;