Смена осей координат

у меня есть матрица 4х4 из движка RenderWare.введите сюда описание изображения введите сюда описание изображения

введите сюда описание изображения

Мне хочется переделать её в формат Collada, как можно это сделать? У меня есть черновой код, но местами вращение неверное.

    public static Matrix4x4 Transform(Matrix4x4 solidTransform)
    {
        var position = new Vector3(solidTransform.M41, solidTransform.M42, solidTransform.M43);
        var newPosition = new Vector3(position.X, position.Y, position.Z);

        var rotation = Quaternion.CreateFromRotationMatrix(solidTransform);

        float x = rotation.X;
        float y = rotation.Y;
        float z = rotation.Z;
        float w = rotation.W;

        float[,] identityMatrix = {
             { 1, 0, 0},
             { 0, 1, 0},
             { 0, 0, 1},
         };

        float[,] matrix4x4 = {
             { 0, 0, 0 },
             { 0, 0, 0 },
             { 0, 0, 0 },
         };

        float[,] symetricalMatrix = {
             { (-(y * y) - (z * z)), x* y, x*z},
             { x* y, (-(x * x) - (z * z)), y*z},
             { x* z, y*z, (-(x * x) - (y * y))}
         };

        float[,] antiSymetricalMatrix = {
             { 0, -z, y},
             { z, 0, -x},
             { -y, x, 0}
         };

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                matrix4x4[i, j] = identityMatrix[i, j]
                    + (2 * symetricalMatrix[i, j])
                    + (2 * w * antiSymetricalMatrix[i, j]);
            }
        }

        Matrix4x4 final = solidTransform;

        final.M11 = matrix4x4[0, 0];
        final.M12 = matrix4x4[0, 1];
        final.M13 = matrix4x4[0, 2];

        final.M21 = matrix4x4[1, 0];
        final.M22 = matrix4x4[1, 1];
        final.M23 = matrix4x4[1, 2];

        final.M31 = matrix4x4[2, 0];
        final.M32 = matrix4x4[2, 1];
        final.M33 = matrix4x4[2, 2];

        // position
        final.M41 = newPosition.X;
        final.M42 = newPosition.Y;
        final.M43 = newPosition.Z;

        return final;
    }

введите сюда описание изображения введите сюда описание изображения

Цель сделать конверт карты из игры NFS Underground в блендер, данная формула поможет это сделать для всех частей игр.


Ответы (1 шт):

Автор решения: HolyBlackCat

Вы перемудрили. Это решается умножением на одну матрицу 4х4, которая пишется на глазок.

Пусть X1, Y1, Z1 - исходные направления осей, а X2, Y2, Z2 - желаемые направления. Путем внимательного рассматривания ваших картинок, выражаете первые через вторые:

  • X1 = X2 (вправо)
  • Y1 = Z2 (вверх)
  • Z1 = -Y2 (на себя)

Теперь подставляем X2=[1,0,0], Y2=[0,1,0], Z2=[0,0,1]. Получаем:

  • X1 = [1,0,0]
  • Y1 = [0,0,1]
  • Z1 = [0,-1,0]

Теперь пишем те же самые числа не в строчку, а в столбик (X1, Y1, Z1):

X1= Y1= Z1=
 1   0   0
 0   0  -1
 0   1   0

Дополняем до размера 4х4 добавлением нулей справа и снизу, и единички в правом-нижнем углу:

 1   0   0   0
 0   0  -1   0
 0   1   0   0
 0   0   0   1

Теперь умножаем входные матрицы на эту (слева эта матрица, справа входная).

→ Ссылка