• Quaternion
    • Quaternion.Slerp 球形插值
    • Quaternion.LookRotation 注视旋转
    • 四元数
    • API

    Quaternion

    四元数用于表示旋转。

    它们是紧凑的,不会出现万向节锁并且能够很容易被插值。Unity内使用Quaternion表示所有旋转。

    他们基于复数并且直觉上不容易理解。你几乎不必要进入或者修改个人的四元数组件(x,y,z,w);

    Quaternion.Slerp 球形插值

    球形插值,通过t值from向to之间插值。参数取值范围[0,1]。

    实例:

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. public Transform from;
    5. public Transform to;
    6. public float speed = 0.1F;
    7. void Update() {
    8. transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);
    9. }
    10. }

    Quaternion.LookRotation 注视旋转

    创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view y轴朝向up。

    返回计算四元数。如果用于定向的变换,Z轴将会被对准前方并且如果这些向量正交,Y轴向前。如果forward方向是0,记录一个错误。

    实例:

    1. using UnityEngine;
    2. using System.Collections;
    3. public class ExampleClass : MonoBehaviour {
    4. public Transform target;
    5. void Update() {
    6. Vector3 relativePos = target.position - transform.position;
    7. Quaternion rotation = Quaternion.LookRotation(relativePos);
    8. transform.rotation = rotation;
    9. }
    10. }

    四元数

    因为矩阵的缺点我们需要使用四元数

    1. 1、矩阵的冗余太多
    2. 2、矩阵多次迭代后会造成万向锁问题
    3. 3、矩阵的行列数总是影响向量的维度

    四元素特点

    1. 1、四元数数据量小,只有四个元素
    2. 2、四元数可以利用向量叉乘来计算,省去了矩阵乘法计算
    3. 3、他会一直保持向量的维度是4
    4. 四元数组合
    5. [ w, v ]
    6. [w , (x, y, z) ]
    7. w是实数, v是三个虚数的组合
    8. 计算
    9. 参照复数四则运算
    10. 使我们的虚数部分变成负数:就是共轭
    11. q w, (-x, -y, -z)]
    12. 求模
    13. ||p|| = sqrt( a*a + b *b );
    14. ||q|| = sqrt( pow(cos(a /2), 2) + pow(sin(a/2), 2) )
    15. 求逆
    16. q = q* / ||q||

    将逆和向量叉乘得到我们四元数旋转后的新坐标点

    注意事项

    1. 四元数也是线性的,千万不能同时旋转

    API

    静态变量说明
    identity同一性旋转(只读)。
    变量说明
    eulerAngles返回表示旋转的欧拉角度。
    this[int]分别使用 [0]、[1]、 [2]、 [3],访问x、y、z、w组件。
    w四元数的W组件。不要直接修改这个,除非你很了解四元数。
    x四元数的X组件。不要直接修改这个,除非你很了解四元数。
    y四元数的Y组件。不要直接修改这个,除非你很了解四元数。
    z四元数的Z组件。不要直接修改这个,除非你很了解四元数。
    公有方法说明
    Set设置存在的四元素的x, y, z 和w 组件。
    SetFromToRotation创建一个从fromDirection到toDirection的旋转。
    SetLookRotation创建一个旋转,沿着forward(z轴)并且头部沿着up(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view y轴朝向up。
    ToAngleAxis转换一个旋转用“角-轴”表示。
    静态方法说明
    Angle返回a和b两者之间的角度。
    AngleAxis绕axis轴旋转angle,创建一个旋转。
    Dot两个旋转之间的点乘。
    Euler返回一个旋转角度,绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(像这样的顺序)。
    FromToRotation从fromDirection到toDirection创建一个旋转。
    Inverse返回反向的旋转。
    Lerp通过t值from向to之间插值,并且规范化结果。
    LookRotation创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view y轴朝向up。
    RotateTowards旋转一个角度从from向to。
    Slerp球形插值,通过t值from向to之间插值。参数取值范围[0,1]。
    SlerpUnclamped球形插值,通过t值from向to之间插值。该参数t是不在区间内。
    Operators 运算符说明
    operator !=判断两个四元数是否不同?
    operator* 获取lhs 的旋转状态并应用rhs的旋转。
    operator ==判断两个四元数是否相等?

    ?