2013-12-17 3 views
1

Я создаю 3D-сцену, и я только что вставил в нее объект куба. Это делается отлично в начале координат, но когда я пытаюсь повернуть его, а затем перевести его, я получаю огромный деформированный куб. Вот область проблема в моем коде:DirectX11 - Matrix Translation

D3DXMATRIX cubeROT, cubeMOVE; 

D3DXMatrixRotationY(&cubeROT, D3DXToRadian(45.0f)); 
D3DXMatrixTranslation(&cubeMOVE, 10.0f, 2.0f, 1.0f); 

D3DXMatrixTranspose(&worldMatrix, &(cubeROT * cubeMOVE)); 

// Put the model vertex and index buffers on the graphics pipeline to prepare them for drawing. 
m_Model->Render(m_Direct3D->GetDeviceContext()); 

// Render the model using the light shader. 
result = m_LightShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, 
        m_Model->GetTexture(), m_Light->GetDirection(), m_Light->GetDiffuseColor()); 


// Reset the world matrix. 
m_Direct3D->GetWorldMatrix(worldMatrix); 

Я обнаружил, что это cubeMOVE часть транспонированной, которая дает мне эту проблему, но я понятия не имею, почему.

Это вращает куб правильно:

D3DXMatrixTranspose(&worldMatrix, &cubeROT); 

Это переводит куб правильно:

D3DXMatrixTranslation(&worldMatrix, 10.0f, 2.0f, 1.0f); 

Но это создает деформированную сетку:

D3DXMatrixTranspose(&worldMatrix, &cubeMOVE); 

Я совершенно новой для DirectX, поэтому любая помощь была бы очень оценена.

ответ

0

не думаю transpose делает, что вы думаете. Чтобы комбинировать матрицы преобразования, вы просто их умножаете - нет необходимости транспонировать. Я предполагаю, что это должно быть просто:

worldMatrix = cubeROT * cubeMOVE; 

Редактировать

Причины «транспонировать», кажется, работает для вращения, но не перевод, является то, что транспонированным переворачивает Недиагональные части матрицы. Но для axis-rotation matrix, что оставляет матрицу почти неизменной. (Он меняет пару знаков, но это влияет только на направление вращения.) Для матрицы перевода применение транспозиции полностью исказило бы ее - следовательно, результат, который вы видите.

+1

Совершенно верно. Я использовал D3DXMatrixTranspose вместо D3DXMatrixMultiply, спасибо! –