Unity3D_(API)Quaternion四元數中的Quaternion.LookRotation()
阿新 • • 發佈:2018-11-11
四元數百度百科: 傳送門
四元數官方文件: 傳送門
尤拉旋轉、四元數、矩陣旋轉之間的差異: 傳送門
四元數轉換為尤拉角eulerAngles 官方文件: 傳送門
尤拉角轉換為四元數Euler 官方文件: 傳送門
Quaternion.LookRotation 官方文件:傳送門
LookRotation()根據對區域性座標軸的描述, 構造對應的代表旋轉程度的四元數
一、Transform中四元數和尤拉角
using System.Collections;Quaternion.csusing 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); } }Quaternion_Gary
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); } }Quaternion_Gary.cs
void Update () { //讓player前方向和dir方向保持一致 Vector3 dir = player.position - enemy.position; Quaternion target = Quaternion.LookRotation(dir); player.rotation = Quaternion.Slerp(player.rotation,target,Time.deltaTime); }