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