Смена осей координат
у меня есть матрица 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 шт):
Вы перемудрили. Это решается умножением на одну матрицу 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
Теперь умножаем входные матрицы на эту (слева эта матрица, справа входная).


