Как преобразовать математическую матрицу в матрицу Direct3D? - PullRequest
2 голосов
/ 07 ноября 2010

При представлении математической матрицы вращения выполняются следующим образом:

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 - это в точности транспонирование моего класса матрицы (мой класс дает те же результаты, что и примеры, приведенные в Википедии в верхней части этого вопроса).

Ответы [ 3 ]

4 голосов
/ 07 ноября 2010

Я всегда прослеживал эту путаницу до конца 80-х годов.Насколько я помню, в то время было две особенно влиятельные книги по графике.Один из них записал векторы как векторы строк слева от матриц;книга была довольно аппаратно ориентирована - концептуально вы думали о векторах как о потоках слева направо через конвейер матриц преобразования.Rendermorphics (которая позже была подхвачена Microsoft, чтобы стать Direct3D) пошла по этому пути.В другой книге векторы записывались в виде векторов-столбцов справа от матриц, что и делает OpenGL (и я думаю, что большинство математиков естественным образом склоняются к этому, хотя я встречал исключения).абсолютно одинаково действительны математика!Если вы запутались в Direct3D, начните думать с точки зрения записи векторов строк слева от матриц, а не с точки зрения транспонирования матриц.

Вы не первый человек, которого смущает это (см. также ).

1 голос
/ 07 ноября 2010

Учитывая, что единственные члены вне прямой диагонали имеют форму ± sin (θ) и что sin (-θ) = - sin (θ) , но cos (-θ) = cos (θ) , связь между Direct3D и математикой из Википедии также может рассматриваться как противоположная интерпретация направления угла.

1 голос
/ 07 ноября 2010

Матричные классы DirectX являются реализацией математической матрицы.

Рукопожатие проявляется только при выполнении таких операций, как вращение. Транспонирование должно дать вам результат, который вы ищете, если одни и те же операции выполняются как для матрицы DIrectX, так и для вашей «математической матрицы». Я предполагаю, что есть различия в реализации поворота, или порядок выполнения поворотов отличается.

...