An introduction to Quaternions Application 四元数应用简介

介绍四元数在旋转表示中的基本定义、identity quaternion 和 pure quaternion。

An introduction to Quaternions Application 四元数应用简介

四元数是由爱尔兰数学家 哈密顿 提出定义的 超复数,其有 一个实数部三个虚数部 组成,它的提出本意为将 二维复平面的复数拓展到 三维空间

四元数其实并不难处理,可以把它们想象成 角度/轴 的 pair (但和 轴角 表示并不相同),四元数的主要优势在于它们 插值 效果很好

四元数表示一个 旋转 rotation,而不是一个 方向 orientation,区别在于

  • 旋转 rotation 描述如果将一个 移动到另一个
  • 方向 orientation 本身就是一个

定义

四元数 qq

q=(qx,qy,qz,qw)=w+x i+y j+z k=(s,v)\begin{align*} q &= (q_x,q_y,q_z,q_w) \\ &= w + x \ \mathbf{i} + y \ \mathbf{j} + z \ \mathbf{k} \\ &= (s, \vec{v}) \end{align*}

分别为

  • 元组表示 (qx,qy,qz,qw)(q_x,q_y,q_z,q_w)
  • 复数表示 w+x i+y j+z kw + x \ \mathbf{i} + y \ \mathbf{j} + z \ \mathbf{k}
    其中 i,j,k\mathbf{i},\mathbf{j},\mathbf{k} 为虚数单位
  • 标量,向量表示 (s,v)(s, \vec{v})
    其中 ss标量 ww,而 v\vec{v}向量 (x,y,z)(x,y,z)
    • 四元数的 向量部分转轴 有关,标量部分旋转角度 有关,但它们都不是直接相等关系,也就是说,不可以与 轴-角 表示搞混

它可以实现为

struct Quaternion {
    float x; // vector part
    float y; // vector part
    float z; // vector part
    float w; // scalar part
}

一个有着四个分量的元组,其中的 标量 分量 ww 对于将 四元数 转换为 矩阵 非常重要

在图形学中,我们总是使用 单位四元数 (长度为 11四元数),随着 浮点误差值 的累积,可能需要周期化的重新对四元数执行 归一化

恒等四元数 Identity Quaternion

四元数具有 乘法恒等式,这个特殊恒等四元数表示 无旋转 (零旋转),其标量分量为 1,向量分量为 0

q=(0,0,0,1)q = (0,0,0,1)
Quaternion Identity() {
    //                 x, y, z, w
    return Quaternion (0, 0, 0, 1)
}

纯四元数 Pure Quaternion

任何向量都可以变成四元数,只需将标量部分留为零,并将 归一化 的向量放入四元数的向量部分即可,得到的四元数是“纯”四元数,任何标量值为零的四元数都称为“纯”四元数,表示一个 三维向量,不直接对应有效旋转

Quaternion Pure(Vector3 vec) {
    Vector3 normalized_vec = normalized(vec);
    return Quaternion(normalized_vec.x, normalized_vec.y, normalized_vec.z, 0);
}