`

四元组与旋转矩阵

 
阅读更多

来源: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

    四元组相较于传统的旋转矩阵具有多个优势:计算效率更高、避免了万向锁问题,并且能够更自然地处理平滑插值等问题。 在本文讨论的上下文中,四元组主要用于表示两个坐标系之间的相对旋转。具体来说,假设我们有两个...

    Jia - Quaternions and Rotations 四元数与旋转

    翻译“Jia - Quaternions and Rotations”可能会涵盖四元数的更多理论细节,如四元数的代数性质、四元数的几何解释、四元数与旋转矩阵的转换、四元数的逆和除法等。通过学习这部分内容,你可以深入理解四元数如何在...

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

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

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

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

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

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

    3D_Math_Quaternion

    接下来,我们讨论四元组与3x3旋转矩阵的相互转换。四元数和旋转矩阵都是表示三维旋转的有效方式,但它们各有优缺点。四元数更紧凑且计算效率高,而旋转矩阵直观且易于理解。将四元数转换为旋转矩阵,可以使用以下...

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

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

    SAC-COT_ Sample Consensus by Sampling Compatibility Triangles.pdf

    6. 四元组变换矩阵:SAC-COT算法中可能会涉及的是一种四元组变换矩阵,它是一个4×4的刚体变换矩阵,能够表达三维空间中从一个坐标系到另一个坐标系的变换,包含了3×3的旋转矩阵和3×1的平移向量。 7. 算法的鲁棒...

    虚拟现实技术概述(PPT53页).pptx

    例如,欧拉角和旋转矩阵的线性插值可能导致非正交矩阵,而四元数插值则能更好地保证运动的连续性和物理合理性。 总之,虚拟现实技术结合了计算机图形学、传感器技术、人工智能等多个领域的成果,为用户提供了一个...

    IntraD的层次结构IntraD采用上下级关系的层次结构.pdf

    * 矢量、矩阵与四元组运算,鼠标跟踪球算法 * 点阵字体与三维矢量字体输出,常用于数据可视化图形的数据标注 * 图像输入输出以及纹理映射,支持 BMP、GIF、JPEG、SGI、TGA 等图像格式 * 常用几何图元的绘制,如锥、...

    ABB机器人程序实例.doc

    - 第二个数组是四元组,表示TCP的旋转矩阵,用于描述TCP相对于机器人基座的朝向。 - 第三个数组是XYZW偏移值,W通常为0,XYZ表示TCP相对于工具中心的偏移。 - 第四个数组是一系列大数值9E+09,这通常是无限大值的...

    计算机图形学基于2D的图形变换

    旋转可以通过一个3x3的旋转矩阵来实现,这个矩阵包含了旋转角度的正弦和余弦值。 在实际编程中,如OpenGL这样的图形库已经为我们提供了方便的函数来执行这些变换,比如`glTranslate()`、`glScale()`和`glRotate()`...

    Lie Groups for 2D and 3D Transformations.pdf

    它的矩阵表示为3D旋转矩阵,这是描述物体围绕某一轴旋转的最常见方式。 2. SE(3)群:它描述了三维空间中的刚体变换,包括旋转和平移。它的维度为6。它在矩阵表示中涉及到齐次坐标四元组上的线性变换。 3. SO(2)群...

    三维图形绘制的齐次坐标

    将这个旋转矩阵与点P的齐次坐标相乘,即可得到旋转后的点坐标。 透视投影和正投影也是通过齐次坐标实现的。透视投影会模拟人眼观察物体时的近大远小效果,而正投影则保持物体的比例,只根据与观察者之间的相对位置...

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

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

    unity 面试题目以及答案

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

    动态酷炫魔方--JS 3D 酷炫

    例如,围绕X轴旋转,就需要使用到旋转变换矩阵,对每个面的向量进行矩阵乘法,从而改变它们的方向。 然后,酷炫的飞散与汇聚效果则是通过平移和缩放操作来实现的。当魔方旋转时,每个小方块可以按照预设的路径和...

    参数化L系统资料。。。

    龟行的旋转可以用旋转矩阵表示,符号解释采用下列符号: +(δ):绕U向左转δ角,-(δ):绕U向右转δ角,&(δ):绕L向下转δ角,^(δ):绕L向上转δ角,\(δ):绕H向左转δ角,/(δ):绕H向右转δ角,|:绕U向右翻...

    Android开发之方向传感器的使用

    这个传感器返回一个四元组,代表设备相对于地磁场的旋转矩阵。要解析这个数据,你需要进行一些额外的数学计算,例如使用SensorManager.getRotationMatrixFromVector()和SensorManager.getOrientation()。 总的来说...

Global site tag (gtag.js) - Google Analytics