如何将矩阵从局部坐标转换为世界坐标?

时间:2019-08-24 21:25:48

标签: c++ matrix game-physics physics-engine

我正在按照Ian Millington的书 Game Physics Engine Development (游戏物理引擎开发)来构建游戏物理引擎,而在更改矩阵基础时,我对他的一种实现感到困惑。

为了将旋转应用于刚体,我将惯性张量的逆存储在RigidBody类中。但是,它是在局部空间中给出的,因此,要使用它,我需要将其转换为世界空间。

这是他使用的代码(我知道很多代码,但是我不想更改原始代码)。该函数接收局部空间(iitBody)的反惯性张量和刚体(rotmat)的旋转矩阵,并输出世界空间(iitWorld的反惯性张量。

static inline void _transformInertiaTensor(Matrix3 &iitWorld, const Quaternion &q, const Matrix3 &iitBody, const Matrix4 &rotmat)
{
    real t4  = rotmat.data[0]*iitBody.data[0] + rotmat.data[1]*iitBody.data[3] + rotmat.data[2]*iitBody.data[6];
    real t9  = rotmat.data[0]*iitBody.data[1] + rotmat.data[1]*iitBody.data[4] + rotmat.data[2]*iitBody.data[7];
    real t14 = rotmat.data[0]*iitBody.data[2] + rotmat.data[1]*iitBody.data[5] + rotmat.data[2]*iitBody.data[8];
    real t28 = rotmat.data[4]*iitBody.data[0] + rotmat.data[5]*iitBody.data[3] + rotmat.data[6]*iitBody.data[6];
    real t33 = rotmat.data[4]*iitBody.data[1] + rotmat.data[5]*iitBody.data[4] + rotmat.data[6]*iitBody.data[7];
    real t38 = rotmat.data[4]*iitBody.data[2] + rotmat.data[5]*iitBody.data[5] + rotmat.data[6]*iitBody.data[8];
    real t52 = rotmat.data[8]*iitBody.data[0] + rotmat.data[9]*iitBody.data[3] + rotmat.data[10]*iitBody.data[6];
    real t57 = rotmat.data[8]*iitBody.data[1] + rotmat.data[9]*iitBody.data[4] + rotmat.data[10]*iitBody.data[7];
    real t62 = rotmat.data[8]*iitBody.data[2] + rotmat.data[9]*iitBody.data[5] + rotmat.data[10]*iitBody.data[8];

    iitWorld.data[0] = t4*rotmat.data[0]  + t9*rotmat.data[1]  + t14*rotmat.data[2];
    iitWorld.data[1] = t4*rotmat.data[4]  + t9*rotmat.data[5]  + t14*rotmat.data[6];
    iitWorld.data[2] = t4*rotmat.data[8]  + t9*rotmat.data[9]  + t14*rotmat.data[10];
    iitWorld.data[3] = t28*rotmat.data[0] + t33*rotmat.data[1] + t38*rotmat.data[2];
    iitWorld.data[4] = t28*rotmat.data[4] + t33*rotmat.data[5] + t38*rotmat.data[6];
    iitWorld.data[5] = t28*rotmat.data[8] + t33*rotmat.data[9] + t38*rotmat.data[10];
    iitWorld.data[6] = t52*rotmat.data[0] + t57*rotmat.data[1] + t62*rotmat.data[2];
    iitWorld.data[7] = t52*rotmat.data[4] + t57*rotmat.data[5] + t62*rotmat.data[6];
    iitWorld.data[8] = t52*rotmat.data[8] + t57*rotmat.data[9] + t62*rotmat.data[10];
}

据我了解,为了将矩阵从局部空间更改为世界空间,我只需要将旋转矩阵乘以世界空间中的逆惯性张量即可。但是,Millington的实现包括旋转矩阵的第二次乘法运算,我无法理解为什么。

0 个答案:

没有答案