DirectX11 - 矩阵转换

时间:2013-12-17 17:00:22

标签: translation directx-11 transpose d3dx

我正在创建一个3D场景,我刚刚插入了一个立方体对象。它在原点处被渲染得很好,但是当我尝试旋转它然后翻译它时,我得到了一个巨大的变形立方体。这是我的代码中的问题区域:

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很陌生,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为transpose不符合你的想法。要组合转换矩阵,您只需将它们相乘 - 无需转置。我想这应该是简单的:

worldMatrix = cubeROT * cubeMOVE;

修改

“转置”似乎适用于旋转而不是平移,是转置翻转矩阵的非对角线部分。但是对于axis-rotation matrix,这使得矩阵几乎不变。 (它确实改变了几个符号,但这只会影响旋转的方向。)对于平移矩阵,应用转置会使其完全变形 - 因此你看到了结果。