當初弄不明白旋轉。。居然找不到資料四元數應該用軸角相乘。。。
通過兩種旋轉的配合,可以告别世界空間和本地空間矩陣轉換了,大大提升效率。
每個軸相乘即可,可以任意軸,無限乘。無萬向節鎖問題
四元數旋轉:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
using UnityEngine;
using System.Collections;
public class RotationTest : MonoBehaviour
{
public float x, y, z;
void Start ()
{
}
void Update ()
{
var xRot = Quaternion.AngleAxis(x, new Vector3(1,0,0));
var yRot = Quaternion.AngleAxis(y, new Vector3(0,1,0));
var zRot = Quaternion.AngleAxis(z, new Vector3(0,0,1));
transform.rotation = xRot*yRot*zRot;
}
}
View Code
歐拉角旋轉适合本地坐标旋轉,按世界坐标軸旋轉用四元數旋轉,并且需要注意萬向節鎖問題
歐拉角旋轉:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
using UnityEngine;
using System.Collections;
public class RotationTest : MonoBehaviour
{
public float x, y, z;
void Start ()
{
}
void Update ()
{
transform.rotation = Quaternion.Euler(new Vector3(x,y,z));
Debug.Log("xyz : "+transform.rotation.eulerAngles);
}
}