public static void ConstructTransformFromMatrixWithDesiredScale(FMatrix aMatrix, FMatrix bMatrix, FVector desiredScale, ref FTransform outTransform) { // the goal of using M is to get the correct orientation // but for translation, we still need scale var m = aMatrix * bMatrix; m.RemoveScaling(); // apply negative scale back to axes var signedScale = desiredScale.GetSignVector(); m.SetAxis(0, signedScale.X * m.GetScaledAxis(EAxis.X)); m.SetAxis(1, signedScale.Y * m.GetScaledAxis(EAxis.Y)); m.SetAxis(2, signedScale.Z * m.GetScaledAxis(EAxis.Z)); // @note: if you have negative with 0 scale, this will return rotation that is identity // since matrix loses that axes var rotation = new FQuat(m); rotation.Normalize(); // set values back to output outTransform.Scale3D = desiredScale; outTransform.Rotation = rotation; // technically I could calculate this using FTransform but then it does more quat multiplication // instead of using Scale in matrix multiplication // it's a question of between RemoveScaling vs using FTransform to move translation outTransform.Translation = m.GetOrigin(); }
public void RemoveScaling(float tolerance = UnrealMath.SmallNumber) { Scale3D = new FVector(1.0f, 1.0f, 1.0f); Rotation.Normalize(); }