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

C++ 刚体惯性张量世界坐标的计算,c++,directx,game-physics,rigid-bodies,C++,Directx,Game Physics,Rigid Bodies,我正在尝试实现一个小型刚体物理模拟,使用DirectX绘制对象及其数学库,以利用SIMD计算(XMMATRIX和XMVECTOR类) 我的问题是关于惯性张量的,我知道使用它的逆,我可以计算角加速度,如下所示: AngAcc = Inverse(I) * torque 惯性张量,在局部空间,是常数。。。所以我把它的倒数和其他成员一起存储在刚体类中: //'W' suffix means 'world space' //'L' suffix means 'local space' XMFLOAT3

我正在尝试实现一个小型刚体物理模拟,使用DirectX绘制对象及其数学库,以利用SIMD计算(XMMATRIX和XMVECTOR类)

我的问题是关于惯性张量的,我知道使用它的逆,我可以计算角加速度,如下所示:

AngAcc = Inverse(I) * torque
惯性张量,在局部空间,是常数。。。所以我把它的倒数和其他成员一起存储在刚体类中:

//'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_倒数乘以m_worldTransform?如果是,怎么做?第一个是XMFLOAT3X3,而第二个是XMFLOAT4X4
  • 我必须使用方向?在某个地方我读到了类似这样的东西:“inverseWorldineRtiateSensor=rot*inverseBodyInertiaTensor*rot.transpose()”,我认为“rot”是这样一个矩阵:

    XMMATRIX rotation=XMMATRIX rotation四元数(方向W)


  • 我很困惑。。。有人能帮我吗?

    我发现将m_InverseInertainer传感器乘以m_worldTransform是正确的方法只需要m_worldTransform的旋转部分,因此您可以将m_InverseInertiantSensor乘以m_worldTransform的3x3子矩阵

    您是否尝试过:
    m_InverseInertiantSensor W=Reverse(ObjectSpaceInertialSensor*m_worldTransform)=m_InverseInertiantInertiantSensor*inverse(m_worldTransform))真诚地说,我还没有尝试过,我正在编写这个类来构建我的第一个模拟,由一些物理引擎书籍指导,当他们要求世界坐标中的逆惯性张量(用于积分步骤)时,我真的不知道。。。顺便说一句,在我的代码中,m_worldTransform是一个4x4矩阵,而m_InverseInertiantSensor是3x3,因此即使在您的情况下,这两个矩阵也不能相乘:|