public void Trivial()
        {
            // Convention is UnitZ forward, UnitX right, UnitY up in local space.
            var mat = FMatrix4x4.RotationLookAtRH(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);

            AssertAlike(mat.Transform(Vector3.UnitZ), Vector3.UnitZ);
            AssertAlike(mat.Transform(Vector3.UnitX), Vector3.UnitX);
            AssertAlike(mat.Transform(Vector3.UnitY), Vector3.UnitY);
        }
        public void RotationLookAt() => Trials(1000, r => {
            var a = RandomVector3(r);
            var b = RandomVector3(r);
            var c = RandomVector3(r);

            // Rotation lookat RH is lookat LH with flipped Z
            var la = Matrix4x4.CreateLookAt(b, a, c);

            // And additionally, no translation
            la.M41 = la.M42 = la.M43 = 0.0f;

            // LookAt is meant for camera. Does the opposite motion of what we want,
            // so invert (orthonormal matrix, so transpose equivalent)
            la = Matrix4x4.Transpose(la);

            AssertAlike(FMatrix4x4.RotationLookAtRH(a, b, c), la);
        });
        public void Turn111()
        {
            // Convention is UnitZ forward, UnitX right, UnitY up in local space.
            var mat = FMatrix4x4.RotationLookAtRH(Vector3.Zero, Vector3.One, Vector3.UnitY);

            output.WriteLine(mat.ToStringNewline());
            AssertAlike(mat.Transform(Vector3.UnitZ), Vec3(1, 1, 1).Normalize());

            output.WriteLine(mat.Transform(Vector3.UnitY).ToString());
            Assert.True(mat.Transform(Vector3.UnitY).Dot(Vector3.UnitX) < 0);
            Assert.True(mat.Transform(Vector3.UnitY).Dot(Vector3.UnitY) > 0);
            Assert.True(mat.Transform(Vector3.UnitY).Dot(Vector3.UnitZ) < 0);

            output.WriteLine(mat.Transform(Vector3.UnitX).ToString());
            Assert.True(mat.Transform(Vector3.UnitX).Dot(Vector3.UnitX) > 0);
            Assert.True(mat.Transform(Vector3.UnitX).Dot(Vector3.UnitY) >= 0);
            Assert.True(mat.Transform(Vector3.UnitX).Dot(Vector3.UnitZ) < 0);
        }