探讨:物体绕任意向量的旋转-四元数法VS.旋转矩阵法的性能比较

http://www.cnblogs.com/soroman/archive/2006/09/19/509597.html

3D空间中的旋转可用旋转矩阵、欧拉角或四元数等形式来表示,他们不过都是数学工具,其中在绕任意向量的旋转方面,旋转矩阵和四元数两种工具用的较多,欧拉角由于存在万向节死锁等问题,使用存在限制。

(本文假设坐标系为左手坐标系中,旋转方向为顺时针。)

所求问题:

给定任意单位轴q(q1,q2,q3)(向量),求向量p(x,y,z)(或点p)饶q旋转theta角度的变换后的新向量p'(或点p'):

1.用四元数工具:
-------------------------------------------------------------------------
结论:构造四元数变换p'= q*p*q-1,(p,q是由向量p,q扩展成的四元数)。那么,p'转换至对应的向量(或点)就是变换后的新向量p'(或点p')。

其中,p',q,p,q-1均为四元数。q由向量q扩展,为q=(cos(theta/2),sin(theta/2)*q),p由向量p扩展,为p=(0,x,y,z),q-1为q的逆,因为q为单位四元数,所以q-1=q*=(cos(theta/2),-sin(theta/2)*q)。
-------------------------------------------------------------------------

(这个结论的证明过程可以在网上找到。这里略去。)
下面看其时间复杂度:

首先有个三角函数的计算时间,这个可以预先计算好,花费时间不计。考虑n个四元数相乘需进行4*4*(n-1)=16*(n-1)次乘法,15*(n-1)次加法,因为加法化费时间较少,这里仅考虑乘法。这里涉及到三个四元数的乘法,设一次乘法的时间为T,故花费16*2=32T

2.旋转矩阵工具:
-------------------------------------------------------------------------
结论:构造旋转矩阵变换Trot,则变换后的新向量p'(或点p')为p'= p*Trot

其中,p'(x',y',z',1),p(x,y,z,1)为向量p',p的4D齐次坐标表示,Trot =

|t*q1*q1 + c,           t*q1*q2 + s*q3,       t*q1*q3 - s*q2,       0|
|t*xq1*q2 - s*q3,    t*q2*q2 + c,             t*q2*q3 + s*q1,      0|
|t*q1*q3 + s*q2,      t*q2*q3 - s*q1,       t*q3*q3 + c,            0|
|0,                             0,                             0,                               1|

c=cos(theta), s=sin(theta),t=1-c.
-------------------------------------------------------------------------
(这个结论的证明过程可以在网上找到。这里略去。)

下面看其时间复杂度:

三角函数的计算时间不计。矩阵本身的元素乘法主要是计算t*x和s*x之类,需进行12+3=15次乘法。两个矩阵相乘的需进行n*n*n次乘法,这里n=4,所以花费4*4*4=64次乘法时间,但这里有个注意的地方就是旋转矩阵的第4维无须考虑,即可简化为3X3的矩阵。故花费3*3*3=27次乘法时间,总共的时间为15+27=42次乘法时间。cost=42T.

比较来看,还是使用四元数的效率要高出一些,这在要变换的点的数目越大时,体现的越明显。实际上,有很多3D引擎为了利用四元数运算的高效率性,一般先将矩阵转换成四元数后进行运算再转回为矩阵后,再传给DirectX或OpenGL库函数。

关于四元数和矩阵在向量(方向)之间的进行插值的效率比较,未完待续。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 四元数是一种使用四元数表示旋转的方四元数是一种复数,可以用来描述旋转变换。四元数的形式为 q = w + xi + yj + zk,其中 w、x、y 和 z 是实数,i、j 和 k 是虚数单位。 四元数旋转矩阵之间的关系可以通过四元数旋转公式来表示: R = 1 - 2(y^2 + z^2) 2(xy - zw) 2(xz + yw) 2(xy + zw) 1 - 2(x^2 + z^2) 2(yz - xw) 2(xz - yw) 2(yz + xw) 1 - 2(x^2 + y^2) 其中 R 是旋转矩阵,w、x、y 和 z 是四元数的四个分量。 使用四元数求解旋转矩阵的步骤如下: 1. 输入四元数 q。 2. 使用四元数旋转公式计算旋转矩阵 R。 3. 输出旋转矩阵 R。 例如,假设我们有一个四元数 q = 1 + 2i + 3j + 4k,要使用四元数求解旋转矩阵。根据四元数旋转公式,我们可以得到旋转矩阵 R: R = 1 - 2(3^2 + 4^2) 2(2*3 - 4*1) 2(2*4 + 3*1) 2(2*3 + 4*1) 1 - 2(2^2 + 4^2) 2(3*4 - 2*1) 2(2*4 - 3*1) 2(3*4 + 2*1) 1 - 2(2^2 + 3^2) = 1 - 24 4 8 6 1 - 16 12 8 12 1 - 9 = -23 4 8 6 -15 12 8 ### 回答2: 四元数是一种用于求解旋转矩阵的方四元数是一种特殊的数学对象,它由实部和三个虚部组成,可以表示旋转在三维空间中的方向和角度。 在四元数中,一个旋转矩阵可以通过一个单位四元数来表示。单位四元数具有单位长度,可以将其视为在四维空间中的一个点。 首先,通过给定的旋转角度和旋转轴,可以计算出单位四元数的实部和虚部。这里的旋转轴可以是三维空间中的任意向量旋转角度则决定了旋转的大小。 然后,将单位四元数表示为实部和虚部的形式,可以构造出旋转矩阵旋转矩阵是一个3x3的矩阵,它描述了一个向量旋转之后的变化。通过单位四元数,可以将向量从一个坐标系旋转到另一个坐标系。 具体来说,给定一个向量v,在四元数中,将其表示为虚部为0的四元数。然后,通过将该四元数与表示旋转的单位四元数相乘,可以得到旋转后的四元数。最后,通过旋转后的四元数可以计算出旋转矩阵。 使用四元数求解旋转矩阵的好处是旋转没有万向节锁问题,即可以实现任意旋转,而不仅仅是某一固定轴。此外,四元数还具有计算效率高和精度高的优势。 总之,四元数是一种用于求解旋转矩阵的有效方。通过给定旋转角度和旋转轴,可以计算出单位四元数,然后通过单位四元数构造出旋转矩阵。它在计算机图形学、机器人学和虚拟现实等领域有广泛的应用。 ### 回答3: 四元数是一种用于求解旋转矩阵的方,它可以更高效地进行旋转运算,特别适用于三维空间中的旋转问题。 在四元数中,旋转矩阵可以用四元数表示。四元数是一种复数的扩展,由实部和虚部组成。旋转矩阵通过四元数的虚部来描述旋转轴和旋转角度。 具体而言,我们可以使用一个单位四元数来表示旋转矩阵。单位四元数具有模长为1,即其实部的平方加上虚部的平方为1。通过控制虚部的值,可以实现不同的旋转轴和旋转角度。 通过四元数求解旋转矩阵的步骤如下: 1. 定义旋转轴和旋转角度:确定旋转轴的方向和旋转角度的大小。 2. 转化为虚部:根据旋转轴的方向和旋转角度的大小,计算得到对应的虚部。 3. 构建四元数:将得到的实部和虚部组合起来构成四元数。 4. 归一化:将四元数除以其模长,使其成为单位四元数。 5. 计算旋转矩阵:根据四元数的实部和虚部计算得到旋转矩阵。 通过四元数求解旋转矩阵的优点是能够更高效地进行旋转运算,减少了矩阵乘和求逆的计算量,从而提高了计算的速度和效率。 总而言之,四元数是一种用于求解旋转矩阵的方,通过控制虚部的值来描述旋转轴和旋转角度。它在计算效率方面具有优势,在三维空间中的旋转问题中得到了广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值