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

Unity 四元数Quaternion类的API以及应用举例_奋斗的菇凉的博客-CSDN博客

四元数与欧拉角互转
      //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;
 
/// <summary>
/// 
/// </summary>
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;
 
/// <summary>
/// 
/// </summary>
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);
        }
    }
}
运行结果:

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

using UnityEngine;
using System.Collections;
 
/// <summary>
/// 
/// </summary>
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);
 
    } 
 
   
}

猜你喜欢

转载自blog.csdn.net/renwen1579/article/details/125056661