从内旋到外旋(一)--例说相似变换
目录
在使用OpenGL编程的过程里,难免要处理刚体转动的问题。而处理此类问题往往要用到欧拉角。欧拉角的转动分为3步:进动、章动、自转(见前面的博客阐述欧拉角概念-CSDN博客),而且都是绕着附着于刚体的内部坐标系的轴转动,所以转动的第二、第三步里的转轴指向是受第一步转动影响的。
所以处理这类问题最棘手的点在于,虽然一开始附着于刚体的内部坐标系(或者叫刚体坐标系)与世界坐标系(或者叫外部坐标系、固定坐标系)重合。但是完成进动(也就是第一步)以后,内部坐标系就不再与世界坐标系重合了,这就让后面的转动很难被描述清楚。假如能够把绕内部坐标轴的转动等价为绕世界坐标系的转动,问题就变得容易处理的多,因为世界坐标系是固定的。
我们把绕内部坐标系的转轴做的旋转叫做内旋,把绕着外部坐标系的坐标轴的旋转叫做外旋。
神奇的是,利用线性代数知识,我们可以通过相似变换把内旋转换成效果等价的外旋。
从一个例子入手介绍什么是相似变换。
场景
假设一个人站在潜水艇的中央,目光直视前方。而潜水艇坐标系与世界坐标系重合。此时人的视线用一个世界坐标系的矢量表示

步骤1
人移动目光到别处,让他注视潜艇里某个固定位置。这相当于矢量做了一个旋转变换L(L既等于内部坐标系下的旋转变换,又等于世界坐标系下的旋转变换,因为此时潜水艇坐标系与世界坐标系重合)。假设变换后矢量变为
(
也是世界坐标系下的矢量),则
= L *
(1)

步骤2
保持人的视线在潜艇内部不动,继续注视潜艇内同一个位置。让潜艇转动。那么潜艇将经历旋转变换,用矩阵R表示。显然,在世界坐标系下,人的视线也旋转了,而且这个旋转的操作同样用R表示。用表示潜艇旋转后,人的视线在世界坐标系下的矢量。
= R *
换言之,
=
*
(2)
假如此时人仍然平视的话,平视矢量将变为
= R *

换言之,
=
*
(3)
把(2)(3)代入(1)
*
= L *
*
两边同时乘以R,
= R * L *
*
结论
已知两个矢量,在内部坐标系里的表示是(a1,a2,a3,.....)--这里指的就是 ,(b1,b2,b3......)--这里指的就是
,且已知(a1,a2,a3,.....)可以通过与矩阵L的旋转变换乘法得到(b1,b2,b3......),也即:
那么这两个矢量在世界坐标系的表示(c1,c2,c3,.....)--这里指的就是,和(d1,d2,d3......)--这里指的就是
,之间也可以通过旋转矩阵
乘法完成旋转变换,且:
= R * L *
R是局部坐标系相对于世界坐标系的转动矩阵, 是其逆矩阵。
形如 = R * L *
的变换就是相似变换。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)