2010-11-07 3 views
2

При представлении математической матрицы, повороты выполняются следующим образом:Как преобразовать математическую матрицу в матрицу 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 этого вопроса).

+1

Вы знаете, что DirectX предоставляет функции для выполнения матриц вращения для вас, и в общем случае вы захотите использовать quternians (sp?) Для вращения, а не для матриц, поскольку вы избегаете блокировки карданных колес. – thecoshman

+0

Использование кватернионов не подразумевает решительного решения кардинальной блокировки проблемы и использование матриц не обязательно означает, что у вас проблемы с блокировкой карданного вала - это касается действий, которые вы делаете на них. – CiscoIPPhone

+0

Да, я понимаю это, но я пишу общие классы, которые можно использовать с несколькими рендерингами. Благодарю. –

ответ

4

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

Тем не менее, оба подхода полностью одинаково важны математике! Если вы запутались Direct3D, начните думать в терминах записи векторов строк слева от матриц, а не в переносе матриц.

Вы не первый человек, которого следует спутать this (см. also).

+0

Привет, спасибо за это. Можете ли вы объяснить далее комментарий «начать думать в терминах написания векторов строк слева от матриц»? –

+0

Спасибо за эти ссылки, указывает ли это, что Direct3D - это векторы строк, а примеры из Википедии были написаны векторами столбцов? –

+1

Да, если вы посмотрите на документы Direct3D на преобразованиях, http://msdn.microsoft.com/en-us/library/bb206269(VS.85).aspx, он явно использует векторы строк слева от матриц, тогда как OpenGL (например, статьи в Википедии) используют столбчатые векторы; см. http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xml. В долгосрочной перспективе лучше понять разницу и работать в системах «по назначению». – timday

1

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

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

+0

Вращения выполняются в том же порядке. Как я уже упоминал в вопросе, если вы делаете RotateX на матрице Direct3D, результатом является транспонирование «математической» матрицы. –

+0

Я говорю, что если единственная разница в том, где цифры читаются и записываются, они всегда должны быть транспонированными. – CiscoIPPhone

+3

Я думаю, что разница может быть передачей Direct3D. – CiscoIPPhone

1

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

+0

Вы говорите, что материал вращается в Direct3D наоборот? – CiscoIPPhone

+1

Да, это было бы следствием левосторонней системы координат. Математика неизменно следует правильному соглашению. – timday

Смежные вопросы