1

我正在创建一个 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 很陌生,所以非常感谢任何帮助。

4

1 回答 1

1

我不认为transpose你认为它会做。要组合变换矩阵,只需将它们相乘——无需转置。我想应该很简单:

worldMatrix = cubeROT * cubeMOVE;

编辑

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

于 2013-12-17T17:13:59.693 回答