2using Unity.Mathematics;
10 public static string ToString<T>(T value)
12 return value.ToString();
15 public static Vector3 FromMathematics(double3 vector)
17 return new Vector3((
float)vector.x, (
float)vector.y, (
float)vector.z);
20 public static Vector4 FromMathematics(double4 vector)
22 return new Vector4((
float)vector.x, (
float)vector.y, (
float)vector.z, (
float)vector.w);
25 public static double4x4 ToMathematics(Matrix4x4 matrix)
28 matrix.m00, matrix.m01, matrix.m02, matrix.m03,
29 matrix.m10, matrix.m11, matrix.m12, matrix.m13,
30 matrix.m20, matrix.m21, matrix.m22, matrix.m23,
31 matrix.m30, matrix.m31, matrix.m32, matrix.m33);
34 public static Matrix4x4 FromMathematics(double4x4 matrix)
36 return new Matrix4x4(FromMathematics(matrix.c0), FromMathematics(matrix.c1), FromMathematics(matrix.c2), FromMathematics(matrix.c3));
39 public static double3x3 ToMathematicsDouble3x3(Matrix4x4 matrix)
42 matrix.m00, matrix.m01, matrix.m02,
43 matrix.m10, matrix.m11, matrix.m12,
44 matrix.m20, matrix.m21, matrix.m22);
47 public static float3x3 ToMathematicsFloat3x3(Matrix4x4 matrix)
50 matrix.m00, matrix.m01, matrix.m02,
51 matrix.m10, matrix.m11, matrix.m12,
52 matrix.m20, matrix.m21, matrix.m22);
55 internal static void MatrixToRotationAndScale(double3x3 matrix, out quaternion rotation, out double3 scale)
57 double lengthColumn0 = math.length(matrix.c0);
58 double lengthColumn1 = math.length(matrix.c1);
59 double lengthColumn2 = math.length(matrix.c2);
61 float3x3 rotationMatrix =
new float3x3(
62 (float3)(matrix.c0 / lengthColumn0),
63 (float3)(matrix.c1 / lengthColumn1),
64 (float3)(matrix.c2 / lengthColumn2));
66 scale =
new double3(lengthColumn0, lengthColumn1, lengthColumn2);
68 double3 cross = math.cross(matrix.c0, matrix.c1);
69 if (math.dot(cross, matrix.c2) < 0.0)
71 rotationMatrix *= -1.0f;
75 rotation = math.quaternion(rotationMatrix);
78 internal static void MatrixToTranslationRotationAndScale(double4x4 matrix, out double3 translation, out quaternion rotation, out double3 scale)
80 translation = matrix.c3.xyz;
82 Helpers.MatrixToRotationAndScale(
83 new double3x3(matrix.c0.xyz, matrix.c1.xyz, matrix.c2.xyz),
88 internal static void MatrixToInaccurateRotationAndScale(double3x3 matrix, out Quaternion rotation, out Vector3 scale)
90 quaternion rotationTemp;
92 MatrixToRotationAndScale(matrix, out rotationTemp, out scaleTemp);
94 rotation = rotationTemp;
95 scale = (float3)scaleTemp;
98 internal static void MatrixToInaccurateTranslationRotationAndScale(double4x4 matrix, out Vector3 translation, out Quaternion rotation, out Vector3 scale)
100 translation = Helpers.FromMathematics(matrix.c3.xyz);
102 Helpers.MatrixToInaccurateRotationAndScale(
103 new double3x3(matrix.c0.xyz, matrix.c1.xyz, matrix.c2.xyz),
108 internal static double4x4 TranslationRotationAndScaleToMatrix(double3 translation, quaternion rotation, double3 scale)
110 double3x3 scaleMatrix =
new double3x3(
111 new double3(scale.x, 0.0, 0.0),
112 new double3(0.0, scale.y, 0.0),
113 new double3(0.0, 0.0, scale.z));
114 double3x3 rotationMatrix =
new float3x3(rotation);
115 double3x3 scaleAndRotate = math.mul(rotationMatrix, scaleMatrix);
116 return new double4x4(
117 new double4(scaleAndRotate.c0, 0.0),
118 new double4(scaleAndRotate.c1, 0.0),
119 new double4(scaleAndRotate.c2, 0.0),
120 new double4(translation, 1.0));
128 public static double NegativePiToPi(
double angle)
130 if (angle >= -Math.PI && angle <= Math.PI)
136 return Helpers.ZeroToTwoPi(angle + Math.PI) - Math.PI;
144 public static double Negative180To180(
double angle)
146 if (angle >= -180.0 && angle <= 180.0)
152 return Helpers.ZeroTo360(angle + 180.0) - 180.0;
160 public static double ZeroToTwoPi(
double angle)
162 if (angle >= 0 && angle <= 2.0 * Math.PI)
168 double mod = Helpers.Mod(angle, 2.0 * Math.PI);
169 if (Math.Abs(mod) < 1.0e-14 && Math.Abs(angle) > 1.0e-14)
171 return 2.0 * Math.PI;
181 public static double ZeroTo360(
double angle)
183 if (angle >= 0 && angle <= 360.0)
189 double mod = Helpers.Mod(angle, 360.0);
190 if (Math.Abs(mod) < 1.0e-14 && Math.Abs(angle) > 1.0e-14)
203 public static double Mod(
double m,
double n)
205 if (Math.Sign(m) == Math.Sign(n) && Math.Abs(m) < Math.Abs(n)) {
210 return ((m % n) + n) % n;