Как изменить матрицу с локальных координат на мировые координаты?

Я создаю движок игровой физики, следуя книге Яна Миллингтона Разработка движка игровой физики, и меня смущает одна из его реализаций при изменении базиса матриц.

Чтобы применить вращение к твердым телам, я сохранил инверсию тензора инерции в классе 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];
}

Насколько я понимаю, чтобы изменить матрицу с локального на мировое пространство, мне просто нужно было бы умножить матрицу вращения на обратный тензор инерции в мировом пространстве. Однако реализация Миллингтона включает второе умножение на матрицу вращения, и я не смог понять, почему.


person Juan Diego Alzate Mejia    schedule 24.08.2019    source источник
comment
Я обнаружил, что stackoverflow.com/questions/18290798/ отвечает на вопрос и заявляет, что правильный способ - умножить матрицу вращения на обратный тензор инерции в локальном пространстве. Однако мой вопрос больше о том, почему автор сделал то, что он сделал.   -  person Juan Diego Alzate Mejia    schedule 25.08.2019
comment
Может быть, лучше задать этот вопрос здесь!   -  person csabinho    schedule 25.08.2019
comment
@csabinho О, хорошо, спасибо за совет! Я тоже попробую.   -  person Juan Diego Alzate Mejia    schedule 25.08.2019
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это математическая задача, а не проблема программирования.   -  person L. F.    schedule 25.08.2019