2

我正在尝试实现一个小型刚体物理模拟,使用 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 旋转 = XMMatrixRotationQuaternion(orientationW);

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

4

1 回答 1

0

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

于 2013-08-20T07:24:05.237 回答