D3DXMatrixTranslation(&matMoveRight27, 27.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveLeft27, –27.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveRight9, 9.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveLeft9, –9.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveDown15, 0.0, –15.0, 0.0);
D3DXMatrixTranslation(&matMoveUp15, 0.0, 15.0, 0.0);
//Create a scale transformation
D3DXMatrixScaling(&matScaleUp1p5, 1.5, 1.5, 1.5);
Now that we have our matrices, we need to multiply them together to create one transformation matrix for each cube. We will use the DirectX function D3DXMatrixMultiply to do this. Cube 1 is easy, we want it to rotate around the x axis. Becuase it's center is on the x axis, all we need to do is use the x axis rotation matrix, that means that we don't need to multiply any matrices together because we already have this matrix defined. Cubes 2-5 are a bit different, they are not on the axis that we want to rotate them around. So, what we need to do is move them on to their rotation axis, rotate them, then move them back to their starting positions. If we just rotate them without moving them, the cubes will just swing around the axis rather than staying in the same position and rotating. Fig 5.6 shows a cube swinging around the y axis. Fig 5.7 shows a cube being moved to the origin, rotated, them moved back.
Fig 5.6
Fig 5.7
We have the matrix for cube 1, so now we need to create a matrix for cubes 2, 3, 4 and 5. The follow code snippet shows how to do this. Notice the order in which the matrices are multiplied together. If you change this order, you will get a different result.
//Combine the matrices to form 4 transformation matrices
D3DXMatrixMultiply(&matTransformation2, &matMoveRight9, &matRotationY);
D3DXMatrixMultiply(&matTransformation2, &matTransformation2, &matMoveLeft9);
D3DXMatrixMultiply(&matTransformation3, &matMoveLeft9, &matRotationZ);
D3DXMatrixMultiply(&matTransformation3, &matTransformation3, &matMoveRight9);
D3DXMatrixMultiply(&matTransformation4, &matMoveLeft27, &matRotationUser1);
D3DXMatrixMultiply(&matTransformation4, &matTransformation4, &matMoveRight27);
D3DXMatrixMultiply(&matTransformation5, &matMoveDown15, &matRotationY);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matRotationX);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matRotationZ);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matMoveUp15);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matScaleUp1p5);
Step 4: Applying the Transformations
Now that we have a transformation matrix for each cube, we need to apply them and then render the cubes. To apply a transformation matix, we use the SetTransform method. When you call SetTransform with a transformation matrix, all further objects that are rendered will have that matrix appied to them. So, for each cube we need to call SetTransform with that cubes transformation matrix, and then render that cube. The code snippet below shows this:
//Apply the transformations and render our objects
m_pD3DDevice->SetTransform(D3DTS_WORLD, &matRotationX);
m_pCube1->Render();
m_pD3DDevice->SetTransform(D3DTS_WORLD, &matTransformation2);
m_pCube2->Render();
m_pD3DDevice->SetTransform(D3DTS_WORLD, &matTransformation3);
m_pCube3->Render();
m_pD3DDevice->SetTransform(D3DTS_WORLD, &matTransformation4);
m_pCube4->Render();
m_pD3DDevice->SetTransform(D3DTS_WORLD, &matTransformation5);
m_pCube5->Render();
The full new render method for this tutorial is shown below. One thing to note is that I have moved the code from SetupPerspective() into the SetupCamera() function (just trying to keep the code simple).
void CGame::Render() {
D3DXMATRIX matRotationX, matRotationY, matRotationZ, matRotationUser1;
D3DXMATRIX matMoveRight27, matMoveLeft27, matMoveRight9, matMoveLeft9, matMoveDown15, matMoveUp15;
D3DXMATRIX matTransformation2, matTransformation3, matTransformation4, matTransformation5;
D3DXMATRIX matScaleUp1p5;
if (m_pD3DDevice == NULL) {
return;
}
//Clear the back buffer and depth buffer
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//Begin the scene
m_pD3DDevice->BeginScene();
//Setup camera and perspective
SetupCamera();
//Create the rotation transformation matrices around the x, y and z axis
D3DXMatrixRotationX(&matRotationX, timeGetTime()/400.0f);
D3DXMatrixRotationY(&matRotationY, timeGetTime()/400.0f);
D3DXMatrixRotationZ(&matRotationZ, timeGetTime()/400.0f);
//Create the rotation transformation matrices around our user defined axis
D3DXMatrixRotationAxis(&matRotationUser1, &D3DXVECTOR3(1.0f, 1.0f, 0.0f), timeGetTime()/400.0f);
//Create the translation (move) matrices
D3DXMatrixTranslation(&matMoveRight27, 27.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveLeft27, –27.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveRight9, 9.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveLeft9, –9.0, 0.0, 0.0);
D3DXMatrixTranslation(&matMoveDown15, 0.0, –15.0, 0.0);
D3DXMatrixTranslation(&matMoveUp15, 0.0, 15.0, 0.0);
//Create a scale transformation
D3DXMatrixScaling(&matScaleUp1p5, 1.5, 1.5, 1.5);
//Combine the matrices to form 4 transformation matrices
D3DXMatrixMultiply(&matTransformation2, &matMoveRight9, &matRotationY);
D3DXMatrixMultiply(&matTransformation2, &matTransformation2, &matMoveLeft9);
D3DXMatrixMultiply(&matTransformation3, &matMoveLeft9, &matRotationZ);
D3DXMatrixMultiply(&matTransformation3, &matTransformation3, &matMoveRight9);
D3DXMatrixMultiply(&matTransformation4, &matMoveLeft27, &matRotationUser1);
D3DXMatrixMultiply(&matTransformation4, &matTransformation4, &matMoveRight27);
D3DXMatrixMultiply(&matTransformation5, &matMoveDown15, &matRotationY);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matRotationX);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matRotationZ);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matMoveUp15);
D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matScaleUp1p5);