Estás tratando de calcular el par. El par depende de la fuerza aplicada F, el punto de aplicación y el centro de masa del objeto.
1) Centro de misa . Definir el centro de masa del objeto.
2) Punto de aplicación : defina el punto en el que actúa la fuerza.
3) Brazo de momento : la distancia entre los dos puntos definidos anteriormente.
Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass
4) Fuerza angular : Divida su fuerza F en dos vectores ortogonales, uno Paralelo a la línea en 3) y uno Perpendicular. El componente paralelo no afecta el momento angular. El perpendicular lo hace. Puede calcular el componente paralelo por proyección vectorial. Puede restar eso del original para obtener el componente perpendicular. En pseudocódigo ( dot
significa producto de punto)
Vector myForce
Vector momentArm
parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent
5) Par : El componente perpendicular de la fuerza multiplicado por la longitud del brazo del momento.
Vector angularForce
Vector torque = angularForce * momentArm.Length
Para ir del par a la velocidad angular:
1) Momento de inercia : una definición de cuánta inercia rotacional tiene un objeto dado. Por ejemplo, se necesita más torque para rotar una barra larga que una esfera de la misma masa. Si no le preocupa el realismo, puede fingir que el momento de inercia es relativo a la masa, o puede ignorar por completo la forma y la masa del objeto.
2) aceleración angular :
Vector angularAcceleration = torque / momentOfInertia
3) Velocidad angular : la velocidad angular seguirá aumentando mientras se aplique el par. Entonces, una fórmula será aproximadamente "Velocidad angular en el momento T es la suma acumulativa de la aceleración angular hasta T ". Esto se expresa en pseudocódigo como
void Update(float elapsedSeconds):
orientation += 0.5 * angularVelocity * elapsedSeconds;
angularVelocity += angularAcceleration * elapsedSeconds;
orientation += 0.5 * angularVelocity * elapsedSeconds;