四元数

合集下载

四元数

四元数
4 阶实方阵集 H 内方阵型如 b a d c ,令 1 I
1 0 0 1 0 1 0 1 1 0 ,则集 H 内任意方阵可唯一表为 aIbE cJ dK ,即 , E 1 0 , J ;K c d a b 1 0 0 1 1 0 1 d c b a 0 1 1 0 1 1 0 2 2 2 H {aI bE cJ dK | a,b,c,dR} ,H 对矩阵减法封闭 ;且 E J K I , EJ K,JK E,KE J; JE K,KJ E,EK J ,矩阵乘法在 H 内封闭,故 H 对矩阵加,乘法构 1 来自

[d, b, c] [a, d, c] [a, b, d] 推论 [a, b, c] 0 d a b c a {b (c d)} (b d)(a c) (b c)(a d) [a, b, c] [a, b, c]
S() : 2a R
N( ) : a2 b2 c2 d2 R
证明: 0 0, oder, 0
0, und, 0 0 N( ) 0 0 ,即 0, und, 0 0 ,同理 0,und, 0 0 0 N( ) 0 证明:若 是方程 x 2 S( ) N( ) 0 的根,则 也是其根. 因为, 是方程 x 2 S( ) N( ) 0 的根 2 ( ) ( ) 0 2 ( ) ( ) 0 也是其根)
四矢外积: (a b) (c d) [a, b, d]c [a, b, c]d [c, d, a]b [c, d, b]a (V, V, V, V) V 三矢外积 三矢外积 (a b) (c d) ((a b) d)c ((a b) c)d [a, b, d]c [a, b, c]d; (a b) (c d) ((c d) a)b ((c d) b)a [c, d, a]b [c, d, b]a

四元数

四元数

二.四元数与姿态阵之间的关系
3.由于 || Q || q0 2 q12 q2 2 q3 2 =1,所以:
q0 2 q12 q2 2 q3 2 R Cb 2(q1q2 q0 q3 ) 2(q q q q ) 1 3 0 2
2(q1q2 q0 q3 ) q0 q1 q2 q3 2(q2 q3 q0 q1 )
构造四元数:
q0 cos

2
2 q2 m sin 2 q3 n sin 2
q1 l sin

Q q0 q1i0 q2 j0 q3 k0 cos cos

2
(li0 mj0 bk0 ) sin

2

2
u R sin

2
二.四元数与姿态阵之间的关系
记:
rx ' r 'R r ' y rz '
rx rR r y rz
l uR m n
二.四元数与姿态阵之间的关系
0 n m rx r (u r ) R n 0 l y 0 m l rz
q0 2 q12 q2 2 q3 2 CbR 2(q1q2 q0 q3 ) 2(q q q q ) 1 3 0 2 2(q1q2 q0 q3 ) q0 q1 q2 q3 2(q2 q3 q0 q1 )
2 2 2 2
2(q2 q3 q0 q1 ) 2 2 2 2 q0 q1 q2 q3 2(q1q3 q0 q2 )
二.四元数与姿态阵之间的关系

四元数详解

四元数详解

四元数详解四元数是一种数学概念,它在多个领域都有广泛的应用。

在计算机图形学中,四元数用于表示旋转变换。

下面我将以人类的视角来介绍四元数的定义、性质和应用。

四元数是一种扩展了复数的数学结构。

它由一个实部和三个虚部组成,可以写成q = a + bi + cj + dk的形式,其中a、b、c、d分别是实数,i、j、k是虚数单位。

与复数一样,四元数也有加法和乘法运算。

我们来看四元数的定义。

四元数的实部a对应于实数部分,而虚部bi + cj + dk对应于虚数部分。

四元数的加法定义很简单,就是将实部和虚部分别相加。

而乘法则稍微复杂一些,需要使用四元数的乘法规则:i² = j² = k² = ijk = -1。

通过这个规则,我们可以计算出两个四元数的乘积。

接下来,我们来探讨一下四元数的性质。

首先,四元数的加法满足交换律和结合律。

然而,四元数的乘法不满足交换律,即ab ≠ ba。

此外,四元数的乘法满足结合律,但不满足分配律。

这些性质使得四元数的运算有一些独特的特点。

四元数在计算机图形学中有广泛的应用。

由于四元数可以用于表示旋转变换,因此在三维游戏和动画中经常被用到。

与传统的欧拉角相比,四元数具有很多优点,例如不存在万向锁问题和旋转插值更加平滑。

因此,使用四元数可以提高计算机图形学的效率和质量。

除了计算机图形学,四元数还在其他领域有着重要的应用。

例如,在航空航天领域,四元数可以用于表示飞行器的姿态和旋转控制。

在物理学中,四元数可以用于描述粒子的自旋。

此外,四元数还可以用于解决某些数学问题,例如解四次方程和计算曲线的弯曲度。

四元数是一种重要的数学概念,具有广泛的应用。

它在计算机图形学、航空航天和物理学等领域都发挥着重要作用。

通过深入理解四元数的定义、性质和应用,我们能够更好地应用它们解决实际问题,推动科学技术的发展。

四元数

四元数

四元数一、四元数的来历四元数(Quaternions )最先是由爱尔兰数学家哈密顿(William Rowan Hamilton )在1843年发明的数学概念,它是最简单的超复数起初,我们所熟知的复数是由实数加上元素组成的,形式如下所示 z a ib =+将两维复数扩展至三维复数,可以得到z a ib jc =++现在把两个三维复数相乘,并化简得到12121212121212121212()()()z z a a bb c c i a b b a j a c c a ijb c jic b =--++++++ 然而,对于上式得到的结果ij 和ji 并不是确定的值,因此哈密顿引入了四维复数的概念,将z 写成四维复数的形式,即z a ib jc kd =+++这时,再将两个四维复数相乘,化简可得1212121212121212121212121212121212()()()z z a a b b c c d d i a b b a j a c c a k a d d a ijb c ikb d jic b jkc d kid b kjd c =---++++++++++++然后,哈密顿做了如下规定,即ij=k jk=i ki=j ji=-k kj=-i ik=-j按照如上规定,式化简为如下形式121212121212222111121212121212()()()()()()z z a a b b c c d d a ib jc kd a ib jc kd i c d d c j d b b d k b c c b =-+++++++++-+-+-最后,将z1,z2写成最初的形式,即111222z s v z s v =+=+式中,v1,v2分别表示z1,z2的虚数部分得到121212122112z z s s v v s v s v v v =-+++⨯哈密顿将此式中的对象z1z2叫做四元数,并把虚数部分称作是向量。

03.四元数

03.四元数

03.四元数四元数单位四元数可以⽤来描述三维空间中的旋转,它既是紧凑的,也没有奇异性。

⼀个四元数描述唯⼀⼀个空间旋转,但是⼀个空间旋转可以由互为相反数的两个四元数表⽰。

1.四元数四元数的定义四元数是由四个元构成的数Q(q0,q1,q2,q3)=q0+q1i+q2j+q3kq0,q1,q2,q3是实数,i,j,k是满⾜如下条件的单位向量i⊗i=−1,j⊗j=−1,k⊗k=−1 ⾃⼰与⾃⼰进⾏四元数乘结果为-1。

i⊗j=k,j⊗k=i,k⊗i=j按照i→j→k→i...的顺序两两作四元数乘可以得到下⼀个。

j⊗i=−k,k⊗j=−i,i⊗k=−j按照i→j→k→i...相反的顺序两两作四元数乘可以得到下⼀个的负。

⊗表⽰四元数乘法四元数的表达⽅式⽮量式Q=q0+q其中q0称四元数Q的标量部分,q称四元数Q的⽮量部分。

q是三维空间中的⼀个向量。

复数式Q=q0+q1i+q2j+q3k可视为⼀个超复数,Q的共轭复数记为:Q∗=q0−q1i−q2j−q3k三⾓式Q=cos θ2+u sinθ2式中,u为单位向量,即旋转轴。

θ为实数,即绕单位向量u的旋转⾓度。

指数式Q=e u θ2式中,u和θ同上。

矩阵式Q=q0 q1 q2 q3四元数的⼤⼩—范数四元数的⼤⼩⽤四元数的范数来表⽰:||Q||=q20+q21+q22+q23||Q||=1,则Q成为规范化四元数。

描述旋转的四元数成为规范化四元数。

规范化四元数参与旋转运动时要作归⼀化。

四元数的运算加法和减法:对应实部和虚部相加/减[]Q=q0+q1i+q2j+q3kP=p0+p1i+p2j+p3k则Q±P=(q0±p0)+(q1±p1)i+(q2±p2)j+(q3±p3)k乘法:合并同类项(根据向量i,j,k向量相乘规则)标量乘a Q=aq0+aq1i+aq2j+aq3k其中a为标量四元数乘P⊗Q=(q0+q1i+q2j+q3k)⊗(p0+p1i+p2j+p3k)=(p0q0−p1q1−p2q2−p3q3)+(p0q1+p1q0+p2q3−p3q2)i+(p0q2+p2q0+p3q1−p1q3)j+(p0q3+p3q0+p1q2−p2q1)k =r0+r1i+r2j+r3k写成矩阵形式r0r1 r2 r3=p0−p1−p2−p3p1p0−p3p2p2p3p0−p1p3−p2p1p0q0q1q2q3=M(P)Q或r0r1 r2 r3=q0−q1−q2−q3q1q0q3−q2q2−q3q0q1q3q2−q1q0p0p1p2p3=M′(Q)P注意:四元数乘法不满⾜交换律P⊗Q=M(P)Q≠M′(P)Q=Q⊗P 四元数乘法满⾜分配律和结合律P⊗(Q+R)=P⊗Q+P⊗RP⊗Q⊗R=(P⊗Q)⊗R=P⊗(Q⊗R)此外,还有(P⊗Q)∗=Q∗⊗P∗证明,略。

形象解说四元数

形象解说四元数

形象解说四元数By daode1212 2016-03-16前言:四元数(Quaternions)是由爱尔兰数学家哈密顿(William Rowan Hamilton,1805-1865)在1843年发明的数学概念。

复数、向量、矩阵都是数学中的基本要素,就如同编程中的数组、对象、集合那样。

四元数是一种超复数,是复数与三维向量的复合体。

四元数也有加法、减法、乘法、但是四元数的乘法不符合交换律(commutative law),即a*b <> b*a,而且,还有转置、规范化、共轭三种运算。

由于它在描述三维旋转、姿态方面的一些特有优点,所以在飞行器(飞机,火箭,导弹等),机器人姿态的控制中常用到。

数学手册中在代数结构的“群-环-域”中稍有点介绍,它属于不可交换的除环,称哈密顿四元数体。

以下是一些四元数运算的效果图:四元数理论创立人:William Rowan Hamilton,1805-1865一,四元数的几种表示形式:OpenTK中,为建立四元数提供了多种方式:public Quaternion(float x, float y, float z, float w);public Quaternion(OpenTK.Vector3v, float w);例如用Quaternion(float x, float y, float z, float w):OpenTK.Quaternion q = new OpenTK.Quaternion(0.51f, -0.71f, 0.31f, 0.7071f);1, 四元数建构方式一:i^2=j^2=k^2=-1ij=-ji=k,jk=-kj=i,ki=-ik=jq=w+ix+jy+kz,i,j,k分别对应轴向量X(1,0,0),Y(0,1,0),Z(0,0,1)2, 四元数建构方式二:转动角之半+轴向量的方向余弦:3, 四元数建构方式三:转动角之半+单位球面上的点:二,四元数的模如q是四元数,OpenTK中有:1, q.Length;返回值是:2, q.LengthSquared;返回值是:,与点积(内积)q·q是一致的。

四元数的初步总结

四元数的初步总结

四元数的初步总结(一)四元数是最简单的超复数。

复数是由实数加上元素i组成,其中i^2=-1。

相似地,四元数都是由实数加上三个元素i、j、k组成,而且它们有如下的关系:i^2=j^2=k^2=ijk=-1,每个四元数都是1、i、j和k的线性组合,即是四元数一般可表示为a+bi+cj+dk,其中a、b、c、d是实数一、四元数引入的理论背景将实数域扩充到复数域,并用复数来表示平面向量,用复数的加、乘运算表示平面向量的合成、伸缩和旋转变换,这些观念已经在中学课程中学过了。

那么,很自然的问题就是,在三维,或更高维空间中是否也有复数的类似物?也就是说,像扩充实数那样,在复数域的基础上添加一个或几个新的元素,并且让它们跟原来的复数做加减乘除,是否就可以得到一个新的数集,并且其中的元素还可以像复数域那样做加、减、乘、除运算,并满足通常复数的那些运算律,包括加法和乘法的交换律与结合律、乘法对加法的分配律等待?更进一步,我们是否可以期望用这样的数来表示三维或更高维空间中的伸缩和旋转,就像用复数表示平面向量的伸缩旋转那样方便?把问题说得明确一些,即是说,我们是否可以像得到复数域那样,在复数域中再添加一个新的元素(因此也是在实数基础上添加两个元素和),得到一个类似于复数集合,这个集合中的元素当时就是普通的复数,当时就是普通的实数,并且通常数的加减乘除运算及其性质都可以在这个集合上保持,即满足:1、对于任意两个数,它们的和是唯一确定的。

2、对于任意两个数,它们的积是唯一确定的。

3、存在一个数0,它具有性质:对于任意a,均有a+0=a。

4、对于每一个数a,均存在数x,适合等式a+x=0。

5、加法适合交换律:a+b=b+a。

6、加法适合结合律:(a+b)+c=a+(b+c)。

7、乘法适合交换律:a·b=b·a。

8、乘法适合结合律:(a·b)·c=a·(b·c)。

9、乘法对加法适合分配律:a (b+c)=ab+ac 和(a+b)c=ac+bc。

四元数运算法则

四元数运算法则

四元数运算法则四元数是一种数学工具,用于表示三维空间中的旋转。

它由一个实部和三个虚部组成,可以描述旋转的方向和角度。

在计算机图形学和机器人学等领域中,四元数常用于旋转变换的计算。

本文将介绍四元数的运算法则,包括加法、减法、乘法和除法。

一、四元数的定义和表示四元数可表示为q = w + xi + yj + zk,其中w为实部,xi、yj和zk为虚部,i、j和k为虚数单位。

实部和虚部可以是实数或复数。

二、四元数的加法两个四元数的加法定义为:q1 + q2 = (w1 + w2) + (x1 + x2)i + (y1 + y2)j + (z1 + z2)k。

即实部相加,虚部相加。

三、四元数的减法两个四元数的减法定义为:q1 - q2 = (w1 - w2) + (x1 - x2)i + (y1 - y2)j + (z1 - z2)k。

即实部相减,虚部相减。

四、四元数的乘法两个四元数的乘法定义为:q1 * q2 = (w1w2 - x1x2 - y1y2 - z1z2) + (w1x2 + x1w2 + y1z2 - z1y2)i + (w1y2 - x1z2 + y1w2 + z1x2)j + (w1z2 + x1y2 - y1x2 + z1w2)k。

即实部相乘减虚部相乘。

五、四元数的除法两个四元数的除法定义为:q1 / q2 = q1 * q2的共轭 / q2 * q2的共轭。

其中,q的共轭表示将虚部取负数。

即实部相除,虚部相除。

六、四元数的模四元数的模定义为:|q| = sqrt(w^2 + x^2 + y^2 + z^2)。

即实部平方加上虚部平方的平方根。

七、四元数的单位化将一个非零四元数单位化,即将其模变为1,得到单位四元数。

单位四元数的定义为:q' = q / |q|。

八、四元数的共轭四元数的共轭定义为:q* = w - xi - yj - zk。

即实部不变,虚部取负数。

九、四元数的逆一个非零四元数的逆定义为:q^-1 = q* / |q|^2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

为什么使用四元数为了回答这个问题,先来看看一般关于旋转(面向)的描述方法-欧拉描述法。

它使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值。

需要注意的是,这里的旋转是针对世界坐标系说的,这意味着第一次的旋转不会影响第二、三次的转轴,简单的说,三角度系统无法表现任意轴的旋转,只要一开始旋转,物体本身就失去了任意轴的自主性,这也就导致了万向轴锁(Gimbal Lock)的问题。

还有一种是轴角的描述方法(即我一直以为的四元数的表示法),这种方法比欧拉描述要好,它避免了Gimbal Lock,它使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即(x,y,z,angle),一般表示为(x,y,z,w)或者(v,w)。

但这种描述法却不适合插值。

那到底什么是Gimbal Lock呢?正如前面所说,因为欧拉描述中针对x,y,z的旋转描述是世界坐标系下的值,所以当任意一轴旋转90°的时候会导致该轴同其他轴重合,此时旋转被重合的轴可能没有任何效果,这就是Gimbal Lock,这里有个例子演示了Gimbal Lock,点击这里下载。

运行这个例子,使用左右箭头改变yaw 为90°,此时不管是使用上下箭头还是Insert、Page Up键都无法改变Pitch,而都是改变了模型的roll。

那么轴、角的描述方法又有什么问题呢?虽然轴、角的描述解决了Gimbal Lock,但这样的描述方法会导致差值不平滑,差值结果可能跳跃,欧拉描述同样有这样的问题。

什么是四元数四元数一般定义如下:q=w+xi+yj+zk其中w是实数,x,y,z是虚数,其中:i*i=-1j*j=-1k*k=-1也可以表示为:q=[w,v]其中v=(x,y,z)是矢量,w是标量,虽然v是矢量,但不能简单的理解为3D空间的矢量,它是4维空间中的的矢量,也是非常不容易想像的。

四元数也是可以归一化的,并且只有单位化的四元数才用来描述旋转(面向),四元数的单位化与Vector类似,首先||q|| = Norm(q)=sqrt(w2 + x2 + y2 + z2)因为w2 + x2 + y2 + z2=1所以Normlize(q)=q/Norm(q)=q / sqrt(w2 + x2 + y2 + z2)说了这么多,那么四元数与旋转到底有什么关系?我以前一直认为轴、角的描述就是四元数,如果是那样其与旋转的关系也不言而喻,但并不是这么简单,轴、角描述到四元数的转化:w = cos(theta/2)x = ax * sin(theta/2)y = ay * sin(theta/2)z = az * sin(theta/2)其中(ax,ay,az)表示轴的矢量,theta表示绕此轴的旋转角度,为什么是这样?和轴、角描述到底有什么不同?这是因为轴角描述的“四元组”并不是一个空间下的东西,首先(ax,ay,az)是一个3维坐标下的矢量,而theta 则是级坐标下的角度,简单的将他们组合到一起并不能保证他们插值结果的稳定性,因为他们无法归一化,所以不能保证最终插值后得到的矢量长度(经过旋转变换后两点之间的距离)相等,而四元数在是在一个统一的4维空间中,方便归一化来插值,又能方便的得到轴、角这样用于3D图像的信息数据,所以用四元数再合适不过了。

关于四元数的运算法则和推导这里有篇详细的文章介绍,重要的是一点,类似与Matrix的四元数的乘法是不可交换的,四元数的乘法的意义也类似于Matrix的乘法-可以将两个旋转合并,例如:Q=Q1*Q2表示Q的是先做Q2的旋转,再做Q1的旋转的结果,而多个四元数的旋转也是可以合并的,根据四元数乘法的定义,可以算出两个四元数做一次乘法需要16次乘法和加法,而3x3的矩阵则需要27运算,所以当有多次旋转操作时,使用四元数可以获得更高的计算效率。

为什么四元数可以避免Gimbal Lock在欧拉描述中,之所以会产生Gimbal Lock是因为使用的三角度系统是依次、顺序变换的,如果在OGL中,代码可能这样:glRotatef( angleX, 1, 0, 0)glRotatef( angleY, 0, 1, 0)glRotatef( angleZ, 0, 0, 1)注意:以上代码是顺序执行,而使用的又是统一的世界坐标,这样当首先旋转了Y轴后,Z轴将不再是原来的Z轴,而可能变成X轴,这样针对Z的变化可能失效。

而四元数描述的旋转代码可能是这样:TempQ = From Eula(x,y,z)FinalQ =CameraQ * NewQtheta, ax, ay, az = From (FinalQ)glRotatef(theta, ax, ay, az);其中(ax,ay,az)描述一条任意轴,theta描述了绕此任意轴旋转的角度,而所有的参数都来自于所有描述旋转的四元数做乘法之后得到的值,可以看出这样一次性的旋转不会带来问题。

这里有个例子演示了使用四元数不会产生Gimbal Lock的问题。

关于插值使用四元数的原因就是在于它非常适合插值,这是因为他是一个可以规格化的4维向量,最简单的插值算法就是线性插值,公式如:q(t)=(1-t)q1+t q2但这个结果是需要规格化的,否则q(t)的单位长度会发生变化,所以q(t)=(1-t)q1+t q2 / || (1-t)q1+t q2 ||如图:尽管线性插值很有效,但不能以恒定的速率描述q1到q2之间的曲线,这也是其弊端,我们需要找到一种插值方法使得q1->q(t)之间的夹角θ是线性的,即θ(t)=(1-t)θ1+t*θ2,这样我们得到了球形线性插值函数q(t),如下:q(t)=q1 * sinθ(1-t)/sinθ + q2 * sinθt/sineθ如果使用D3D,可以直接使用D3DXQuaternionSlerp函数就可以完成这个插值过程。

第二篇:四元数入门四元数常常可以在3D的书上看到。

但我的那本3D图形学书上,在没讲四元数是干什么的之前,就列了几张纸的公式,大概因为自己还在上高中,不知道的太多,看了半天没看懂。

终于,在gameres上看到了某强人翻译的一个“4元数宝典”(原文是日本人写的。

),感觉很好,分享下。

★旋转篇:我将说明使用了四元数(si yuan shu, quaternion)的旋转的操作步骤(1)四元数的虚部,实部和写法所谓四元数,就是把4个实数组合起来的东西。

4个元素中,一个是实部,其余3个是虚部。

比如,叫做Q的四元数,实部t而虚部是x,y,z构成,则像下面这样写。

Q = (t; x, y, z)又,使用向量 V=(x,y,z),Q = (t; V)也可以这么写。

正规地用虚数单位i,j,k的写法的话,Q = t + xi + yj + zk也这样写,不过,我不大使用(2)四元数之间的乘法虚数单位之间的乘法ii = -1, ij = -ji = k (其他的组合也是循环地以下同文)有这么一种规则。

(我总觉得,这就像是向量积(外积),对吧)用这个规则一点点地计算很麻烦,所以请用像下面这样的公式计算。

A = (a; U)B = (b; V)AB = (ab - U·V; aV + bU + U×V)不过,“U·V”是内积,「U×V」是外积的意思。

注意:一般AB<>BA所以乘法的左右要注意!(3)3次元的坐标的四元数表示如要将某坐标(x,y,z)用四元数表示,P = (0; x, y, z)则要这么写。

另外,即使实部是零以外的值,下文的结果也一样。

用零的话省事所以我推荐。

(4)旋转的四元数表示以原点为旋转中心,旋转的轴是(α,β,γ)(但α^2 + β^2 + γ^2 = 1),(右手系的坐标定义的话,望向向量(α,β,γ)的前进方向反时针地)转θ角的旋转,用四元数表示就是,Q = (cos(θ/2);αsin(θ/2),βsin(θ/2),γsin(θ/2))R = (cos(θ/2); -αsin(θ/2), -βsin(θ/2), -γsin(θ/2))(另外R 叫 Q 的共轭四元数。

)那么,如要实行旋转,则R P Q= (0; 答案)请像这样三明治式地计算。

这个值的虚部就是旋转之后的点的坐标值。

(另外,实部应该为零。

请验算看看)例子代码/// Quaternion.cpp/// (C) Toru Nakata, toru-nakata@aist.go.jp/// 2004 Dec 29#include <math.h>#include <iostream.h>/// Define Data typetypedef struct{double t; // real-componentdouble x; // x-componentdouble y; // y-componentdouble z; // z-component} quaternion;//// Bill 注:Kakezan 在日语里是“乘法”的意思quaternion Kakezan(quaternion left, quaternion right) {quaternion ans;double d1, d2, d3, d4;d1 = left.t * right.t;d2 = -left.x * right.x;d3 = -left.y * right.y;d4 = -left.z * right.z;ans.t = d1+ d2+ d3+ d4;d1 = left.t * right.x;d2 = right.t * left.x;d3 = left.y * right.z;d4 = -left.z * right.y;ans.x = d1+ d2+ d3+ d4;d1 = left.t * right.y;d2 = right.t * left.y;d3 = left.z * right.x;d4 = -left.x * right.z;ans.y = d1+ d2+ d3+ d4;d1 = left.t * right.z;d3 = left.x * right.y;d4 = -left.y * right.x;ans.z = d1+ d2+ d3+ d4;return ans;}//// Make Rotational quaternionquaternion MakeRotationalQuaternion(double radian, double AxisX, double AxisY, double Axis Z){quaternion ans;double norm;double ccc, sss;ans.t = ans.x = ans.y = ans.z = 0.0;norm = AxisX * AxisX + AxisY * AxisY + AxisZ * AxisZ;if(norm <= 0.0) return ans;norm = 1.0 / sqrt(norm);AxisX *= norm;AxisY *= norm;AxisZ *= norm;ccc = cos(0.5 * radian);sss = sin(0.5 * radian);ans.t = ccc;ans.y = sss * AxisY;ans.z = sss * AxisZ;return ans;}//// Put XYZ into quaternionquaternion PutXYZToQuaternion(double PosX, double PosY, double PosZ) {quaternion ans;ans.t = 0.0;ans.x = PosX;ans.y = PosY;ans.z = PosZ;return ans;}///// mainint main(){double px, py, pz;double ax, ay, az, th;quaternion ppp, qqq, rrr;cout << "Point Position (x, y, z) " << endl;cout << " x = ";cin >> px;cout << " y = ";cin >> py;cout << " z = ";cin >> pz;ppp = PutXYZToQuaternion(px, py, pz);while(1) {cout << "\nRotation Degree ? (Enter 0 to Quit) " << endl;cout << " angle = ";cin >> th;if(th == 0.0) break;cout << "Rotation Axis Direction ? (x, y, z) " << endl;cout << " x = ";cin >> ax;cout << " y = ";cin >> ay;cout << " z = ";cin >> az;th *= 3.1415926535897932384626433832795 / 180.0; /// Degree -> radi an;qqq = MakeRotationalQuaternion(th, ax, ay, az);rrr = MakeRotationalQuaternion(-th, ax, ay, az);ppp = Kakezan(rrr, ppp);ppp = Kakezan(ppp, qqq);cout << "\nAnser X = " << ppp.x<< "\n Y = " << ppp.y<< "\n Z = " << ppp.z << endl;}return 0;}又一篇在以前涉及的程序中,处理物体的旋转通常是用的矩阵的形式。

相关文档
最新文档