Direct3D-3 四元数

时间:2022-04-28 11:29:50

    其实本来这篇文章是打算接上篇的各种变化矩阵的推导了,想了想,还是先讲四元数吧。本人的文章并不会提到欧拉角,因为我自己没弄懂欧拉角的万向锁问题。

    很多人学习数学时,会有这样一个疑惑,这东西有什么用。那四元数是用来干什么的。四元数是由哈密顿在1843年发现的,但是直到1985年Shoemake才将其引入计算机图形学,四元数的作用极其简单,用来表示3D物体的方位及旋转

Direct3D-3 四元数    一个3D物体放在世界中,只有一个位置坐标是不够的,这样意味着他总是朝着某一个方向。比如说,我们的头,我们可以摇头,点头,左右卖萌。在三个方向上有3个不同的旋转角度,来确定这个物体的摆向

 

    但是这不意味着描述方位和旋转只需要3个量就可以了吗,为什么是四元数而不是三元数?至于这个问题,我不讨论,事实上用3个角度描述方位的办法叫做 "欧拉角"。欧拉角带有各种天生的缺陷,他唯一的优点是比四元数节省(32bit?)。这种形式上的内存节省毫无必要,xnamath的数学库里用的最多的还是xmvector,4个float。但是问题是我们怎么用4个量来描述3个轴上的问题,当然,这时候要请动数学出山

    理解四元数并不需要真的在3D中去理解,我们可以降维到2D中,2D中是什么,2D中是复数,复数这东西想必大家都学过,也了解各种各样的运算法则,但是你可能错过了复数的一些有意思的地方,容我讲解

    (基础的复数知识请自习补充)

Direct3D-3 四元数    复数在复平面中是一个点,所以我们可以使用极坐标来表示

Direct3D-3 四元数

    我们现在 把两个复数乘起来,但是是以极坐标的方式,Direct3D-3 四元数Direct3D-3 四元数

Direct3D-3 四元数    

我们使 R2 = 1,Direct3D-3 四元数,事实上这个式子表示了 绕z1旋转 θ2度的结果!如下图所示

事实上Direct3D-3 四元数 ,一个复数乘上一个单位复数(模等于1)的结果等于该复数绕单位复数与x轴所成的角度旋转,我们把Z2 作用到了Z1 上面,那么如此同理的结论我们可以推到四元数上面,让我们来看看四元数是在怎么定义的.

四元数和复数差不了太多,唯一的区别是他有三个虚部,他和复数的运算规则大同小异,下图是他的数学定义

Direct3D-3 四元数

那么最重要的当然是两个四元数相乘:

    Direct3D-3 四元数

一些其他的数学操作:

Direct3D-3 四元数

当然,我们用其表示旋转的时候,是个单位四元数,其模等于 1,也就是说可以写成下面这种形式

Direct3D-3 四元数

    我们还可以根据欧拉公式推出log和pow运算 Direct3D-3 四元数这样推出Direct3D-3 四元数

Direct3D-3 四元数

上面的两个公式的意义不大,因为我学习四元数的时候压根没学到过这个,不过也可以作为补充了。

有人会对下面这个式子表示疑惑,这个Uq是什么,还有φ是多少度,给张直观的几何图帮助大家理解

Direct3D-3 四元数Direct3D-3 四元数

这个变换实际上是绕着这个轴旋转了两倍的角度

 

当然还有一个细节是,与复数不同的是,旋转并不是只乘上一个四元数就可以收工了的,而是这样的:Direct3D-3 四元数,但是比较难的一点是我们不能从需要绕Uq轴旋转两倍角度推导出这个式子,而是要从这个式子推导出这个P旋转了两倍角度这样一个事实。对了,还忘记了没讲Uq是怎么推导的。现在给出一下

解:

    因为Direct3D-3 四元数是个单位向量,所以Direct3D-3 四元数,这表明了Direct3D-3 四元数。值得注意的是旋转角度只需要从0-π就行了。事实上就是我们找一个映射 f = Direct3D-3 四元数,从区间[0,π] → 区间[-1,1].我们很容易能找到这样一个函数,那就是cos θ,故 Direct3D-3 四元数 = cos θ

Direct3D-3 四元数

再根据三角公式 Direct3D-3 四元数 可以推出 Direct3D-3 四元数 .于是很显然的,我们可以推出 Uq,也就是旋转轴

Direct3D-3 四元数
Direct3D-3 四元数

Direct3D-3 四元数 (这里的n 就是 Uq) Direct3D-3 四元数

当然,共轨就可以是 Direct3D-3 四元数

 

让我们回到开始的那个式子,构造一下这个乘积 Direct3D-3 四元数。为了简单化,我们让p的第4分量等于0,这表示他是个点

Direct3D-3 四元数

 

实数部分非常简单,算出来的结果妥妥的是 0 ,不信的话自己可以代入计算Direct3D-3 四元数。但好像还是有一部分智商拙计,还是给出推导过程吧

Direct3D-3 四元数因为 Direct3D-3 四元数 正交,所以 Direct3D-3 四元数。不要问我为什么正交。

虚数部分的式子更长一些,还是给出比较好,当然大家能自己再运算一到是再好不过的,没有扎实的数学基础,可很难学好图形学哦

Direct3D-3 四元数至此,我们已经得到了结果

Direct3D-3 四元数,再和Direct3D-3 四元数代入计算

Direct3D-3 四元数再和 Direct3D-3 四元数代入计算

Direct3D-3 四元数。事实上。我们需要借组一个现有的公式,就是绕n旋转v的公式是什么

Direct3D-3 四元数 。事实上,可以看出,就是旋转了2倍 角度。至于Direct3D-3 四元数是怎么来的,以后再说吧

 

这一小节暂时到此结束,下一节将讲述 四元数与其对应矩阵的相互转换,已经矩阵的相关知识。附加四元数插值,还有一些变换的特性

 

如有错误,请大家批评指出,本文章公式的图片来自Introduction to 3DGame Programming with DirectX11 和Real-Time Rending