Вы пытаетесь рассчитать крутящий момент. Крутящий момент зависит от приложенной силы F, точки приложения и центра масс объекта.
1) Центр масс . Определите центр масс объекта.
2) Точка приложения : определите точку, в которой действует сила.
3) Момент рука : расстояние между двумя точками, определенными выше.
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;