Public Group

# Order of transformation confuse

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

## 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 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 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 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);
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 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.

• ### What is your GameDev Story?

In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

• 10
• 11
• 13
• 9
• 9
• ### Forum Statistics

• Total Topics
634082
• Total Posts
3015396
×