`

四元组与旋转矩阵

 
阅读更多

来源:http://bezier.zhmy.com/archives/2009/156323.html

 

 

在3D程序中,通常用quaternion来计算3D物体的旋转角度,与Matrix相比,quaternion更加高效,占用的储存空间更小,此外也更便于插值。在数学上,quaternion表示复数w+xi+yj+zk,其中i,j,k都是虚数单位: 

 

i*i = j*j = k*k= -1

i*j = k, j*i = -k


可以把quaternion看做一个标量和一个3D向量的组合。实部w表示标量,虚部表示向量标记为V,或三个单独的分量(x,y,z)。所以quaternion可以记为[ w, V]或[ w,(x,y,x)]。对quaternion最大的误解在于认为w表示旋转角度,V表示旋转轴。正确的理解应该是w与旋转角度有关,v与旋转轴有关。例如,要表示以向量N为轴,轴旋α度,相对的quaternion应该是:



q = [ cos(α/ 2) , sin(α/ 2) N]

 =[ cos(α/ 2) , ( sina(α/ 2) Nx, sin(α/ 2)Ny, sin(α/ 2)Nz ) ]



为了计算方便,一般要求N为单位矢量。对quaternion来说使用四个值就能记录旋转,而不是Matrix所需的十六个值。为什么用quaternion来计算旋转很方便呢?先说过quaternion是一个复数,如果你还记得一点点复数的知识,那么应该知道复数乘法(叉乘)的几何意义实际上就是对复数进行旋转。对最简单的复数p= x + yi来说,和另一个复数q = ( conα,sinα)相乘,则表示把p沿逆时针方向旋转α:



p’ = pq 




当然,x+yi的形式只能表示2D变换,对3D变换来说就需要使用 quaternion了,而且计算也要复杂一点。为了对3D空间中的一个点p(x,y,z)进行旋转,需要先把它转换为quaternion形式p = [0, ( x, y, z)],接下来前面讨论的内容,定义q = cos(α/ 2) , sin(α/ 2) N为旋转quaternion,这里N为单位矢量长度的旋转轴,α为旋转角度。那么旋转之后的点p’则为:



       p’ = qpq-1
                                            


Re: 如何从四元组得到绕各个轴的旋转角度?       

         void QuaternionToEuler(Quaternion* q, Vector3* vOut) 

double q0 = q->w; 
double q1 = q->x; 
double q2 = q->y; 
double q3 = q->z; 

vOut->x = float(atan2( 2 * (q2*q3 + q0*q1), (q0*q0 - q1*q1 - q2*q2 + q3*q3))); 
vOut->y = float(asin( -2 * (q1*q3 - q0*q2))); 
vOut->z = float(atan2( 2 * (q1*q2 + q0*q3), (q0*q0 + q1*q1 - q2*q2 - q3*q3))); 
}

 

欢迎关注微信公众号——计算机视觉:

 

 

分享到:
评论

相关推荐

    四元组 absoluteOrientation

    这是一片很老的文章了 是关于用四元组表示的 坐标系之间的转换 可以用在摄影测量学中 的绝对定向之中

    第四章四元组求log2n1

    第四章四元组求log2n1

    3D_Math_Quaternion

    四元组的应用 包含: 1.从"按定轴旋转某角度"建立四元组 2.四元组的球形插值插值 3.四元组与3x3旋转矩阵的相互转换

    3D_Math_Quaternion_by_Seamanj.rar

    四元组应用的实现 包括了 1.从"按指定轴旋转多少度"建立四元组 2.四元组的球形插值 3.四元组与3x3旋转矩阵的相互转换

    c# 小型语言的词法分析器 输入代码 生成四元组

    一个小型语言的词法分析器 现在做到是生成四元组 压缩包里面带有一个表格 里面有该语言的单词表 以及文法规则 是我课程设计的时候编写的 目前正在学习 如何生成目标代码 最后可以运行

    摄像机系统OpenGL版(源代码+演示程序)

    上面写着可以使用四元组的方法,也可以使用旋转矩阵的方法。其中四元组的方法由于我的理解有限,就没有做出来。所以借着《OpenGL超级宝典》和东拼西凑的一些知识,我完成了旋转矩阵的计算。结果还挺准确的呢。

    论文研究-QS-Net:基于四元组和六元组重建系统发育网络 .pdf

    QS-Net:基于四元组和六元组重建系统发育网络,谭明,曹智,当生物实体或分类群之间涉及网状事件如水平基因转移,杂交,基因重组和基因重配时,系统发育网络被用于估计它们的进化关系。在过

    统计特殊四元组1

    统计特殊四元组给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c,d) 的 数目 :示例 1:输出:1解释:

    摄像机系统OpenGL版(演示程序)

    上面写着可以使用四元组的方法,也可以使用旋转矩阵的方法。其中四元组的方法由于我的理解有限,就没有做出来。所以借着《OpenGL超级宝典》和东拼西凑的一些知识,我完成了旋转矩阵的计算。结果还挺准确的呢。

    基于四元组和面积比的点模式匹配 (2013年)

    先在主辅特征点集中构建不规则三角网,再利用两相邻三角形组成特征点四元组,两条对角线将四元组划分为四个小三角形,事先计算出四个小三角形之间的面积比,然后以面积比作为相似性测度来迭代搜索同名四元组,再建立两个...

    tyf.rar_四元组_语义分析_语义分析程序

    设计一个语义分析程序对文法进行改造生成四元组代码

    四元组PLSA:法人识别中的合并实体及其评级

    在这里,我们注意到每次评论还伴随着一个实体及其整体评分,从而导致四元组与前面提到的二元组结合在一起。相信四元组包含更多的共现信息,从而提供更多区分主题的能力,我们提出了四元组PLSA模型,该模型在主题建模...

    python 实现四数之和

    # 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组 # 注意: # 答案中不可以包含...

    Quaternion-toolbox_matlab.zip_Quaternion toolbox_quad_quaternion

    maltab四元组工具库,可以进行有关四元组的运算。。。。。

    论文研究-C-V活动轮廓模型的一个注记.pdf

    提出一种基于几何特征的三维数据配准算法。该算法针对点云中各点pi的k邻近点...算法实现时,首先对初始数据通过抽取有效点对,建立名义上的对应关系,然后采用四元组法求得坐标变换的旋转和平移矩阵,实现数据配准。

    unity 面试题目以及答案

    unity 面试题目以及答案 ...有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵 (matrix)、四元组等。 相对于其它方法,四元组有其本身的优点: a.四元数不会有欧拉角存在的 gimbal lock 问题[万向节

    pythagorean_tuples:to生成勾股勾股三元组,四元组和n元组的直接方法

    生成勾股勾股三元组,四元组和n元组的直接方法。 资源 该存储库是印度Jadavpur大学的Tanay Roy和Farjana Jaishmin Sonia撰写的一篇出色论文的实现。 它被称为“一种生成勾股勾股三元组的直接方法,并将其推广到勾股...

    编译原理 中间代码生成文档

    VB的关于编译原理中的中间代码生成的文档。

    编译原理中间代码生成程序

    编译原理中间代码生成程序 三元组 报告+程序 第一次上传啊希望能通过 真不能通过啊? 我要受不了了啊。。

    将算术表达式转换成四元式

    设计内容及要求:设计一个语法制导翻译器,将算术表达式翻译成四元式。要求: 先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现...

Global site tag (gtag.js) - Google Analytics