Quaternion
四元数,用于表示旋转。
它们是紧凑的,不会出现万向节锁并且能够很容易被插值。Unity内使用Quaternion表示所有旋转。
然而,它们基于复数的并不容易被直观地理解,因此你没有必要访问或修改单个Quaternion组件(x,y,z,w);通常你只需把现有的旋转(例如,来自Transform)并使用它们来构造新的旋转(例如,在两个旋转间平滑地插值)。四元数函数你99%的时间你会使用它(其他函数仅额外使用)Quaternion.LookRotation, Quaternion.Angle, Quaternion.Euler, Quaternion.Slerp, Quaternion.FromToRotation, Quaternion.identity。
你可以使用Quaternion.operator *由另一个四元数来旋转一个旋转角度,或由一个旋转角度来旋转一个向量。
Variables | 变量 |
---|---|
x | 四元数的X组件。不要直接修改这个,除非你很了解四元数 |
y | 四元数的Y组件。不要直接修改这个,除非你很了解四元数 |
z | 四元数的Z组件。不要直接修改这个,除非你很了解四元数 |
w | 四元数的W组件。不要直接修改这个,除非你很了解四元数 |
this [int index] | 分别使用 [0]、[1]、 [2]、 [3],访问x、y、z、w组件 |
eulerAngles | 返回表示旋转的欧拉角度 |
Constructors | 构造器 |
---|---|
Quaternion | 用给定的x、y、z、w组件,构造新的四元数。 |
Functions | 函数 |
---|---|
ToAngleAxis | 转换一个旋转用“角-轴”表示 |
SetFromToRotation | 创建一个从fromDirection到toDirection的旋转 |
SetLookRotation | 创建一个旋转,沿着forward(z轴)并且头部沿着up(y轴)的约束注视 |
ToString | 返回一个格式化好的四元数字符串 |
Class Variables | 类变量 |
---|---|
identity | 同一性旋转(只读)。该四元数,相当于"无旋转":这个物体完全对齐于世界或父轴 |
Class Functions | 类函数 |
---|---|
operator * | 组合旋转lhs和rhs |
operator == | 两个四元数相等? |
operator != | 两个四元数是不相等的? |
Dot | 两个旋转之间的点乘。 |
AngleAxis | 绕axis轴旋转angle,创建一个旋转 |
FromToRotation | 从fromDirection到toDirection创建一个旋转 |
LookRotation | 创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视 |
Slerp | 球形插值,通过t值from向to之间插值 |
Lerp | 通过t值from向to之间插值,并且规范化结果 |
RotateTowards | 旋转一个角度从from向to |
Inverse | 返回反向的旋转 |
Angle | 返回a和b两者之间的角度 |
Euler | 返回一个旋转角度,绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(像这样的顺序) |
让一个模型始终朝向另一个模型
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LookAtTest : MonoBehaviour {
public Transform cube;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
Vector3 distance = cube.position - transform.position;
transform.rotation = Quaternion.LookRotation (distance);
}
}
缓慢转动
void Update () {
Vector3 distance = cube.position - transform.position;
Quaternion target = Quaternion.LookRotation (distance);
transform.rotation = Quaternion.Slerp (transform.rotation, target, Time.deltaTime);
}