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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM