FTransforms with non-uniform scaling do not compose

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.

Related issue to do with FTransform’s broken compositionality: Parent scale does not account for child rotation