DirectX を使用してオブジェクトを描画し、その Math ライブラリを使用して SIMD 計算 (XMMATRIX および XMVECTOR クラス) を利用して、小さな剛体物理シミュレーションを実装しようとしています。
私の質問はInertia Tensorに関するものです。その逆数を使用して角加速度を次のように計算できることを知っています。
AngAcc = Inverse(I) * torque
そして、その慣性テンソルは、ローカル空間では一定です...そのため、他のメンバーと一緒に RigidBody クラスにその逆を格納しました:
//'W' suffix means 'world space'
//'L' suffix means 'local space'
XMFLOAT3 m_positionW; //rigid body position
XMFLOAT4 m_orientationW; //angular orientation
XMFLOAT3 m_velocityW; //linear velocity
XMFLOAT3 m_rotationW; //angular velocity (rotation)
XMFLOAT3X3 m_inverseInertiaTensorL; //inverse of the body inertia tensor in local space (constant)
XMFLOAT4X4 m_worldTransform; //transform matrix for converting body space into world space
XMFLOAT3X3 m_inverseInertiaTensorW; //inverse of the body inertia tensor in world space (change every frame)
さて、各フレームで、ワールド座標で逆慣性テンソルを計算する必要があります...そして、この時点で私は少し混乱しています...
どうやってやるの?
- m_inverseInertiaTensorL を m_worldTransform で乗算する必要がありますか? はいの場合、どのように?1 つ目は XMFLOAT3X3 で、2 つ目は XMFLOAT4X4 です...
オリエンテーションを使用する必要がありますか? どこかで次のようなものを読みました:「inverseWorldInertiaTensor = rot*inverseBodyInertiaTensor*rot.transpose()」ここで、「腐敗」は次のような行列であると思います:
XMMATRIX 回転 = XMMatrixRotationQuaternion(orientationW);
私は非常に混乱しています...誰かが私を助けることができますか?