Not really pointing out an error in the first part, just explaining that what you originally wanted to do - concatenate sequence of SRT into a single SRT where S scales using a vector that represents scaling on different axes, is (technically speaking) impossible - you indeed need a full blown matrix here, or if you want to optimize a tiny bit, 3x3 matrix and translation. That's because sequence of R S R can produce scaling along the diagonal, which you can not represent with one S R T . (I am assuming matrices apply in left to right, i.e. directx order)Hi Dmytry,

I am not sure I follow, what do you mean? in the end what my SRT operations do is a simplified matrix multiplication, so if you take S,R,and T as matrices with scale, rotation and translation respectively, and I as identity the operation you describe would be something along these lines:

( I * R * I ) * (S * I * I) * ( I * *R * I ),

which is the same as RSR, wouldn't the scale vector (diagonal) on the second matrix be doing the scale on world axes rather than object axes as well?

I think I see where you're going, but I haven't had time to think more about it.

The second part of your post, I am not sure if you're pointing out a (another?) problem or providing me with an optimization

Thank you for your comments!

edit:However if you are certain you only use non uniform scaling as the first transformation applied, then it can work. If U is uniform scaling and you only have S R T U R T U R T U R T .... sequence, then you're in the clear.

Second is indeed providing with an optimization. In my software I have a class that does rotation using quaternion and translation using a vector, it works pretty much same from outside as a matrix. The reason I'm using that is not so much optimization as convenience when doing physics or especially when interpolating rotations between frames (which I do because I run physics at constant framerate). In your case I'd probably just convert to matrices then multiply those together, I'd probably use 3x3 matrices with translation rather than full blown 4x4 , basically, you assume the right column (or bottom row, depending to convention) is always 0 0 0 1 .