Question

I am creating a 3D scene and I have just inserted a cube object into it. It is rendered fine at the origin but when I try to rotate it and then translate it I get a huge deformed cube. Here is the problem area in my code:

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);

I have discovered that it's the cubeMOVE part of the transpose that is giving me the problem but I have no idea why.

This rotates the cube properly:

D3DXMatrixTranspose(&worldMatrix, &cubeROT);

This translates the cube properly:

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

But this creates the deformed mesh:

D3DXMatrixTranspose(&worldMatrix, &cubeMOVE);

I'm quite new to DirectX so any help would be very much appreciated.

Was it helpful?

Solution

I don't think transpose does what you think it does. To combine transformation matrices, you just multiply them -- no need to transpose. I guess it should be simply:

worldMatrix = cubeROT * cubeMOVE;

Edit

The reason "transpose" seems to work for rotation but not translation, is that transpose flips the non-diagonal parts of the matrix. But for an axis-rotation matrix, that leaves the matrix nearly unchanged. (It does change a couple of signs, but that would only affect the direction of the rotation.) For a translation matrix, applying a transpose would completely deform it -- hence the result you see.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top