При представлении математической матрицы вращения выполняются следующим образом:
http://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
Rx(θ) = 1 0 0
0 cos θ -sin θ
0 sin θ cos θ
Ry(θ) = cos θ 0 sin θ
0 1 0
-sin θ 0 cos θ
Rz(θ) = cos θ -sin θ 0
sin θ cos θ 0
0 0 1
Однако я обнаружил, что Direct3D использует транспонирование этих матриц вращения.
В моем приложении у меня есть общий класс Matrix, который использует стандартные математические представления вращения. Простое вращение вокруг оси 1 позволяет легко преобразовать его в матрицу Direct3D, так как вы можете просто выполнить транспонирование. Однако, если вы вращаетесь вокруг x, y, а затем z, вы не можете просто получить транспонированную матрицу.
У меня вопрос, как я могу преобразовать математическую матрицу в матрицу Direct3D?
Вот пример:
Матричная матрица;
matrix.RotateX (1.0f);
matrix.RotateY (1.0f);
matrix.RotateZ (1.0f);
Математическая матрица =
m_11 0,29192656 float
m_12 -0,45464867 float
m_13 0.84147096 float
m_14 0,00000000 float
m_21 0,83722234 float
m_22 -0,30389664 float
m_23 -0,45464867 float
m_24 0,00000000 плавать
m_31 0,46242565 плавать
m_32 0,83722234 float
m_33 0.29192656 float
m_34 0,00000000 float
m_41 0,00000000 float
m_42 0,00000000 float
m_43 0,00000000 float
m_44 1.0000000 float
матрица Direct3D =
_11 0,29192656 float
_12 0,45464867 float
_13 -0,84147096 float
_14 0,00000000 float
_21 -0.072075009 float
_22 0,88774973 плавать
_23 0,45464867 float
_24 0,00000000 float
_31 0,95372111 float
_32 -0.072075009 float
_33 0,29192656 float
_34 0,00000000 float
_41 0,00000000 float
_42 0,00000000 float
_43 0,00000000 float
_44 1.0000000 float
Редактировать : Вот несколько примеров отдельных вращений.
Вращение оси X на 1 радиан
Мой класс матрицы:
1.0000000 0.00000000 0.00000000 0.00000000
0.00000000 0.54030228 -0.84147096 0.00000000
0.00000000 0.84147096 0.54030228 0.00000000
0.00000000 0.00000000 0.00000000 1.0000000
Direct3D:
1.0000000 0.00000000 0.00000000 0.00000000
0.00000000 0.54030228 0.84147096 0.00000000
0.00000000 -0.84147096 0.54030228 0.00000000
0.00000000 0.00000000 0.00000000 1.0000000
Как вы можете видеть, матрица Direct3D - это в точности транспонирование моего класса матрицы (мой класс дает те же результаты, что и примеры, приведенные в Википедии в верхней части этого вопроса).