计算刚体惯性张量世界坐标

时间:2013-08-17 16:08:02

标签: c++ directx game-physics inertia rigid-bodies

我正在尝试实现一个小的刚体物理模拟,使用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)

现在,在每一帧,我必须计算世界坐标中的反惯性张量 ......此时我有点困惑......

我该怎么做?

  1. 我必须将m_inverseInertiaTensorL乘以m_worldTransform?如果有,怎么样?第一个是XMFLOAT3X3,第二个是XMFLOAT4X4 ......
  2. 我必须使用方向?在某处我读到的内容如下:“inverseWorldInertiaTensor = rot * inverseBodyInertiaTensor * rot.transpose()”其中我认为'rot'是这样的矩阵:

    XMMATRIX rotation = XMMatrixRotationQuaternion(orientationW);

  3. 我很困惑......有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我发现m_worldTransform 的倍增m_inverseInertiaTensorL是正确的方法; 只需要m_worldTransform 的旋转部分,因此您可以将m_inverseInertiaTensorL乘以m_worldTransform的 3x3-sub-matrix