四元素与矩阵之间相互转换
1.矩阵转换为四元素
public static Quaternion QuaternionFromMatrix(Matrix4x4 m) { Quaternion q = new Quaternion(); q.w = Mathf.Sqrt(Mathf.Max(0, 1 + m[0, 0] + m[1, 1] + m[2, 2])) / 2; q.x = Mathf.Sqrt(Mathf.Max(0, 1 + m[0, 0] - m[1, 1] - m[2, 2])) / 2; q.y = Mathf.Sqrt(Mathf.Max(0, 1 - m[0, 0] + m[1, 1] - m[2, 2])) / 2; q.z = Mathf.Sqrt(Mathf.Max(0, 1 - m[0, 0] - m[1, 1] + m[2, 2])) / 2; q.x *= Mathf.Sign(q.x * (m[2, 1] - m[1, 2])); q.y *= Mathf.Sign(q.y * (m[0, 2] - m[2, 0])); q.z *= Mathf.Sign(q.z * (m[1, 0] - m[0, 1])); return q; }
2.矩阵的构成要素
public static Matrix4x4 CreateMatrix(Vector3 right, Vector3 up, Vector3 forward, Vector3 position) { Matrix4x4 m = Matrix4x4.identity; m.SetColumn(0, right); m.SetColumn(1, up); m.SetColumn(2, forward); m.SetColumn(3, position); m[3, 3] = 1; return m; }
3.四元素转化为矩阵
public static Matrix4x4 MatrixFromQuaternion(Quaternion q) { return CreateMatrix(q * Vector3.right, q * Vector3.up, q * Vector3.forward, Vector3.zero); }