Lazy loaded image
欧拉角,万向锁,四元数
Words 1064Read Time 3 min
2023-5-20
2025-4-3
type
status
date
slug
summary
tags
category
icon
password
接触unity也有一段时间了,在开发第三人称操控模式时经常会用到欧拉角转四元数,但原理层面却没有理解,下面用这篇文章记录下我个人对欧拉角和四元数的浅薄理解。

欧拉角

欧拉角是三个角度,其实很好理解,就是在三维空间中物体绕着三个坐标轴(xyz)依次旋转对应的角度。绕轴旋转的次序也不做限定。但是实际开发中欧拉角会产生一个问题,就是万向节死锁——万向锁。

万向锁

那么欧拉角为什么会产生万向锁的问题呢?其实有个限定条件:当我们对三个轴依次旋转且旋转次序中的第二条旋转轴为90°或-90°时,你会发现此时你对第三条轴做对应的旋转后得到的物体姿态同样可以在对第一条轴做旋转来得到,为了便于理解,我们可以用一个例子来解释下这个现象。
拿出你此时正在看博客的手机平放在桌面上。让手机的长边垂直于你,短边平行于你。依此简历xy轴,z轴则垂直于xy轴。此时将手机绕x轴也就是手机长边旋转30°,绕y轴也就是短边旋转90°,此时手机的姿态应该是面向你的偏左边或偏右边。然后此时将手机绕z轴旋转10°,你会发现此时你的手机姿态和你一开始绕x轴旋转30°±10°,再绕y轴旋转90°是一样的。也就是说你完全可以不用绕z轴旋转,通过调节绕x轴旋转的角度,就能使最终手机的姿态和绕xyz三个轴旋转的姿态一样。此时这种只绕两个轴旋转就能取代绕三个轴旋转的问题就是万向锁问题。
理解欧拉角造成万向锁问题的关键就是:欧拉角做的旋转变换其实就是物体从原始状态到目标状态的变换,当你第二个轴旋转了90°后,绕第一条轴和第三条轴旋转达到的效果已经是一样的了,此时整个欧拉角三轴旋转其时只有两条轴在起作用。那么在开发中我们可以如何去解决这个问题呢?这时候四元数就派上用场了。

四元数

在了解四元数前,我们先要了解四维空间。单说四维空间可能很难理解,但是三维空间就好理解了,三维空间(x,y,z),当z=0时(x,y,0)就可以看成是此三维空间的二维子空间,同理四维空间(x,y,z,w)当w=0时可以看成三维是三维子空间。
四元数其实就是四维空间中的一个点,满足w²+x²+y²+z²=1;其实自由度并没有四个维度,由于存在w²+x²+y²+z²=1这个约束,它的自由度其实只有3。用单位四元数对三维向量进行操作,就是将三维向量映射到四维的三维子空间中,然后对其进行旋转,最终得到的结果依然是这个三维子空间的,所以可以映射回三维空间。
由于四元数不存在旋转次序的问题,所以不会丢失维度,也就不会产生万向锁问题。
💡
四元数底层其实要用复数去理解,它有三个虚部。想进一步了解的可以看这篇文章

总结

这篇文章只是写了欧拉角和四元数的简单理解,更底层的理解要涉及到矩阵向量和复数方面,这里就不多赘述了,因为我自己对这块也没有很好的理解,就不班门弄斧了。
上一篇
Unity资源查找工具分享
下一篇
算法:A星寻路(含实例)

Comments
Loading...