1. 程式人生 > >Unity3D_(API)Quaternion四元數中的Quaternion.LookRotation()

Unity3D_(API)Quaternion四元數中的Quaternion.LookRotation()

 

 

  四元數百度百科:  傳送門

  四元數官方文件:  傳送門

  尤拉旋轉、四元數、矩陣旋轉之間的差異:  傳送門

  四元數轉換為尤拉角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); } } }
Quaternion.cs

 

  尤拉角:方便開發者在控制面板上觀察遊戲物體旋轉的角度,但旋轉軸固定

  四元數:旋轉軸可以是任意向量  傳送門

    //獲得遊戲物體尤拉角
    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);
    }