使用四元数完成控制三维物体旋转全过程(详解全流程)

使用四元数完成控制三维物体旋转全过程(详解全流程)

在使用四元数的时候,查到晚上很多的文章要么是针对数学问题就行推导,要么就是胡乱复制粘贴乱写一起的文章,而没有详细解释在实践过程中,如何一步步完成计算的全部过程,对小白极度不友好。因此诞生了本文。
本文不讲数学原理,只专注于描述全部实现的过程,对数学感兴趣的可以自行百度,希望能够和大家沟通交流,同时减轻小白的理解压力。

同时欢迎下载相应的资源:https://download.csdn.net/download/qq_32563773/13077923

总体步骤

总的来说,需要完成旋转操作共需要三个步骤,需要的流程为鼠标左边计算旋转轴和角度、转为四元数、四元数转为旋转矩阵(如图)。《使用四元数完成控制三维物体旋转全过程(详解全流程)》

实现原理

第一步:计算旋转欧拉角

在实际操作时,我们首先要做的就是获取鼠标点击的操作,并且转为三维坐标,进而完成旋转。获取鼠标坐标并转为三维坐标的一个较为流行的方法就是arcball方法

该方法的思想就是:在显示的窗口后边想象出一个填满窗口的、并且与窗口相切的球体,通过获取窗口上的坐标位置,映射到球心到球面一点的三维向量,然后计算旋转。

实现过程:

通过arcball方式计算出鼠标的二维坐标到三维坐标,构建出的坐标中:
xx+yy小于1时:
x = 2x / 屏幕宽度 – 1
y = -(2
y / 屏幕高度 – 1),
z = sqrt(1-xx-yy)。
当xx+yy大于1时
则交点P不在球体上,那就在水平与屏幕的线上上找一点P,且满足P在球体上,即xx+yy大小限定在1这个值,此时z = 0。

第二步:欧拉角转为四元数

下边是第二步,根据上一个鼠标位置获取的位置和当前的位置,进行叉乘计算出垂直于他们的旋转轴、旋转的角度,以此构建出四元数。
轴-角(Axis-Angle)顾名思义就是绕某条单位轴旋转一定角度,从这个意义上看,它构造四元数是非常舒服的,毕竟直观的几何意义有一点点类似,绕单位轴旋转 的四元数是:
《使用四元数完成控制三维物体旋转全过程(详解全流程)》

其中方程左边可理解为有θ旋转角度、v为旋转轴构建出四元数,由轴角构建四元数的方法如下:
《使用四元数完成控制三维物体旋转全过程(详解全流程)》
同时,因为旋转是不断进行的,所以需要四元数相乘,完成对旋转的累计。 这也是为什么四元数可以解决万向节死锁问题。

《使用四元数完成控制三维物体旋转全过程(详解全流程)》

第三步:四元数转为旋转矩阵

转为四元数可以解决欧拉角因为旋转过程中第三个轴的失效问题,因此引入四维的复数,来描述三维世界的旋转问题(我理解的是使会有第四个轴失效,但是保证了三个轴的旋转准确性)。

若四元数为p=(w,x,y,z),则旋转矩阵可以如下所示,又因为坐标数据为四维,因此需要在旋转矩阵右边和下边添加一行和一列。

《使用四元数完成控制三维物体旋转全过程(详解全流程)》

具体实现过程(c++)

构建四元数的结构体、以及qua_M函数,完成四元数的相乘,以计算两个不同的旋转累加的结果。

《使用四元数完成控制三维物体旋转全过程(详解全流程)》
iniWV2Qua函数完成根据旋转角度、旋转的轴初始化四元数。《使用四元数完成控制三维物体旋转全过程(详解全流程)》

qua2matrix函数完成四元数到旋转矩阵的计算。

《使用四元数完成控制三维物体旋转全过程(详解全流程)》

    原文作者:一片云略过
    原文地址: https://blog.csdn.net/qq_32563773/article/details/109385936
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞