Skip to main content
GameDev.net gamedev.net
🔒 Locked

D3DXMatrix functions do nothing

Started by Lyev Jun 5, 2012 at 11:58 AM 4 replies 2k views
Original Post
Lyev
Lyev
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]);
Nik02
Nik02
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
Lyev
Lyev
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);
Nik02
Nik02
Yea, but you don't need the first identity step. You can use the translation as the baseline.
Niko Suni
Nik02
Nik02
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
Lyev
Lyev
Okay, thanks for your help!

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.