四元数表示3d空间旋转使用总结
最近在写一个小游戏,用到一些使用4元数表示旋转的地方,特此总结一下;
1. 关于四元数
再简单讲一下我对四元数的理解吧;和二元数(虚数)类似,4元数可以表示3个自由度的旋转,或者4个自由度的拉伸或者旋转(二元数可以表示1个自由度的2d旋转或者2个自由度的2d拉伸或者旋转);表示的方法就是简单的乘法(左乘,2维旋转交换无所谓左右乘)。
和单位虚数一样,单位四元数构成一个群,单位虚数群是交换的,单位四元数群不交换。
四元数和二元数最大的不同在于,二元数乘法可以直观表示在2d坐标轴上,四元数不可以因为我们3维生物认识不到4维空间,而且单位四元数应该是用来表示4维空间的旋转的,而不是3维,至于为什么四元数可以表示3维空间的旋转,是出于一个美丽的巧合,关于这个巧合可以参见我另外一篇关于四元数的文章 – 一句话理解四元数。
2. 一个经过旋转的3d Game Object,他的x, y, z轴分别用什么世界空间的向量表示?拓展到任何方向呢?
不知道有没有游戏引擎会提供这个功能,反正我用的游戏引擎没有。不过这是小事情,借助四元数可以非常容易的实现。
大多数引擎会提供一个api,对于游戏中的一个对象,返回它当前的旋转四元数(或者与之等价的其他数据结构, 转化到四元数也比较简单)。因为单位四元数是一个群, 所以我们直接用我们想知道的向量(比如Vec3(x = 0, y = 1, z = 0)表示y轴方向向量)进行一次共轭四元数乘法就可以了。这样我们获得的向量就是以这个对象为参照系下的向量在世界坐标系下的向量方向了。
3. 求旋转一个向量到另一个向量上的四元数
给出起点向量 s 和终点向量 t , 如何找到一个四元数表示这个旋转?这是我最近在游戏中碰到的一个问题,其实很简单,具体思路是:
- 找到一个垂直s,和t向量的向量o;
- 找到向量s和t的夹角;
- 根据向量o和夹角构造4元数
3.1. 向量夹角与旋转方向的表示
先说夹角吧,其实这个内容在计算机图形学里讲的比较清楚, 不过我还是记录一下吧,过两天空了把学习计算机图形学的一些心得总结上来。
向量夹角一般使用 c o s θ cos\theta cosθ 来表示,