При представлении математической матрицы, повороты выполняются следующим образом:Как преобразовать математическую матрицу в матрицу Direct3D?
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 поплавок
m_12 -0,45464867 поплавок
M_13 0,84147096 поплавок
m_14 0,00000000 поплавок
m_21 0,83722234 поплавок
m_22 -0,30389664 поплавок
m_23 -0,45464867 поплавок
m_24 0,00000000 поплавок
m_31 0.46242565 float
m_32 0.83722234 float
m_33 0,29192656 поплавок
m_34 0,00000000 поплавок
m_41 0,00000000 поплавок
m_42 0,00000000 поплавок
m_43 0,00000000 поплавок
m_44 1,0000000 поплавокDirect3D матрица =
_11 0,29192656 поплавок
_12 0,45464867 поплавок
_13 -0.84147096 float
_14 0.00000000 float
_21 -0,072075009 поплавок
_22 0,88774973 поплавок
_23 0,45464867 поплавок
_24 0,00000000 поплавок
_31 0,95372111 поплавок
_32 -0,072075009 поплавок
_33 0,29192656 поплавок
_34 0,00000000 поплавок
_41 0,00000000 поплавок
_42 0,00000000 поплавок
_43 0,00000000 поплавок
_44 1.0000000 поплавок
Edit: Вот некоторые примеры индивидуальных вращений.
вращение по оси 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 в точности транспонирование моего матричного класса (мой класс дает те же результаты, что и примеры, приведенные в Википедии на t op этого вопроса).
Вы знаете, что DirectX предоставляет функции для выполнения матриц вращения для вас, и в общем случае вы захотите использовать quternians (sp?) Для вращения, а не для матриц, поскольку вы избегаете блокировки карданных колес. – thecoshman
Использование кватернионов не подразумевает решительного решения кардинальной блокировки проблемы и использование матриц не обязательно означает, что у вас проблемы с блокировкой карданного вала - это касается действий, которые вы делаете на них. – CiscoIPPhone
Да, я понимаю это, но я пишу общие классы, которые можно использовать с несколькими рендерингами. Благодарю. –