我正在创建一个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很陌生,所以非常感谢任何帮助。
答案 0 :(得分:1)
我认为transpose
不符合你的想法。要组合转换矩阵,您只需将它们相乘 - 无需转置。我想这应该是简单的:
worldMatrix = cubeROT * cubeMOVE;
修改强>
“转置”似乎适用于旋转而不是平移,是转置翻转矩阵的非对角线部分。但是对于axis-rotation matrix,这使得矩阵几乎不变。 (它确实改变了几个符号,但这只会影响旋转的方向。)对于平移矩阵,应用转置会使其完全变形 - 因此你看到了结果。