Skip to content

4.4.2 R3 中旋转的表示

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

等式

(4.130a)w=Rv

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

(4.130b)R1=RT,

并且 (4.130a) 等价于

(4.130c)w=R1w=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β010sinβ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γCcosαCsinγCcosαCsinβCcosγC+sinαCsinγCcosβCsinγCsinαCsinβCsinγC+cosαCcosγCcosαCsinβCsinγCsinαCcosγCsinβ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,ay 轴旋转到 x,y 平面: a=R1a . 结果是: 向量 a 位于 x,y 平面上.

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

(4.135a)R1=(axax2+az20azax2+az2010azax2+az20axax2+az2),(4.135b)R2=(ax2+az2ay0ayax2+az20001).

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

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

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

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

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

(4.135d)R21=(ax2+az2ay0ayax2+az20001),(4.135e)R11=(axax2+az20azax2+az2010azax2+az20axax2+az2).

最后, 合成矩阵是

R(a,φ)(4.135f)=R11R21R3R2R1=(cosφ+ax2(1cosφ)axay(1cosφ)azsinφaxaz(1cosφ)+aysinφayax(1cosφ)+azsinφcosφ+ay2(1cosφ)ayaz(1cosφ)axsinφazax(1cosφ)aysinφazay(1cosφ)+axsinφcosφ+az2(1cosφ)).

(4.135g)

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

Rx=R(a,φ)x(4.136a)=(cosφ)x+(1cosφ)xa|a|2a+sinφ|a|a×x(4.136b)=(cosφ)x+(1cosφ)xa+(sinφ)a|a|×x.

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

xa+(cosφ)r+(sinφ)r(4.136c)=xa|a|2a+(cosφ)(xxa|a|2a)+(sinφ)1|a|a×r,

其中

(4.136d)a×r=a×(xxa)=a×x.

优点

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

  • 不必确定卡丹角,

  • 不会发生常平架锁定.

缺点

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

4.4.2.5 旋转和四元数

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

R(a,φ)=(q02+q12q22q322q1q22q0q32q1q3+2q0q22q1q2+2q0q3q02q12+q22q322q2q32q0q12q1q32q0q22q2q3+2q0q1q02q12q22+q32)=:R(q),

(4.137a)

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

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

特别地,旋转矩阵的行是向量 qekq¯ :

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

推论:

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

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

对于每个单位四元数 qH1,qq 确定相同的旋转,所以 H1SO(3) 的双重覆盖. 一个接着一个实施旋转对应于四元数的乘法, 即

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

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

(4.139)R1(q)=R(q¯)

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

R(13(1,1,1)T,60)=13(212221122).

刻画这个旋转的四元数是

q=q(13(1,1,1)T,60)=cos30+13(i+j+k)sin30=32+13(i+j+k)12=32+36(i+j+k).

还有

q(100)q¯=(32+36(i+j+k))i(3236(i+j+k))=(32+36(i+j+k))(32i+3636k+36j)=2436i+2436j1236k=13(2i+2jk)13(221).

可类似地确定另外两列:

q(010)q¯=(32+36(i+j+k))j(3236(i+j+k))=13(i+2j+2k)13(122).q(001)q¯=(32+36(i+j+k))k(3236(i+j+k))=13(2ij+2k)=13(212).R13(111),60=(q(100)q¯q(010)q¯q(001)q¯)=13(212221122)

4.4.2.6 四元数和卡丹角

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

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

(4.140b)

=[rij]i,j=13(4.140c)=(q02+q12q22q322q1q22q0q32q1q3+2q0q22q1q2+2q0q3q02q12+q22q322q2q32q0q12q1q32q0q22q2q3+2q0q1q02q12q22+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=r32r23,4q0q2=r13r31,4q0q3=r21r12,(4.141c)4q021=4q02q02q12q22q32=r11+r22+r33.

因为 qq 定义同一个的旋转,可将 q0 确定为

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

其他分量是

(4.141e)q1=r32r234q0,q2=r13r314q0,q3=r21r124q0.

设旋转矩阵如下:

R=12(21261222126122013)

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

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

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

4q021=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=r32r234q0=12+1424q00.2391, 所以 ax=q1sinφ20.5299.q2=r13r314q0=121224q00.0991, 所以 ay=q2sinφ20.2195.q3=r21r124q0=12(2+126)4q00.3696,所以 az=q3sinφ20.8192.

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

(4.142a)TrR=r11+r22+r33=4q021.

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

q1=121+r11r22r33,q2=121+r22r11r33,(4.142b)q3=121+r33r11r22.

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

  • 如果 TrR0 ,并且 r11r22,r11r33 ,那么 q1 的绝对值最大,所以
(4.142c)q0=r32r234q1,q2=r21+r124q1,q3=r13+r314q1;
  • 如果 TrR0 ,并且 r22r11,r22r33 ,那么 q2 的绝对值最大,所以
(4.142d)q0=r13r314q2,q1=r21+r124q2,q3=r23+r324q2;
  • 如果 TrR0 ,并且 r33r11,r33r22 ,那么 q3 的绝对值最大,所以
(4.142e)q0=r21r124q3,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=cos0+jsin0=1,Qz=cosγC2+ksinγC2=cosπ8+ksinπ8.

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

q:=QzQyQx=(cosπ8+ksinπ8)1(cosπ12+isinπ12)=cosπ8cosπ12+icosπ8sinπ12+jsinπ8sinπ12+ksinπ8cosπ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

矩阵化为四元数 (TrR0)

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