轴-角对
unity中的四元数结构体 —— Quaternion
四元数公式api的使用用例
//写一个 绕轴x 60度旋转 的cube
Quaternion q = new Quaternion(Mathf.Sin(30 * Mathf.Deg2Rad), 0, 0, Mathf.Cos(30) * Mathf.Deg2Rad);
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation = q;
//q2与q相同 只是api不同
Quaternion q2 = Quaternion.AngleAxis(60, Vector3.right);
四元数和欧拉角转换
//1.欧拉直接赋值给四元数
Quaternion q3 = Quaternion.Euler(120, 0, 0);
obj.transform.rotation = q3;
//2.四元数转欧拉角
print(q3.eulerAngles);
四元数相乘——旋转(不会万向节死锁)
this.transform.rotation *= Quaternion.AngleAxis(1, Vector3.forward);
!!!!写一种会产生万向节死锁的方法(错误案例)
e = this.transform.rotation.eulerAngles;
e += Vector3.forward;
this.transform.rotation = Quaternion.Euler(e);
单位四元数——代表没有旋转
#region 知识点1 单位四元数
print(Quaternion.identity);
//直接让单位四元数赋值会直接让物体转角全部归零
//obj.rotation = Quaternion.identity;
//Instantiate(obj, Vector3.zero, Quaternion.identity);
#endregion
四元数中的差值运算 + 通过看向的方式让物体一直盯着目标
public Quaternion start;
public float time;
public Transform lookA;
public Transform lookB;
void Start()
{
start = B.transform.rotation;
}
void Update()
{
#region 知识点2 插值运算 (在Quaternion中有lerp和slerp 但是lerp效果在大角度中一般所以就用slerp)
//无限接近
A.transform.rotation = Quaternion.Slerp(A.transform.rotation, target.transform.rotation, Time.deltaTime);
//匀速 time >= 1 到达目标
time += Time.deltaTime;
B.transform.rotation = Quaternion.Slerp(start, target.rotation, time);
#endregion
#region 知识点3 lookrotation
//Quaternion q = Quaternion.LookRotation(lookB.position - lookA.position);
lookA.rotation = Quaternion.LookRotation(lookB.position - lookA.position);
#endregion