三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换

您所在的位置:网站首页 轴面角和线角的区别 三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换

三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换

2024-07-14 16:55| 来源: 网络整理| 查看: 265

三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换 0 引言

有一个小需求是要实现鼠标拖动球体的转动,然后发现我不再能只用欧拉角来糊弄过去了。然后又发现,网上大部分资料的采用的欧拉角顺规都是xyz,然后我基于D3D11的辣鸡框架用了zxy,公式不太能直接套用,于是摸了两三天鱼,整理了一下几种三维旋转表示(欧拉角,四元数,旋转矩阵,轴角)与他们之间的相互转换的资料,并且加入了自己的一些推导,给出这些转换公式的推导思路和细节,这样子如果各位想使用其他欧拉角顺规和定义的时候,自己动手算一算就好了。

至于这几种三维旋转的表示形式随手百度Google都可以看到很多科普文的,这里着重说一下他们之间的转换的细节吧(不少公式和推导,预警一波,如果有错误请指出~)

image

图:下文介绍的几种转换路径

image

附赠自动驾驶学习资料和量产经验:链接 1 欧拉角(Euler Angle)与旋转矩阵(Rotation Matrix)

1.1 欧拉角 ----> 旋转矩阵

D3D和OpenGL不同,用的坐标系是Y轴竖直向上的左手系,所以欧拉角的顺规是跟广大blog、OpenGL不一样的,那么博客上、甚至维基百科[2]上的各种基于右手系xyz顺规(分别对应roll, pitch,yaw)的看起来就不太能随随便便直接用了。

首先欧拉角旋转序列(Euler Angle Rotational Sequence)一共有12种顺规,6种绕三条轴的旋转(也叫Tait-Bryan Angle,XYZ,XZY,YXZ,YZX,ZXY,ZYX),另外6种只绕两条轴的旋转(也叫Proper Euler Angle,XYX,YXY,XZX,ZXZ,YZY,ZYZ)。如果相邻两次旋转是绕同一条轴,例如XXY,那么其实可以坍缩成XY。那么只绕一条轴旋转就根本不够自由度就不需要说了。也就是说,一共有12种基础旋转的组合顺序,它们可以旋转出三维的所有旋转状态。所以一共是12种旋转顺规(可以表示所有旋转的集合),DirectXMath库采用的是ZXY顺规,分别对应着Z-Roll,X-Pitch,Y-Yaw。

image

图:欧拉旋转与Yaw-Pitch-Roll的直观意义(网图魔改)

注意:那么下文我们都采用ZXY顺规来推导公式!采用列主向量(column major)!(但是注意DirectXMath API生成的矩阵其实是行主向量(row major)的)

参考一下维基百科的

[3]Euler Angle

Euler angles - Wikipedia​en.wikipedia.org/wiki/Euler_anglesimage

[4]Rotation Matrix

Rotation matrix - Wikipedia​en.wikipedia.org/wiki/Rotation_matriximage

欧拉角构造旋转矩阵就直接把三个Elemental Rotation Matrix乘在一起就好了(LaTeX扣得真累orz):

image

这里要提一嘴内旋(intrinsic rotation)和外旋(extrinsic rotation):内旋的每个elemental绕的是object space basis的轴,外旋的每个elemental rotation绕的是world space(惯性系)basis的轴。上面的矩阵之所以是这么个顺序,是因为:

采用了ZXY顺规

采用列主向量

采用外旋的约定(毕竟在图形学里常用euler angle去表示物体相对于惯性系的旋转姿态)

image

在这规定下,上面的矩阵就是先roll Z,再pitch X,再yaw Y。

image

image

图:其实可以不用自己推的,维基百科把12种顺规乘出来的矩阵都写出来了

.

1.2 旋转矩阵----> 欧拉角

参考一篇NASA的关于姿态描述的技术报告[1]的Appendix-A6和[5],我们可以用旋转矩阵元素的相乘、相除、反三角函数等操作去“凑”出欧拉角。[5]给出了从XYZ顺规提取欧拉角的方法、步骤、思路,[1]则给出了全部12种顺规的欧拉角提取公式,但是没有给一些细节注意事项。所以总结一下,根据[1]、[5]、[7]《Real Time Rendering 3rd Edition》4.2.2和自己的推导,从ZXY顺规旋转矩阵提取欧拉角的公式是([1]原文下标似乎有点小问题):

image

image

image

.

从旋转矩阵提取欧拉角的公式跟欧拉角顺规的选取有关,因为旋转矩阵的元素会略有不同,但是思路都是一样的,就是根据旋转矩阵的解析表达式+反三角函数凑出来23333。

2 四元数(Quaternion)与旋转矩阵

2.1 四元数---->旋转矩阵

image

.

2.2 旋转矩阵---->四元数

image

3 欧拉角与四元数

3.1 欧拉角---->四元数

image

Conversion between quaternions and Euler angles​en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Euler_Angles_to_Quaternion_Conversionimage

image

https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770019231.pdf​ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770019231.pdf

image

.

3.2 四元数---->欧拉角

本来我以为,从四元数提取欧拉角的思路可以跟旋转矩阵提取欧拉角类似,也是用四元数的元素运算和反三角函数凑出公式来。后来我发现这简直就是一个极其硬核的任务,展开之后每一项都是六次多项式,画面有一丢暴力且少儿不宜,直接强行凑的话画风大概是这样:

image

这个结果跟欧拉角参数化的旋转矩阵的 image 的表达式是吻合的。但这还只是最好凑的那一个,惹不起惹不起。所以舒服的思路还是四元数–>旋转矩阵–>欧拉角,想一步到位的话,把四元数分量参数化的旋转矩阵、欧拉角参数化的旋转矩阵结合在一起,参考下旋转矩阵转欧拉角的方法,替换下元素就完事了。这里就不把公式展开了,因为四元数直接转欧拉角 跟 旋转矩阵转欧拉角一样,依旧是要处理gimbal lock的corner case,还是那么麻烦,所以这里先鸽了23333

4 轴-角(Axis-Angle)

4.1 轴角---->四元数

image

.

4.2 轴角---->旋转矩阵

Axis Angle转Rotation Matrix可以从[9]罗德里格斯旋转公式Rodrigues Rotation Formula开始推导。

https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula​en.wikipedia.org/wiki/Rodrigues%27_rotation_formulaimage

Rodrigues’ rotation formula

Rodrigues’ rotation formula​en.wikipedia.org/wiki/Rodrigues%27_rotation_formulaimage

image

这个公式的推导思路是这样子的,我们先对向量 v 进行正交分解,分解成投影到旋转轴 k 的分量和垂直于 k 的分量:

image

image

图:魔性p图,假设k和v都在屏幕这个平面上吧

image

Cross product - Wikipedia​en.wikipedia.org/wiki/Cross_product#Conversion_to_matrix_multiplicationimage

于是罗德里格斯旋转公式的变换就可以写成矩阵形式:

image



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3