您的位置:首页 > 移动开发 > Unity3D

四元数与欧拉角(yaw roll pitch)转换公式与推导,以及它们unity中的不同

2015-07-29 09:52 537 查看
四元数是一个高阶复数,它可以表示三维空间绕任意旋转轴旋转的变换。
下面我们在笛卡尔坐标系中考虑四元数。
 
考虑如下绕任意旋转轴的旋转:旋转轴与x,y,z轴的夹角分别为

,绕该轴旋转角

。则我们可以得到这个四元数:



写成复数形式为



 
利用欧拉角也可以实现一个物体在空间的旋转,它按照既定的顺序,如依次绕z,y,x分别旋转一个固定角度,使用roll,yaw ,pitch分别表示物体绕,x,y,z的旋转角度,记为

,可以利用三个四元数依次表示这三次旋转,即:



我们知道变换矩阵相乘可以复合两次变换,四元数相乘的意义也是复合两次变换,与矩阵相乘一样不符合交换律,符合结合律,因此
Q=Q1Q2Q3
就代表了这个欧拉旋转的四元数。四元数乘法具有如下规则:
i^2=j^2=k^2=-1
ij=k、ji=-k、jk=i、kj=-i、ki=j、ik=-j
举个例子:
x = 3 + I, y = 5i + j - 2k
那么:
xy =( {3 + i} )( {5i + j - 2k} ) = 15i +3j - 6k + 5i^2 + ij - 2ik= 15i + 3j - 6k - 5 + k + 2j = - 5 + 15i + 5j - 5k
因此,通过相乘计算可以得到欧拉角到四元数的变换公式:
 


这个公式并不是unity中的变换公式,有以下两点不同:
1. unity的欧拉角旋转顺序为z-x-y,非以上推导的z-y-x,因此推导中交换Q2Q3,得到Q'=Q1Q3Q2
2. 通过第一步改变后,仍然与unity中不同,这是由于本文推导一开始假设了笛卡尔坐标系,而unity中的坐标系是左手坐标系,因此任取一个坐标轴将其反向,角发生了变化,重新代入Q'中,我们可以得到Q''为最终的正确变换

还有一点,那就是绕第二个旋转轴旋转90度会出现万向锁问题(简单的说,就是在第二次旋转的时候把第三个旋转轴转到了第一个轴所在的位置,使得第三次的旋转无效),导致无法表示任意旋转,在unity中绕x旋转90度时,系统会改为270,四元数各部全部取反。

因此,unity中的变换如下



参考资料
https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles http://baike.baidu.com/link?url=NA09CdOpOe2uHUsSaj3w9Io2YD1MLK3ir4OFD25XxttgyMoMTcyvcfXh8K6pJNfptQYo6hQ2CMWmu-zxAeZnFq
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 三维