Problem with Translation and Rotation in DirectX
When I rotate the tank and change the Z axis to move it forward, it doesn't move FORWARD, it move in another position.
The code is similar to the following:
D3DXMATRIX matRot;
D3DXMATRIX matCenter;
D3DXMATRIX matScale;
D3DXMatrixTranslation(&matCenter, 0.0f, 0.0f, 0.0f); // *** Rotation point ***
D3DXMatrixTranslation(&matPos, tankPosX, -240.0f, tankPosZ);
D3DXMatrixRotationYawPitchRoll(&matRot, D3DXToRadian(tankRotX), D3DXToRadian(0.0f), D3DXToRadian(0.0f));
D3DXMatrixScaling(&matScale, 1.0f, 1.0f, 1.0f);
d3ddev->SetTransform(D3DTS_WORLD, &(matScale * matCenter * matRot * matPos));
[background=rgb(250, 251, 252)]D3DXMATRIX matRot;[/background]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMATRIX matCenter;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMATRIX matScale;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMATRIX [/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]posZUnitVec;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXVECTOR3 vecTankForward;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMatrixRotationYawPitchRoll(&[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]matRot[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)], D3DXToRadian(tankRotX), D3DXToRadian(0.0f), D3DXToRadian(0.0f));[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMatrixTranslation(&posZUnitVec, 0.0f, 0.0f, 1.0f); // matrix holding position of vector pointing to positive z[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMATRIX m = posZUinitVec * matRot;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]vecTankForward = D3DXVECTOR3([/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]m[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]._41,[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]m[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]._42,[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]m[/background][/font][color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]._43); // Get vector from the matrix[/background][/font]
// move the tank forward (speed is the speed you want to move the tank every time this function is called)
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]tankPosX += speed * vecTankForward.x; [/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]tankPosZ += speed * vecTankForward.z;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMatrixTranslation(&matCenter, 0.0f, 0.0f, 0.0f); // *** Rotation point ***[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMatrixTranslation(&matPos, tankPosX, -240.0f, tankPosZ);[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]D3DXMatrixScaling(&matScale, 1.0f, 1.0f, 1.0f);[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]d3ddev->SetTransform(D3DTS_WORLD, &(matScale * matCenter * matRot * matPos)); [/background][/font]
[background=rgb(250, 251, 252)]
tankPosX += speed * vecTankForward.x;[/background]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]
tankPosY += speed * vecTankForward.y;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]
tankPosZ += speed * vecTankForward.z;[/background][/font]
[color=#282828][font=helvetica, arial, verdana, tahoma, sans-serif]
[background=rgb(250, 251, 252)]
D3DXMatrixTranslation(&matPos, tankPosX,
tankPosY
, tankPosZ);[/background][/font]
So I tried to check for rotation on Yaw before changing the position on Y axis:
tankPosX += speed * vecTankForward.x;
if (rotYaw != 1.0f)
tankPosY += speed * vecTankForward.y;
tankPosZ += speed * vecTankForward.z;
D3DXMatrixTranslation(&matPos, tankPosX, tankPosY, tankPosZ);
However, I am not very sure if this will work fine on any mesh, airstrike, tank, human, helicopter, etc...