基于Unity Matrix4x4的矩阵分解,当然不能将投影矩阵分解成 Position等,具体可以参考 XNA 的矩阵分解
using VEC1 = System.Single; using VEC2 = UnityEngine.Vector2; using VEC3 = UnityEngine.Vector3; using VEC4 = UnityEngine.Vector4; using QUAT = UnityEngine.Quaternion; using MTX = UnityEngine.Matrix4x4; public static VEC3 GetPosition(MTX mtx) { return mtx.GetColumn(3); } public static QUAT GetRotation(MTX mtx) { return QUAT.LookRotation(mtx.GetColumn(2), mtx.GetColumn(1)); } public static VEC3 GetScale(MTX mtx) { return new VEC3( mtx.GetColumn(0).magnitude, mtx.GetColumn(1).magnitude, mtx.GetColumn(2).magnitude); }
夹带私货 一些常用的数学代码
public static VEC1 Vector2Angle(VEC2 v) { //使用 LookAt //v = v.normalized; //var rotate = Vector3.Cross(Vector3.forward, v); //var lootRot = Quaternion.LookRotation(Vector3.forward, rotate); //return lootRot.eulerAngles.z; var rad = Mathf.Atan2(v.y, v.x); var deg = rad * Mathf.Rad2Deg; return deg; }