三维旋转:旋转矩阵,欧拉角,四元数 - 一叶斋主人 - 博客园
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
博问
闪存
联系
订阅
管理
一叶斋
一叶障目,一叶知秋三维旋转:旋转矩阵,欧拉角,四元数
原文见我的博客主站,欢迎大家过去评论。如何描述三维空间中刚体的旋转,是个有趣的问题。具体地说,就是刚体上的任意一个点P(x, y, z)围绕过原点的轴(i, j, k)旋转θ,求旋转后的点P\'(x\',y\', z\')。
旋转矩阵
旋转矩阵乘以点P的齐次坐标,得到旋转后的点P',因此旋转矩阵可以描述旋转,
绕x,y,或z轴旋转θ的矩阵为:
所以,绕任意轴旋转的矩阵为
这表示:
1. 绕x轴旋转角度p使指定的旋转轴在xz平面上
2. 绕y轴旋转角度q使指定的旋转轴与z轴重合
3. 绕z轴旋转角度θ
4. 绕y轴旋转角度-q
5. 绕x轴旋转角度-p
其中,p和q的值需要用i,j,k计算出来。
;1э79
888Q ΣR ΣS Σ/:<
;;;
7988Q R S /:<
;;&g';1Q 79/
...amqg qg l g .Иqg l g
amqg :<&g';1R 79amqg .qg l g ./
.Иqg
l g .amqg :<&g';1S 79amqg qg l g .Иqg
l g amqg ...
/:<
&ИI'э&ИJ'э
&g'э&J'э&I'1Q 1R 1S 1R 1Q 公告
非计算机专业出身的计算机爱好者,中科院某所硕士研究生在读。理想是做一名一流的游戏设计师,目前正在广泛涉猎中。博客主站:
我的邮箱: xieguanglei@ 我的QQ: 280138635
随笔分类(48)
leetcode 刷题笔录(7)
Three.js Demo 源码笔记(1)Three.js 教程翻译(6)Three.js 源码笔记(5)
WebGL 原生 API 笔记(4)编程语言笔记(9)
计算机图形学笔记(1)开发环境和开发工具算法导论笔记(13)我的 Demo(2)
积分与排名
积分 - 55008
排名 - 2619
欧拉角
欧拉角也可以描述三维刚体旋转,它将刚体绕过原点的轴(i,j,k)旋转θ,分解成三步(蓝色是起始坐标系,而红色的是旋转之后的坐标系。)。
1. 绕z轴旋转α,使x轴与N轴重合,N轴是旋转前后两个坐标系x-y平面的交线
2. 绕x轴(也就是N轴)旋转β,使z轴与旋转后的z 轴重合
3. 绕z轴旋转γ,使坐标系与旋转后的完全重合按照旋转轴的顺序,该组欧拉角被称为是“zxz顺规”的。对于顺规的次序,学术界没有明确的约定。
欧拉角的旋转矩阵为:
在旋转矩阵一节中,最先进行的旋转其矩阵在最右侧,说明该矩阵最先与点的齐次坐标相乘,旋转矩阵按照旋转的次序从右向左排列。而在欧拉角中,最先进行的旋转其旋转矩阵在最左边。这是因为,**对于前者(旋转矩阵),我们始终是以绝对参考系为参照来的,对于后者(欧拉角),我们每一次旋转的刻画都是基于刚体的坐标系。**比如,在欧拉角中的第2步,绕x轴旋转β,这里的x轴实际上是N轴了(而不是蓝色的x轴)。
为什么旋转参考系的不同会导致旋转矩阵次序的差异呢?细想一下便知,旋转矩阵左乘叠加用以描述三维变换效果的叠加,这本身就是基于绝对坐标系的,所以旋转矩阵一节没有疑问;而对于欧拉角一
&`'э&a'э&b'
1S 1Q 1S
节的这种旋转方式,这样考虑:
1. 如果有一个“影子坐标系3”与原坐标系重合,然后首先进行了第3步(绕z轴旋转γ);
2. 然后有一个“影子坐标系2”也与原坐标系重合,然后与“影子坐标系3”一起(视作同一个刚体)进行了第二步;
3. 最后一个“影子坐标系1”,与前两个坐标系一起进行了第一步。
此时,考察“影子坐标系”1和2,他们就分别落在了欧拉角旋转的两个“快照”上,而“影子坐标系3”就落在旋转后的位置上(红色的)。而在上述过程中,“影子坐标系3”就是相对于绝对坐标系依次进行了第三步,第二步,和第一步。所以欧拉角的旋转矩阵写成那样,也是行得通的。这个想法,我猜在很多第一人称游戏中,已经得到了广泛应用了。这样,玩家对人物的控制就可以绕开人物的实时状态(位置,角度等)直接对人物的模型矩阵产生影响。
万向节死锁是欧拉角的一个弊端,这是一个直观的例子。
四元数
四元数是今天的主角,它能够很方便的刻画刚体绕任意轴的旋转。四元数是一种高阶复数,四元数q 表示为:
其中,i,j,k满足:
由于i,j,k的性质和笛卡尔坐标系三个轴叉乘的性质很像,所以可以将四元数写成一个向量和一个实数组合的形式:
可以推导出四元数的一些运算性质,包括:* 四元数乘法
J ;&Q*R*S*P ';QB)RC )SD )P
;;;И/B 0C 0D 0B C ;D*CD ;B *DB;C
J ;&)P ';&&Q*R*S'*P 'O Τ
δδδδδδ
* 共轭四元数
* 四元数的平方模
* 四元数的逆
四元数可以看做是向量和实数的一种更加一般的形式,向量可以视作为实部为0的四元数,而实数可以是作为虚部为0的四元数。上述四元数的运算性质也是实数或向量的运算性质的更一般的形式。四元数可用来刻画三维空间中的旋转,绕单位向量(x,y,z)表示的轴旋转θ,可令:
刚体坐标系中的点p(P,0)(写成四元数的形式),旋转后的坐标p'为:
接下来我们来证明这一点。首先,我们证明
其中s为实数。显然
此时,我们可以将q看做是单位矩阵,因为如果q不是单位矩阵,我们就可以乘以一个常数s将其化为单位矩阵。
然后,我们证明qpq^{-1}和p的模长相等下面将q视为单位四元数:
四元数q的标量:
J/J0;&·))*Иэ
'O /δO 0δP /O 0δP 0O /δP /P 0O /δO 0δ
;&И*P 'J МO Τ
-&J';-&
')O ΤP 0;
J
И/
J М-&J'
J ;&&Q*R*S'qg l *amq '
g 0g
;JI I ΣJ
И/
JI ;&LJ'I&LJ J И/
'
И/
&LJ'I&LJ ;LJI ;LJ '
И/
J И/L И/I
И/
;J И/J
М