public static __v3t__ Original(__rot3t__ r) { var test = r.W * r.Y - r.X * r.Z; if (test > __half__ - Constant <__rtype__> .PositiveTinyValue) // singularity at north pole { return(new __v3t__( 2 * Fun.Atan2(r.X, r.W), __piHalf__, 0)); } if (test < -__half__ + Constant <__rtype__> .PositiveTinyValue) // singularity at south pole { return(new __v3t__( 2 * Fun.Atan2(r.X, r.W), -__piHalf__, 0)); } // From Wikipedia, conversion between quaternions and Euler angles. return(new __v3t__( Fun.Atan2(2 * (r.W * r.X + r.Y * r.Z), 1 - 2 * (r.X * r.X + r.Y * r.Y)), Fun.AsinClamped(2 * test), Fun.Atan2(2 * (r.W * r.Z + r.X * r.Y), 1 - 2 * (r.Y * r.Y + r.Z * r.Z)))); }
public static __v3t__ CopySign(__rot3t__ r) { var test = r.W * r.Y - r.X * r.Z; if (test.Abs() >= __half__ - Constant <__rtype__> .PositiveTinyValue) { return(new __v3t__( 2 * Fun.Atan2(r.X, r.W), Fun.CopySign(__piHalf__, test), 0)); } else { return(new __v3t__( Fun.Atan2(2 * (r.W * r.X + r.Y * r.Z), 1 - 2 * (r.X * r.X + r.Y * r.Y)), Fun.AsinClamped(2 * test), Fun.Atan2(2 * (r.W * r.Z + r.X * r.Y), 1 - 2 * (r.Y * r.Y + r.Z * r.Z)))); } }