Unity 四元数Quaternion类的API以及应用举例

   四元数与欧拉角互转

      //1. 四元数  -->  欧拉角
        Quaternion qt = transform.rotation;       
        Vector3 euler = qt.eulerAngles;
        //2.欧拉角 --> 四元数
        Quaternion qt02 = Quaternion.Euler(0, 90, 0);

   轴角旋转 


         transform.rotation = Quaternion.AngleAxis(30, Vector3.up);//转的角度,绕的哪个轴向旋转
         transform.rotation = Quaternion.Euler(0, 30,0);
         // 这两句目前是等价的,都是把当前物体绕Y轴旋转30度,但是第一句轴向可以随便写,比较适用于歪的轴
         //第二句适合绕世界的标准轴向(X轴,Y轴,Z轴)旋转。
         //transform.localRotation = Quaternion.AngleAxis(30, Vector3.up);  

 

Z轴注视旋转:物体看向目标点,适用于3D

1、 没有过度过程,一步到位,点击按钮直接看向目标点

using UnityEngine;
using System.Collections;

/// 
/// 
/// 
public class QuaternionAPI : MonoBehaviour
{
    public Transform target;
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("LookRotation"))
        {
            //当前物体注视目标点旋转
            Quaternion dir = Quaternion.LookRotation(target.position - transform.position);
            transform.rotation = dir;

            //当前物体注视目标点旋转
            transform.LookAt(target.position);
            //这两个方法目前是一样的,都是一步到位,

        }


    }

}

2、 有过度过程,由快到慢看向目标点:Lerp

using UnityEngine;
using System.Collections;

/// 
/// 
/// 
public class QuaternionAPI : MonoBehaviour
{
  
   public Transform target;
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("Lerp"))
        {
            Quaternion dir = Quaternion.LookRotation(target.position - transform.position);
            //dir是目标要看向的角度
            //lerp:起点不固定,终点固定,现象由快到慢,且最终到不了终点
            transform.rotation = Quaternion.Lerp(transform.rotation,dir,0.1f);
            ////7. 四元数计算角度差,当前旋转角度接近目标旋转角度
            if (Quaternion.Angle(transform.rotation, dir) < 10)
                transform.rotation = dir;
        }
    }
  
 
}

       匀速看向目标点:RotateTowards

using UnityEngine;
using System.Collections;
public class QuaternionAPI : MonoBehaviour
{
    public Transform target;
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("RotateTowards"))
        {
            Quaternion dir = Quaternion.LookRotation(target.position - transform.position);
            //dir是目标要看向的角度
            transform.rotation = Quaternion.RotateTowards(transform.rotation, dir, 0.1f);
        }
    }
}

X轴注视旋转:物体看向目标点适用于2D

using UnityEngine;
using System.Collections;
public class QuaternionAPI : MonoBehaviour
{
   public Transform target;
    private void OnGUI()
    {
        if (GUILayout.RepeatButton("right"))
        {

            transform.rotation = Quaternion.FromToRotation(Vector3.right, target.position - transform.position);
        }
    }
}

运行结果:

Unity 四元数Quaternion类的API以及应用举例_第1张图片

应用:根据用户输入的方向(w a s d )旋转角色,并向前移动

Unity 四元数Quaternion类的API以及应用举例_第2张图片

using UnityEngine;
using System.Collections;

/// 
/// 
/// 
public class CharcterMoto : MonoBehaviour
{
    public float rotateSpeed = 10;
    public float moveSpeed = 10;
    private void Update()
    {
        float hor = Input.GetAxis("Horizontal");
        float ver = Input.GetAxis("Vertical");
      
        if (hor != 0 || ver != 0)//没有输入时就不动
        {
            MovementRotation(hor, ver);
        }
    }
    private void MovementRotation(float hor, float ver)
    {
        var dir = Quaternion.LookRotation(new Vector3(hor, 0, ver));
        transform.rotation = Quaternion.Lerp(transform.rotation, dir, rotateSpeed * Time.deltaTime);
        //transform.Translate(0, 0, moveSpeed * Time.deltaTime);//移动1
        transform.Translate(transform.forward * Time.deltaTime * moveSpeed, Space.World);//移动2
       // transform.Translate(hor, 0, ver, Space.World);

    } 

   
}

 

 

 

 

你可能感兴趣的:(Unity,3D数学)