c++四元式中算术表达式的翻译_头条 | 一文详解四元数、欧拉角、旋转矩阵、轴角如何相互转换...

点击上方蓝字,关注本公众号,获得更多资源 6298d8bd24f87efc1277c826e2125fea.gif

ef0d1d753a882384f003daca4dbd570b.png

欧拉角与旋转矩阵

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

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。

dd25f5ff3c74da7226d6fb6a2cc304ec.png

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

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

参考一下维基百科的[3]Euler Angle、[4]Rotation Matrix

可以知道,欧拉角构造旋转矩阵就直接把三个Elemental Rotation Matrix乘在一起就好了(LaTeX扣得真累orz): cdc34f72-c661-eb11-8da9-e4434bdf6706.svg 其中: cfc34f72-c661-eb11-8da9-e4434bdf6706.svg 上面的欧拉角--->矩阵的结果与维基百科Euler Angles[3]  d1c34f72-c661-eb11-8da9-e4434bdf6706.svg  给出的结果一致,那应该稳了:
b3183801084e2b7e2d183a858637efe9.png 图:其实可以不用自己推的,维基百科把12种顺规乘出来的矩阵都写出来了
旋转矩阵---->欧拉角 参考一篇NASA的关于姿态描述的技术报告[1]的Appendix-A6和[5],我们可以用旋转矩阵元素的相乘、相除、反三角函数等操作去“凑”出欧拉角。[5]给出了从XYZ顺规提取欧拉角的方法、步骤、思路,[1]则给出了全部12种顺规的欧拉角提取公式,但是没有给一些细节注意事项。所以总结一下,根据[1]、[5]、[7]《Real Time Rendering 3rd Edition》4.2.2和自己的推导,从ZXY顺规旋转矩阵提取欧拉角的公式是([1]原文下标似乎有点小问题):
  • Y axis yaw angle:
d5c34f72-c661-eb11-8da9-e4434bdf6706.svg
  • X axis pitch angle:
d7c34f72-c661-eb11-8da9-e4434bdf6706.svg
  • Z axis roll angle:
dec34f72-c661-eb11-8da9-e4434bdf6706.svg . 注意到一点,注意到矩阵的每一个元素都是pitch angle  e0c34f72-c661-eb11-8da9-e4434bdf6706.svg  的函数…所以当  e1c34f72-c661-eb11-8da9-e4434bdf6706.svg  即  e2c34f72-c661-eb11-8da9-e4434bdf6706.svg  的时候,这时候其他的欧拉角提取表达式就凉凉了(分子分母都是0, arctan和atan2都没有意义了)….其实pitch angle  e3c34f72-c661-eb11-8da9-e4434bdf6706.svg  恰好就是Gimbal Lock的位置。在Gimba
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值