我正在尝试实现一个小型刚体物理模拟,使用 DirectX 绘制我的对象及其数学库以利用 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 吗?如果是怎么办?第一个是 XMFLOAT3X3 而第二个是 XMFLOAT4X4 ...
我必须使用方向?在某处我读到类似:“inverseWorldInertiaTensor = rot*inverseBodyInertiaTensor*rot.transpose()”,我认为“rot”是这样的矩阵:
XMMATRIX 旋转 = XMMatrixRotationQuaternion(orientationW);
我很困惑......有人可以帮助我吗?