四元數百度百科: 傳送門
四元數官方文檔: 傳送門
歐拉旋轉、四元數、矩陣旋轉之間的差異: 傳送門
四元數轉換為歐拉角eulerAngles 官方文檔: 傳送門
歐拉角轉換為四元數Euler 官方文檔: 傳送門
Quaternion.LookRotation 官方文檔:傳送門
LookRotation()根據對局部坐標軸的描述, 構造對應的代表旋轉程度的四元數
一、Transform中四元數和歐拉角

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Quaternion : MonoBehaviour { public Transform cube; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Space)) { //獲得游戲物體歐拉角 print(cube.eulerAngles); //獲得游戲物體四元數 print(cube.rotation); } } }
歐拉角:方便開發者在控制面板上觀察游戲物體旋轉的角度,但旋轉軸固定
四元數:旋轉軸可以是任意向量 傳送門
//獲得游戲物體歐拉角 print(cube.eulerAngles); //獲得游戲物體四元數 print(cube.rotation);
二、Quaternion.LookRotation
場景中創建一個Capsule作為玩家,Sphere作為敵人,給Capsule綁定Quaternion_Gary.cs腳本,要使玩家一致朝向敵人可以用LookRotation()來實現

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Quaternion_Gary : MonoBehaviour { public Transform player; public Transform enemy; // Use this for initialization void Start () { } // Update is called once per frame void Update () { //讓player前方向和dir方向保持一致 Vector3 dir = player.position - enemy.position; player.rotation = Quaternion.LookRotation(dir); } }
void Update () { //讓player前方向和dir方向保持一致 Vector3 dir = player.position - enemy.position; player.rotation = Quaternion.LookRotation(dir); }
有時以一幀的速度去讓玩家轉頭容易造成不好的體驗
延緩轉頭速度緩慢,讓動畫看起來更平滑

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Quaternion_Gary : MonoBehaviour { public Transform player; public Transform enemy; // Use this for initialization void Start () { } // Update is called once per frame void Update () { //讓player前方向和dir方向保持一致 Vector3 dir = player.position - enemy.position; Quaternion target = Quaternion.LookRotation(dir); player.rotation = Quaternion.Slerp(player.rotation,target,Time.deltaTime); } }
void Update () { //讓player前方向和dir方向保持一致 Vector3 dir = player.position - enemy.position; Quaternion target = Quaternion.LookRotation(dir); player.rotation = Quaternion.Slerp(player.rotation,target,Time.deltaTime); }
