说实话,目前还看得不太懂,是大神做的,先放在网上,等有空的时候进行翻阅,欧拉角万向锁的解决方案
using UnityEngine;
public static class Matrix4x4Utils
{
public enum E_AXIS
{
E_AXIS_X,
E_AXIS_Y,
E_AXIS_Z,
}
//transform.position+increasePos
//在原有pos上增加一段pos
static public void Matrix4x4Translate(this Transform transform, Vector3 increasePos)
{
Vector4 v = new Vector4(transform.position.x,
transform.position.y,
transform.position.z,
1);
Matrix4x4 matrix = Matrix4x4.identity;
matrix.m03 = increasePos.x;
matrix.m13 = increasePos.y;
matrix.m23 = increasePos.z;
v = matrix * v;
transform.position = new Vector3(v.x, v.y, v.z);
}
//通过矩阵移动物体的Rotate
public static void Matrix4x4Rotate(this Transform transform, Vector3 euler)
{
Matrix4x4 matrix = Matrix4x4Rotation(E_AXIS.E_AXIS_Y, euler.y) * Matrix4x4Rotation(E_AXIS.E_AXIS_X, euler.x) * Matrix4x4Rotation(E_AXIS.E_AXIS_Z, euler.z);
Debug.LogError(matrix.ToString());
transform.rotation = GetRotation(matrix);
}
//只是被旋转调用的方法
static private Matrix4x4 Matrix4x4Rotation(E_AXIS axis, float angle)
{
Matrix4x4 matrix = Matrix4x4.identity;
if (axis == E_AXIS.E_AXIS_X)
{
float rad = angle * Mathf.Deg2Rad;
float sin = Mathf.Sin(rad);
float cos = Mathf.Cos(rad);