四元数与欧拉角(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
下面我们在笛卡尔坐标系中考虑四元数。
考虑如下绕任意旋转轴的旋转:旋转轴与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实现多点触控代码
- 在Unity中实现动画的正反播放代码
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- [软件资讯]Unity已支持将3D游戏导出成Flash
- 三维漫游飞行路径建立方法与插值算法
- 十九个国内外主流的三维GIS
- Unity 武器拖尾效果
- unity常见问题之20题
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- Unity 预编译宏
- VS2013中 命名空间“UnityEngine”中不存在类型或命名空间名称“UI”。是否缺少程序集引用?
- Unity3D占用内存太大的解决方法
- 【Unity】安卓项目使用带有资源Jar包SDK的打包方法
- 在IOS APP中反复打开和关闭Unity页面