Você está tentando calcular o torque. O torque depende da força aplicada F, do ponto de aplicação e do centro de massa do objeto.
1) Centro de massa . Defina o centro de massa do objeto.
2) Ponto de Aplicação : Defina o ponto em que a força atua.
3) Braço do momento : a distância entre os dois pontos definidos acima.
Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass
4) Força angular : divida sua força F em dois vetores ortogonais, um paralelo à linha em 3) e um perpendicular. O componente paralelo não afeta o momento angular. O perpendicular faz. Você pode calcular o componente paralelo por projeção vetorial. Você pode subtrair isso do original para obter o componente perpendicular. No pseudocódigo ( dot
significa produto escalar)
Vector myForce
Vector momentArm
parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent
5) Torque : O componente perpendicular da força multiplicado pelo comprimento do braço do momento.
Vector angularForce
Vector torque = angularForce * momentArm.Length
Para passar do torque para a velocidade angular:
1) Momento de inércia : Uma definição de quanta inércia rotacional um determinado objeto possui. Por exemplo, é preciso mais torque para girar uma barra longa do que uma esfera da mesma massa. Se você não está preocupado com o realismo, pode fingir que o momento de inércia é relativo à massa ou pode ignorar completamente a forma e a massa do objeto.
2) Aceleração angular :
Vector angularAcceleration = torque / momentOfInertia
3) Velocidade angular : a velocidade angular continuará aumentando enquanto o torque estiver sendo aplicado. Portanto, uma fórmula será aproximadamente "Velocidade angular no momento T é a soma cumulativa da aceleração angular até T. " Isso é expresso em pseudocódigo como
void Update(float elapsedSeconds):
orientation += 0.5 * angularVelocity * elapsedSeconds;
angularVelocity += angularAcceleration * elapsedSeconds;
orientation += 0.5 * angularVelocity * elapsedSeconds;