トルクを計算しようとしています。トルクは、適用される力F、適用点、およびオブジェクトの重心に依存します。
1)質量の中心。オブジェクトの重心を定義します。
2)適用点:力が作用する点を定義します。
3)モーメントアーム:上記で定義した2点間の距離。
Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass
4)角力:力Fを2つの直交ベクトルに分けます。1つは3)の線に平行で、もう1つは垂直です。平行成分は角運動量に影響しません。垂直のものはそうです。ベクトル投影により平行成分を計算できます。オリジナルからそれを差し引いて、垂直成分を取得できます。擬似コード(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;