四元数--结合《real time rendering》中关于四元数部分

  四元数产生于1843年,是复数的一个扩展,所以里面包含了一些复数的运算。直到1985年才在图形学中使用。

  四元数的优势是,相对与矩阵和欧拉角,四元数更直观和方便。四元数还可以用作某些方向上的插值,而欧拉角可能并不能很好的完成。

  四元数使用四个数字表示。通常,前三个和旋转的轴密切相关,最后一个和旋转的角度相关。以下是一些数学背景,对于后面的四元数的变化十分重要。

注意到四元数是复数的一个扩展,那么可以表示为:Û = (â, v), 其中 v 是一个实数,而 â 则是可以看成是虚部,且 â= i*qx + j*q+ k*qz  其中,i j k 都是虚部,他们的计算为

i2 = j2= k2 = -1 , jk = -kj=i , ik = -ki = j , ij = -ji = k ,因为â 含有三个部分,所以,一些向量的操作也是可以用在四元数的虚部上。

对于两个四元数相乘,如下图:

  关于其他计算如下:

其中 conjugate 是共轭的意思。根据norm运算我们可以推出除法运算:

  以及其他一些运算规则:

   对于单位四元数,我们还可以用下面的方法进表示,这也是表达旋转变化比较直观的方式

     其计算过程如下,其中要求uq是单位向量:

    另一种表达方式如下,其可以解决log和平方运算:

对于单位四元数的直观理解如下图:

  以上是四元数的基本知识背景。下面来介绍四元数表示的变化。

我们只使用四元数中的一个子集,单位四元数来进行各种旋转变化,十分简单和强大。变化方程为:

  其q是一个单位四元数,其形式为公式4.36,而p则是一个四次其次的点或者向量,p的每个部分直接代替四元数的各个部分,形成一个新的四元数。注意到q是单位四元数,所以q-1 = q。而且,单位四元数与实数相乘并不能改变四元数的作用效果,所以四元数q 和-q的作用效果一样的。那么在从矩阵转化到四元数的过程中,可能得到q也可能得到-q。公式4.40的直观理解就是上面的图。下面的公式代表两个四元数数对一个p进行变化。

四元数和矩阵的转化。因为在硬件上使用矩阵要比使用四元数计算的更快,所以可以在应用层面上使用四元数,但是在计算层面上使用矩阵。他们之间的转化为:

但是在应用层面上要使用四元数时,又要从矩阵转化成四元数。通过观察,可以看到以下等式

   如果直到qw , qx , qy , qz中的任何一个,都可以计算出另外三个。通过观察可以知道如下等式:

  其中tr(Mq)的意思时矩阵的迹,也就是矩阵对角线的和。在计算过程中,我们知道应该尽量避免除以一个比较小的数字。所以4.46不一定时最好的算法。通过以下比较

  可知,通过比较矩阵的几个元素和u的大小就可以知道qx qy qz q的大小关系。如果qw 最大,那么直接使用4.46就可以。如果不是,那么可以使用如下方法,算出最大的那个元素值,然后决定使用4.44时那个元素作为分母。

时间: 2024-08-27 12:58:23

四元数--结合《real time rendering》中关于四元数部分的相关文章

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计算Unity旋转.它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值. Unity内部使用四元数来表示所有的旋转. Quaternion是基于复数,并不容易直观地理解. 不过你几乎不需要访问或修改单个四元数参数(x,y,z,w); 大多数情况下,你只需要获取和使用现有的旋转(例如来自"Transform"),或者用四元数来构造新的旋转(例如,在两次旋转之间平滑插入). 大

视觉SLAM中的数学基础 第二篇 四元数

视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM公开数据集.g2o等程序都使用四元数记录机器人的姿态.因此,理解四元数的含义与用法,对学习SLAM来说是必须的.本节我们就来讲讲四元数. 首先,请读者不要对四元数有什么神秘的感觉.四元数仅是3D姿态的一种表达方式,我们用一个单位四元数表达原本用旋转矩阵表示的三维旋转.这样做一个直接的好处是省空间.一

WorldWind源码剖析系列:四元数类

PluginSDK中的Quaternion4d类可能是感觉Microsoft.DirectX. Quaternion类不太实用或不够用,自己有重新写的. 四元数是英国数学家哈密顿(W.R.Hamilton)在1843年发现的,由于矩阵论的不断丰富和不断完善,人们更乐意采用矩阵来解决实际工程中的问题,这导致四元数在相当长的时间里没有被人们重视,更没有得到实际的应用.随着计算机图形学的发展,人们发现利用四元数可以很好地处理解决旋转运算等问题,这一理论又开始被人们重视,并在许多领域逐渐得到应用. 四元

四元数运动学笔记(3)四元数和旋转相关的约定表述

1.四元数的约定表述1.1 四元数表述的差异1.2 Hamilton vs JPL1.2.1元素的顺序1.2.2 左手系和右手系1.2.3 旋转操作的对象1.2.4 旋转操作的方向1.3 文章采用的表述1.4扰动和时间导数1.4.1右扰动和左扰动1.4.2 Hamilton表示下的(L-G)的四元数时间导数1.4.3 其他有用的表述方式1.5 barfoot书中表述2.旋转角速率表示旋转积分2.1零阶积分2.2一阶积分2.3归一化处理 1.四元数的约定表述 1.1 四元数表述的差异 根据实部虚部

【转载】四元数-Quaterion

原文:四元数-Quaterion 四元数(Quaterion) 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 1843年,William Rowan Hamilton发明了四元数,但直到1985年才有一个叫Ken Shoemake的人将四元数引入计算机图形学处理领域.四元数在3D图形学中主要用于旋转,骨骼动画等.简单地来说,四元数描述了一次旋转:绕任意一个轴旋转一个角度. 四元数的定义形式:(w, x, y, z)

四元数 Quaternion

最近在重写自己游戏引擎的场景管理模块,重温了一下有关四元数的一些知识,在此做一下简单的笔记. 四元数可以用来准确地描述三维矢量的旋转,并且可以有效地表达多个旋转操作的叠加,因此在三维游戏引擎的场景管理模块中,四元数具有很重要的意义. 本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 一.定义 形如A = ai + bj + ck + d的复数称为四元数,其中i.j.k为虚数(称为四元数的基元),a.b.c.d为实数. 二.常见性质 1.

(转)三维旋转:旋转矩阵,欧拉角,四元数

如何描述三维空间中刚体的旋转,是个有趣的问题.具体地说,就是刚体上的任意一个点P(x, y, z)围绕过原点的轴(i, j, k)旋转θ,求旋转后的点P\'(x\', y\', z\'). 旋转矩阵 旋转矩阵乘以点P的齐次坐标,得到旋转后的点P',因此旋转矩阵可以描述旋转, ?????x′y′z′1?????=R??????xyz1?????[x′y′z′1]=R?[xyz1] 绕x,y,或z轴旋转θ的矩阵为: Rx(θ)=???1000cosθsinθ0?sinθcosθ???Rx(θ)=[1

【Unity编程】四元数(Quaternion)与欧拉角

欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩阵旋转和四元数旋转.接下来我们比较它们的优缺点. 欧拉角 优点:三个角度组成,直观,容易理解. 优点:可以进行从一个方向到另一个方向旋转大于180度的角度. 弱点:死锁问题. 前面<[Unity编程]欧拉角与万向节死锁(图文版)>已经介绍过万向节死锁问题. 四元数 内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们.除非你特别有兴趣深入了解四元数学,你只

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

最近学习了一些关于三维空间旋转相关的知识,借此梳理一下备忘. 三维空间的旋转(3D Rotation)是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转,只要旋转中心保持不变,无论多少次的旋转都可以用绕三维空间中某一个轴的一次旋转来表示.表示三维空间的旋转有多种互相等价的方式,常见的有旋转矩阵.DCM.旋转向量.四元数.欧拉角等.本篇文章主要梳理一下这些表示方式及相互转换的方法. 1. 欧拉角(Euler Angle) 最直观的表示方式是绕刚体自身的X.Y.Z三个轴分别进行旋转某个角度