1using Unity.Mathematics;
9 public static string ToString<T>(T value)
11 return value.ToString();
14 public static Vector3 FromMathematics(double3 vector)
16 return new Vector3((
float)vector.x, (
float)vector.y, (
float)vector.z);
19 public static Vector4 FromMathematics(double4 vector)
21 return new Vector4((
float)vector.x, (
float)vector.y, (
float)vector.z, (
float)vector.w);
24 public static double4x4 ToMathematics(Matrix4x4 matrix)
27 matrix.m00, matrix.m01, matrix.m02, matrix.m03,
28 matrix.m10, matrix.m11, matrix.m12, matrix.m13,
29 matrix.m20, matrix.m21, matrix.m22, matrix.m23,
30 matrix.m30, matrix.m31, matrix.m32, matrix.m33);
33 public static Matrix4x4 FromMathematics(double4x4 matrix)
35 return new Matrix4x4(FromMathematics(matrix.c0), FromMathematics(matrix.c1), FromMathematics(matrix.c2), FromMathematics(matrix.c3));
38 public static double3x3 ToMathematicsDouble3x3(Matrix4x4 matrix)
41 matrix.m00, matrix.m01, matrix.m02,
42 matrix.m10, matrix.m11, matrix.m12,
43 matrix.m20, matrix.m21, matrix.m22);
46 public static float3x3 ToMathematicsFloat3x3(Matrix4x4 matrix)
49 matrix.m00, matrix.m01, matrix.m02,
50 matrix.m10, matrix.m11, matrix.m12,
51 matrix.m20, matrix.m21, matrix.m22);
54 internal static void MatrixToRotationAndScale(double3x3 matrix, out quaternion rotation, out double3 scale)
56 double lengthColumn0 = math.length(matrix.c0);
57 double lengthColumn1 = math.length(matrix.c1);
58 double lengthColumn2 = math.length(matrix.c2);
60 float3x3 rotationMatrix =
new float3x3(
61 (float3)(matrix.c0 / lengthColumn0),
62 (float3)(matrix.c1 / lengthColumn1),
63 (float3)(matrix.c2 / lengthColumn2));
65 scale =
new double3(lengthColumn0, lengthColumn1, lengthColumn2);
67 double3 cross = math.cross(matrix.c0, matrix.c1);
68 if (math.dot(cross, matrix.c2) < 0.0)
70 rotationMatrix *= -1.0f;
74 rotation = math.quaternion(rotationMatrix);
77 internal static void MatrixToTranslationRotationAndScale(double4x4 matrix, out double3 translation, out quaternion rotation, out double3 scale)
79 translation = matrix.c3.xyz;
81 Helpers.MatrixToRotationAndScale(
82 new double3x3(matrix.c0.xyz, matrix.c1.xyz, matrix.c2.xyz),
87 internal static void MatrixToInaccurateRotationAndScale(double3x3 matrix, out Quaternion rotation, out Vector3 scale)
89 quaternion rotationTemp;
91 MatrixToRotationAndScale(matrix, out rotationTemp, out scaleTemp);
93 rotation = rotationTemp;
94 scale = (float3)scaleTemp;
97 internal static void MatrixToInaccurateTranslationRotationAndScale(double4x4 matrix, out Vector3 translation, out Quaternion rotation, out Vector3 scale)
99 translation = Helpers.FromMathematics(matrix.c3.xyz);
101 Helpers.MatrixToInaccurateRotationAndScale(
102 new double3x3(matrix.c0.xyz, matrix.c1.xyz, matrix.c2.xyz),
107 internal static double4x4 TranslationRotationAndScaleToMatrix(double3 translation, quaternion rotation, double3 scale)
109 double3x3 scaleMatrix =
new double3x3(
110 new double3(scale.x, 0.0, 0.0),
111 new double3(0.0, scale.y, 0.0),
112 new double3(0.0, 0.0, scale.z));
113 double3x3 rotationMatrix =
new float3x3(rotation);
114 double3x3 scaleAndRotate = math.mul(rotationMatrix, scaleMatrix);
115 return new double4x4(
116 new double4(scaleAndRotate.c0, 0.0),
117 new double4(scaleAndRotate.c1, 0.0),
118 new double4(scaleAndRotate.c2, 0.0),
119 new double4(translation, 1.0));