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); }