我正在尝试实现一个小的刚体物理模拟,使用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)
现在,在每一帧,我必须计算世界坐标中的反惯性张量 ......此时我有点困惑......
我必须使用方向?在某处我读到的内容如下:“inverseWorldInertiaTensor = rot * inverseBodyInertiaTensor * rot.transpose()”其中我认为'rot'是这样的矩阵:
XMMATRIX rotation = XMMatrixRotationQuaternion(orientationW);
我很困惑......有人可以帮助我吗?
答案 0 :(得分:0)
我发现m_worldTransform 的倍增m_inverseInertiaTensorL是正确的方法; 只需要m_worldTransform 的旋转部分,因此您可以将m_inverseInertiaTensorL乘以m_worldTransform的 3x3-sub-matrix 。