D3DXMatrix functions do nothing

Started by
4 comments, last by Lyev 11 years, 10 months ago
When I call these functions the matrix, v_mat_world, remains unchanged, please help :S


float origin[3] = {1, 0, 0}, angles[3] = {D3DXToRadian(180), 0, 0}, scale[3] = {1, 1, 1};

D3DXMatrixIdentity (&v_mat_world);
D3DXMatrixTranslation (&v_mat_world, origin[0], origin[1], origin[2]);
D3DXMatrixRotationX (&v_mat_world, angles[0]);
D3DXMatrixRotationY (&v_mat_world, angles[1]);
D3DXMatrixRotationZ (&v_mat_world, angles[2]);
D3DXMatrixScaling (&v_mat_world, scale[0], scale[1], scale[2]);
Advertisement
You overwrite the matrix with each function call. The last operation sets the matrix to identity since the scaling factors happen to be 1.

In order to combine the effects of the transformations, you have to multiply the matrices together by your own code.

Niko Suni

So something like this?

D3DXMATRIX trans, rotx, roty, rotz, scaling;
D3DXMatrixIdentity (&v_mat_world);
D3DXMatrixTranslation (&trans, origin[0], origin[1], origin[2]);
D3DXMatrixRotationX (&rotx, angles[0]);
D3DXMatrixRotationY (&roty, angles[1]);
D3DXMatrixRotationZ (&rotz, angles[2]);
D3DXMatrixScaling (&scaling, scale[0], scale[1], scale[2]);

D3DXMatrixMultiply (&v_mat_world, &v_mat_world, &rotx);
D3DXMatrixMultiply (&v_mat_world, &v_mat_world, &roty);
D3DXMatrixMultiply (&v_mat_world, &v_mat_world, &rotz);
D3DXMatrixMultiply (&v_mat_world, &v_mat_world, &scaling);
D3DXMatrixMultiply (&v_mat_world, &v_mat_world, &trans);
Yea, but you don't need the first identity step. You can use the translation as the baseline.

Niko Suni

In addition, if you are using C++, the * operator of D3DXMATRIX is overloaded to multiply matrices, so you don't need to explicitly use D3DXMatrixMultiply.

Niko Suni

Okay, thanks for your help! :)

This topic is closed to new replies.

Advertisement