public static V3f Original(Rot3f r) { var test = r.W * r.Y - r.X * r.Z; if (test > 0.5f - Constant <float> .PositiveTinyValue) // singularity at north pole { return(new V3f( 2 * Fun.Atan2(r.X, r.W), (float)Constant.PiHalf, 0)); } if (test < -0.5f + Constant <float> .PositiveTinyValue) // singularity at south pole { return(new V3f( 2 * Fun.Atan2(r.X, r.W), -(float)Constant.PiHalf, 0)); } // From Wikipedia, conversion between quaternions and Euler angles. return(new V3f( 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__ 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 V3f CopySign(Rot3f r) { var test = r.W * r.Y - r.X * r.Z; if (test.Abs() >= 0.5f - Constant <float> .PositiveTinyValue) { return(new V3f( 2 * Fun.Atan2(r.X, r.W), Fun.CopySign((float)Constant.PiHalf, test), 0)); } else { return(new V3f( 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)))); } }