FTransform Composition is very, very broken, and does not obey the described behavior: “A * B will yield a transform that logically first applies A then B to any subsequent transformation”
It is expected that, given a few transforms, applying them sequentially to a location is the same as composing them and transforming a location with the result. This is unfortunately not the case with UE’s transform system if any of the transforms have non-uniform scaling.
Example 1: Contrary to expectation, (Rotate . Scale . Rotate)(x) is not the same as Rotate(Scale(Rotate(x))) - the results differ by (9.841, 1.114, 6.424):
Example 2: As expected, (Rotate . Rotate and Shift . Rotate)(x) is the same as Rotate(Rotate and Shift(Rotate(x)))
Unfortunately, this seems to be a deficiency in how affine transformations are represented in the engine, and, short of using transformation matrices everywhere, there is probably no easy fix.