Skip to content

4.4.2 R3 中旋转的表示 ​

空间旋转是绕着一个轴 (所谓旋转轴) 实现的. 旋转轴通过原点, 由 (在轴上的) 方向向量 a→≠0→ 定向. 轴上的正向由 a→ 选取. 正旋转 (旋转角 φ≥0 ) 相对于正向逆时针旋转. 方向向量通常是标准化的,即 |a→|=1 .

等式

(4.130a)w→=Rv→

意味着向量 w→ 由向量 v→ 通过旋转矩阵 R 产生,即旋转矩阵 R 将向量 v→ 变换为 w→ . 因为旋转矩阵是正交矩阵,所以

(4.130b)R−1=RT,

并且 (4.130a) 等价于

(4.130c)w→=R−1w→=RTw→.

注 有必要将空间变换与下列变换加以区分:

a) 几何变换, 即当几何对象相对于一个固定的坐标系被变换;

b) 坐标变换, 即对象固定, 同时坐标系相对于对象被变换 (参见第 307 页3.5.4).

现在几何变换是用四元数处理的.

4.4.2.1 物体绕坐标轴的旋转 ​

在笛卡儿坐标系中轴是由基向量定向的. 绕 x 轴的旋转由矩阵 Rx 给出,绕 y 轴的旋转由矩阵 Ry 给出,绕 z 轴的旋转由矩阵 Rz 给出,其中

Rx(α):=(1000cos⁡α−sin⁡α0sin⁡αcos⁡α),Ry(β):=(cos⁡β0sin⁡β010−sin⁡β0cos⁡β),(4.131)Rz(γ):=(cos⁡γ−sin⁡γ0sin⁡γcos⁡γ0001)

物体的旋转与坐标系的旋转 (参见第 285 页 3.5.3.3, 3.) 间的关系是

(4.132)Rx(α)=DxT(α),Ry(β)=DyT(β),Rz(γ)=DzT(γ).

注 齐次坐标中旋转矩阵的表示在第 314 页 3.5.4.5 中给出.

4.4.2.2 卡丹角 ​

每个绕通过原点的轴的旋转 R 可以作为在一个给定坐标系中一系列绕坐标轴的旋转给出 (参见第 287 页 3.5.3.5), 这里

  • 第一次旋转是绕 x 轴,旋转角为 αC ,

  • 第二次旋转是绕 y 轴,旋转角为 βC ,

  • 第三次旋转是绕 z 轴,旋转角为 γC .

角 αC,βC,γC 称作卡丹角. 于是旋转矩阵是 ​

(4.133a)R=RC:=Rz(γC)Ry(βC)Rx(αC)

=(cos⁡βCcos⁡γCsin⁡αCsin⁡βCcos⁡γC−cos⁡αCsin⁡γCcos⁡αCsin⁡βCcos⁡γC+sin⁡αCsin⁡γCcos⁡βCsin⁡γCsin⁡αCsin⁡βCsin⁡γC+cos⁡αCcos⁡γCcos⁡αCsin⁡βCsin⁡γC−sin⁡αCcos⁡γC−sin⁡βCsin⁡αCcos⁡βCcos⁡αCcos⁡βC).(4.133b)

优点 ​

  • 非常通用的旋转表示,

  • 清晰的结构. 缺点

  • 旋转的顺序是重要的, 即一般地,

(4.133c)Rx(αC)Ry(βC)Rz(γC)≠Rz(γC)Ry(βC)Rx(αC).
  • 表示不唯一,因为 R(αC,βC,γC)=R(−αC±180∘,βC±180∘,γC±180∘) .

  • 对连续实施的旋转不适用 (如动画).

  • 可能发生常平架锁定 (一个轴旋转 90∘ 成为另一个轴).

  • 常平架锁定情形:绕 y 轴旋转 90∘ ,

(4.133d)R(αC,90∘,γC)=(0sin⁡(αC−γC)cos⁡(αC−γC)0cos⁡(αC−γC)−sin⁡(αC−γC)−100).

可见失去了一个自由度. 在实际应用中, 这可能引起难以预料的运动.

注 应该了解的是: 卡丹角有时被称为欧拉角, 但在文献中它们的定义可能是不同的 (参见第 289 页 3.5.3.6).

4.4.2.3 欧拉角 ​

欧拉角 ψ,ϑ,φ 通常引进如下 (参见第 289 页 3.5.3.6):

  • 第一次旋转是绕 z 轴,旋转角为 ψ ,

  • 第二次旋转是绕 x 轴的象,旋转角为 ϑ ,

  • 第三次旋转是绕 z 轴的象,旋转角为 φ .

旋转矩阵是 ​

(4.134a)R=RE=Rz(φ)Rx(ϑ)Rz(ψ)=(cos⁡ψcos⁡φ−sin⁡ψcos⁡ϑsin⁡φ−cos⁡ψsin⁡φ−sin⁡ψcos⁡ϑcos⁡φsin⁡ψsin⁡ϑsin⁡ψcos⁡φ+cos⁡ψcos⁡ϑsin⁡φ−sin⁡ψsin⁡φ+cos⁡ψcos⁡ϑcos⁡φ−cos⁡ψsin⁡ϑsin⁡ϑsin⁡φsin⁡ϑcos⁡φcos⁡ϑ).

(4.134b)

4.4.2.4 绕任意零点轴的旋转 ​

绕标准化向量 a→=(ax,ay,az),|a→|=1 旋转角为 φ 的反时针方向旋转分 5 步完成:

(1) 按照 (4.135a) 应用 R1,a→ 绕 y 轴旋转到 x,y 平面: a→′=R1a→ . 结果是: 向量 a→′ 位于 x,y 平面上.

(2) 按照 (4.135b) 应用 R2,a→′ 绕 z 轴旋转直到平行于 x 轴的位置: a→′′=R2a→′ . 结果是: 向量 a→′′ 平行于 x 轴.

(4.135a)R1=(axax2+az20azax2+az2010−azax2+az20axax2+az2),(4.135b)R2=(ax2+az2ay0−ayax2+az20001).

(3) 应用 R3 ,绕 x 轴旋转角度 φ :

(4.135c)R3=Rx(φ)=(1000cos⁡φ−sin⁡φ0sin⁡φcos⁡φ).

旋转 R1 和 R2 在下列两步中是反方向进行的.

(4) R2 的逆向旋转,即按照 (4.135d),绕 z 轴旋转角度 β ,这里 sin⁡β=ay,cos⁡β=ax2+az2.

(5) R1 的逆向旋转,即按照 (4.135e),绕 y 轴旋转角度 −α ,这里 sin⁡(−α)=−azax2+az2,cos⁡(−α)=axax2+az2.

(4.135d)R2−1=(ax2+az2−ay0ayax2+az20001),(4.135e)R1−1=(axax2+az20−azax2+az2010azax2+az20axax2+az2).

最后, 合成矩阵是

R(a→,φ)(4.135f)=R1−1R2−1R3R2R1=(cos⁡φ+ax2(1−cos⁡φ)axay(1−cos⁡φ)−azsin⁡φaxaz(1−cos⁡φ)+aysin⁡φayax(1−cos⁡φ)+azsin⁡φcos⁡φ+ay2(1−cos⁡φ)ayaz(1−cos⁡φ)−axsin⁡φazax(1−cos⁡φ)−aysin⁡φazay(1−cos⁡φ)+axsin⁡φcos⁡φ+az2(1−cos⁡φ)).

(4.135g)

矩阵 R(a→,φ) 是正交矩阵,即它的逆等于它的转置: R−1(a→,φ)=RT(a→,φ) . 还有下列公式成立:

Rx→=R(a→,φ)x→(4.136a)=(cos⁡φ)x→+(1−cos⁡φ)x→⋅a→|a→|2a→+sin⁡φ|a→|a→×x→(4.136b)=(cos⁡φ)x→+(1−cos⁡φ)x→a→+(sin⁡φ)a→|a→|×x→.

在这些公式中向量 x→ 分解为两个分量,一个平行于 a→ ,另一个垂直于 a→ . 平行部分是 x→a→=x→⋅a→|a→|2a→ ,垂直部分是 r→=x→−x→a→ . 垂直部分在法向量为 a→ 的平面上,所以它的象是 (cos⁡φ)r→+(sin⁡φ)r→∗ ,其中 r→∗ 由 r→ 做正方向 90∘ 旋转得到: r→∗=1|a→|a→×r→ . 向量 x→ 旋转的结果是

x→a→+(cos⁡φ)r→+(sin⁡φ)r→∗(4.136c)=x→⋅a→|a→|2a→+(cos⁡φ)(x→−x→⋅a→|a→|2a→)+(sin⁡φ)1|a→|a→×r→,

其中

(4.136d)a→×r→=a→×(x→−x→a→)=a→×x→.

优点

  • 是计算机绘图学中的 “标准表示”,

  • 不必确定卡丹角,

  • 不会发生常平架锁定.

缺点 ​

  • 不适用于动画 (即旋转的插值).

4.4.2.5 旋转和四元数 ​

如果将 (4.135f) 中的单位向量 a→ 等同于纯四元数 a― (同时旋转角 φ 保持不变), 那么我们得到

R(a―,φ)=(q02+q12−q22−q322q1q2−2q0q32q1q3+2q0q22q1q2+2q0q3q02−q12+q22−q322q2q3−2q0q12q1q3−2q0q22q2q3+2q0q1q02−q12−q22+q32)=:R(q),

(4.137a)

其中 q0=cos⁡φ2 以及 q―=(q1,q2,q3)T=(ax,ay,az)Tsin⁡φ2 ,即 q 是单位四元数 q=q(a―,φ)=cos⁡φ2+a―sin⁡φ2∈H1 . 如果将向量 x→ 看作 R3∋x→=x1i+x2j+x3k∈ H0 ,那么

(4.137b)R(a―,φ)x―=R(q)x―=qx―q¯.

特别地,旋转矩阵的行是向量 qe―kq¯ :

(4.137c)R(a―,φ)=(q(100)q¯q(010)q¯q(001)q¯)=(qiq¯qjq¯qkq¯)

推论:

  • 旋转矩阵可以借助四元数 q=cos⁡φ2+a―sin⁡φ2 确定.

  • 在四元数乘法的意义下,并且将 R3 等同于纯四元数集 H0 ,对于旋转向量 R(a―,φ) , 有 R(a―,φ)x―=qx―q¯ .

对于每个单位四元数 q∈H1,q 和 −q 确定相同的旋转,所以 H1 是 SO(3) 的双重覆盖. 一个接着一个实施旋转对应于四元数的乘法, 即

(4.138)R(q2)R(q1)=R(q1q2);

并且共轭四元数对应于逆旋转:

(4.139)R−1(q)=R(q¯)

绕轴 60∘ 旋转由 (1,1,1)T 定义. 首先应当将方向向量标准化: a―=13(1,1,1)T . 那么由 sin⁡φ=sin⁡60∘=32 及 cos⁡φ=cos⁡60∘=12 ,可知旋转矩阵成为

R(13(1,1,1)T,60∘)=13(2−1222−1−122).

刻画这个旋转的四元数是

q=q(13(1,1,1)T,60∘)=cos⁡30∘+13(i+j+k)sin⁡30∘=32+13(i+j+k)12=32+36(i+j+k).

还有

q(100)q¯=(32+36(i+j+k))i(32−36(i+j+k))=(32+36(i+j+k))(32i+36−36k+36j)=2436i+2436j−1236k=13(2i+2j−k)≜13(22−1).

可类似地确定另外两列:

q(010)q¯=(32+36(i+j+k))j(32−36(i+j+k))=13(−i+2j+2k)≜13(−122).q(001)q¯=(32+36(i+j+k))k(32−36(i+j+k))=13(2i−j+2k)=∧13(2−12).R13(111),60∘=(q(100)q¯q(010)q¯q(001)q¯)=13(2−1222−1−122)

4.4.2.6 四元数和卡丹角 ​

用卡丹角给出的旋转矩阵 (参见第 395 页 (4.133a, 4.133b)) 恰为单位四元数 q∈H1 的旋转矩阵:

(4.140a)RC(αC,βC,γC)=Rz(γC)Ry(βC)Rx(αC)=(cos⁡βCcos⁡γCsin⁡αCsin⁡βCcos⁡γC−cos⁡αCsin⁡γCcos⁡αCsin⁡βCcos⁡γC+sin⁡αCsin⁡γCcos⁡βCsin⁡γCsin⁡αCsin⁡βCsin⁡γC+cos⁡αCcos⁡γCcos⁡αCsin⁡βCsin⁡γC−sin⁡αCcos⁡γC−sin⁡βCsin⁡αCcos⁡βCcos⁡αCcos⁡βC).

(4.140b)

=[rij]i,j=13(4.140c)=(q02+q12−q22−q322q1q2−2q0q32q1q3+2q0q22q1q2+2q0q3q02−q12+q22−q322q2q3−2q0q12q1q3−2q0q22q2q3+2q0q1q02−q12−q22+q32)=R(0)(4.140d)=(q(100)q¯q(010)q¯q(001)q¯)

比较矩阵元素可得

(4.141a)tan⁡γC=r21r11,sin⁡βC=−r31,tan⁡αC=r32r33.

一般地, 解并不唯一, 这是典型的三角问题. 然而, 可以通过定义域的讨论得到角的唯一性.

反之, 从旋转矩阵容易得到单位四元数:

(4.141b)4q0q1=r32−r23,4q0q2=r13−r31,4q0q3=r21−r12,(4.141c)4q02−1=4q02−q02−q12−q22−q32=r11+r22+r33.

因为 q 和 −q 定义同一个的旋转,可将 q0 确定为

(4.141d)q0=12r11+r22+r33+1.

其他分量是

(4.141e)q1=r32−r234q0,q2=r13−r314q0,q3=r21−r124q0.

设旋转矩阵如下:

R=12(2−1261222126−122013)

(1) 确定卡丹角: 依据上述公式 sin⁡βC=−r31=0 ,所以 βC=kπ,k∈Z . 还有 tan⁡γC=r21r11=1 ,所以 γC=π4+kπ,k∈Z ; 并且由 tan⁡αC=r32r33=13 推出 αC=π6+kπ,k∈Z . 如果将这些角限定为 “最小可能” 的,也就是角的绝对值 ≤π2 ,那么它们是唯一的. 于是这些角是

αC=π6,βC=0,γC=π4.

(2)确定产生这个旋转的单位四元数:

4q02−1=12(2+126+3),

所以

q0=121+12(2+126+3)≈0.8924=cos⁡φ2.

(最小可能的) 角是 φ=53.6474∘ ,所以 sin⁡φ2=0.4512 .

(3) 确定 q 的其他分量及旋转轴的方向 a―=(ax,ay,az)T :

q1=r32−r234q0=12+1424q0≈0.2391, 所以 ax=q1sin⁡φ2≈0.5299.q2=r13−r314q0=12⋅1224q0≈0.0991, 所以 ay=q2sin⁡φ2≈0.2195.q3=r21−r124q0=12(2+126)4q0≈0.3696,所以 az=q3sin⁡φ2≈0.8192.

注 在计算 (4.141e) 中的分量时,当 q0 是零或接近于零时可能出现问题. 在这种情形, 单位四元数不能由 (4.141e) 中的公式确定. 为了理解这种情形, 我们讨论旋转矩阵的迹:

(4.142a)TrR=r11+r22+r33=4q02−1.

如果 TrR>0 ,那么 q0=12TrR+1>0 ,并且可以毫无问题地应用公式 (4.141e). 如果 TrR≤0 ,那么 q0 可以接近于零. 此时要考虑主对角线上的最大元素. 设它是 r11 ,那么 |q1| 大于 |q2| 或 |q3| . 分量 q1,q2,q3 也可以由旋转矩阵的主对角元素确定. 平方根取正号, 可推出

q1=121+r11−r22−r33,q2=121+r22−r11−r33,(4.142b)q3=121+r33−r11−r22.

计算法则 由这些事实可推出下列计算法则:

  • 如果 TrR≤0 ,并且 r11≥r22,r11≥r33 ,那么 q1 的绝对值最大,所以
(4.142c)q0=r32−r234q1,q2=r21+r124q1,q3=r13+r314q1;
  • 如果 TrR≤0 ,并且 r22≥r11,r22≥r33 ,那么 q2 的绝对值最大,所以
(4.142d)q0=r13−r314q2,q1=r21+r124q2,q3=r23+r324q2;
  • 如果 TrR≤0 ,并且 r33≥r11,r33≥r22 ,那么 q3 的绝对值最大,所以
(4.142e)q0=r21−r124q3,q1=r31+r134q3,q2=r23+r324q3.

因为卡丹角定义绕对应轴的旋转, 所以我们可以发现下列表中给出的配置关系. 于是旋转

(4.142f)R(α,β,γ)=R((0,0,1)T,γ)R((0,1,0)T,β)R((1,0,0)T,α)

对应于单位四元数

(4.142g)q=QzQyQx

旋转

卡丹角

绕轴

四元数

RC((1,0,0)T,αC)

αC

x 轴

Qx:=cos⁡αC2+isin⁡αC2

RC((0,1,0)T,βC)

βC

y 轴

Qy:=cos⁡βC2+jsin⁡βC2

RC((0,0,1)T,γC)

γC

z 轴

Qz:=cos⁡γC2+isin⁡γC2

  • 如果已知卡丹角是 αC=π6,βC=0,γC=π4 ,那么刻画这个旋转的四元数可用下列方式确定:
Qx=cos⁡αC2+isin⁡αC2=cos⁡π12+isin⁡π12,Qy=cos⁡βC2+jsin⁡βC2=cos⁡0+jsin⁡0=1,Qz=cos⁡γC2+ksin⁡γC2=cos⁡π8+ksin⁡π8.

最终结果与 399 页给出的是一致的:

q:=QzQyQx=(cos⁡π8+ksin⁡π8)1(cos⁡π12+isin⁡π12)=cos⁡π8⋅cos⁡π12+icos⁡π8⋅sin⁡π12+jsin⁡π8⋅sin⁡π12+ksin⁡π8⋅cos⁡π12=0.8924+0.2391i+0.0991j+0.3696k.

4.4.2.7 算法的有效性 ​

为估计算法的有效性, 我们定义标准运算, 而更复杂的运算都源于这些运算. 关于与其他方法细致而复杂的比较, 可见 [4.26].

令

  • M: 乘法的次数,

◼A:加法和减法的次数,

◼D: 除法的次数,

  • S: 引入标准函数的次数,如三角函数,是由相当次数的乘法、除法和加法的

合成.

◼C: 表达式相比较的次数, 由于中断算法它增加了计算时间.

运算

A

M

D

S

C

四元数化为矩阵

12

12

矩阵化为四元数 (TrR>0)

6

5

1

1

1

矩阵化为四元数 (TrR≤0)

6

5

1

1

3

向量的旋转

A

M

注

用旋转矩阵

6

9

用单位四元数

24

32

正规四元数乘法

用单位四元数

17

24

快速四元数乘法

用单位四元数

18

21

转换为旋转矩阵

旋转

A

M

注

用旋转矩阵

6n

9n

用单位四元数

24n

32n

正规四元数乘法

用单位四元数

17n

24n

快速四元数乘法

用单位四元数

12+6n

12+9n

转换为旋转矩阵

两个旋转的合成

A

M

用旋转矩阵

18

27

用单位四元数

12

16

总结 仅当旋转是一个接一个地进行, 基于四元数的算法才较快. 这主要出现在动画片的计算机绘图 (即旋转的逼近) 中.

version 1.24.0