What is the correct order to multiply scale, rotation and translation matrices for a proper world matrix?
Assume DirectX as the platform, if that is important. (Pretty sure it isn't)
Assuming I have a proper scale, rotation and translation matrix, in what order do I multiply them to result in a proper world matrix and why?
By "proper", I mean "I could throw them straight into DirectX and get the most commonly-used 3D frame."
Here is an explanation of "rotate then translate" (spinning) vs "translate then rotate" (orbiting)
Usually it is scale, then rotation and lastly translation. With matrix denotation (i.e. T for translation matrix, R for the rotation matrix and S for the scaling matrix) that would be:
T * R * S
However, if you want to rotate an object around a certain point, then it is scale, point translation, rotation and lastly object translation.
Why: First you want to scale the object so that the translations work properly. Then you rotate the axes so the translation takes place on the adjusted axes. Finally you translate the object to it's position.
In OpenGL you can use gluLookAt to get a full camera transformation in one call. There is likely a similar call for DirectX.
And remember, if you want to transform around the centre, then you first have to translate to offset the centre to be on the origin, then do as user392858 has stated, then translate it back again away from the origin by the same amount. Generally though, this is only necessary in 2D, where you have some sprite that has it's top left at the origin.
Great. :) Now I just have to figure out why my model is now inverting in a horizontal view and needs the dot product on the directional light reversed in a vertical view. It didn't used to do that, then I fixed some math...
Just let it be noted, I *Hate* mis-placed negative signs. Anyway, thanks, and you can consider this question done with. :)
Just wondering, it's fine to swap around scale and rotation, right? Since rotation is independent of the scale of the object.. just making sure.. but anyway it seems it's better to do the scaling first, as it stays consistent with the second version.
@Thomas: That would actually apply a world scale, not a local scale. That is, if your object had a z-scale of 2, then that scale would always be along the world z-axis, not the objects' local z-axis. Although I could be wrong, but I do know a bit more about matrices than I did then. :)
Found the notation confusing. Since all these elemental transforms are matrix operations, they have to be applied in right to left order: T * R * S
@Matthias As far as I know, that depends how you then multiply by the vector that you want to transform. If you multiply M*v then yes, answer has reversed order.