Jump to content
  • Advertisement
Sign in to follow this  

Order of transformation confuse

This topic is 903 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Im confuse, when you said scale rotate and translate does that mean like this


model = glm::translate(model, glm::vec3(1.0f)); 
model = glm::rotate(model, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.5f)); 

or like this

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.5f)); 
model = glm::rotate(model, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::translate(model, glm::vec3(1.0f));

if my shader is like this

gl_Position = projection * view * model * vec4(position, 1.0f);

Opengl reads in reverse order so ,Is it the first one or the second one? just want to clarify this as the two output different results and I dont know which one is right and which one is wrong.


Share this post

Link to post
Share on other sites

The matrix product is associative. That means you can put (decently) pairs of parentheses around the individual term at your desire. Now, when you choose parentheses so that you start with the product including the vector, e.g. like so for column vectors (i.e. the vector is on the right and the matrix on the left, typical for OpenGL)

    M1 * M2 * ( M3 * v )

and continue to the outer terms, like so

   = M1 * ( M2 * ( M3 * v ) )

then the parentheses tell you about the locality of the transformation. The wording for this is often "first apply M3, then M2, and then M1", although that wording is imprecise.
Notice that this works for row vectors as well
   ( ( v' * M3' ) * M2' )* M1'
So, if you want to apply scaling to the model, rotate the scaled model, and translate the rotated/scaled model,** and you use column vectors, then the formula with parentheses looks like
    T * ( R * ( S * v ) )
what, obviously, corresponds to your 2nd variant of code.
**Notice please that I've chosen a wording here that is not as blurry as "first … then …" ;)

Opengl reads in reverse order ...

As said above, "order" without further context is misleading here. For example, you can calculate

    ( ( M1 * M2 ) * M3 ) * v

as well and get the same result.
Edited by haegarr

Share this post

Link to post
Share on other sites

Hi, Thanks,


But its weird really. I tried both of them and it seems that the second variant of code recognize the z-axis as the x-axis with the following vertices

std::vector<glm::vec3> wallPosition{
glm::vec3(2.0f, 0.0f, 0.0f),
glm::vec3(-2.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, -2.0f),
glm::vec3(0.0f, 0.0f, 2.0f)

The 1st variant of code



and the 2nd variant of code




Didnt change anything aside from the order of the transformation.

Share this post

Link to post
Share on other sites

You could draw out both options on paper, where you do the different orders of actions.

This helps in illustrating whap happens (SRT, TSR etc.).


Here's a snippet of my 'old' engine code:

void CD3dmeshInst::CreateWorldMatrix()
	D3DXMatrixTranslation(&mMatTranslate, mWorldPos.x, mWorldPos.y, mWorldPos.z);
	D3DXMatrixRotationX(&mMatRotateX, D3DXToRadian(mRot.x));
	D3DXMatrixRotationY(&mMatRotateY, D3DXToRadian(mRot.y));
	D3DXMatrixRotationZ(&mMatRotateZ, D3DXToRadian(mRot.z));
	D3DXMatrixScaling(&mMatScale, mScale, mScale, mScale);

	mMatWorld = (D3DXMATRIXA16)(mMatScale*mMatRotateX*mMatRotateY*mMatRotateZ*mMatTranslate);

	D3DXMatrixInverse(&mMatWorldInv, NULL, &mMatWorld);
	D3DXMatrixTranspose(&mMatWorldInvTransp, &mMatWorldInv);

I believe it shouldn't matter if you're using OpenGL or Direct3D (not 100% sure though, if not, someone will correct me :))

Share this post

Link to post
Share on other sites
A) Something is wrong with that mesh.
B) Desk check - do the math on paper to determine your desired matrix, then inspect the matrices being generated.
C) If you want to see which order is giving the correct transform you're going to need another object around the place to compare visually. For a simple box like this you're going to get (should get, anyway) a box from either transform.

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!