形象解说四元数

合集下载

四元数——精选推荐

四元数——精选推荐

四元数复数:我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位, i*i= -1;复变函数:四元数:正如复数是有⼀个实部和⼀个虚部组成的,那我们将⼀个虚部换成三个虚部,即两两相交{i, j, k}。

其中n为三维的单位向量,i²=j²=k²=i·j·k=-1。

这便是四元数的常规表达形式,不过单位四元数是有⼀⼤堆的约束的,并不是所有四维向量都是四元数。

如何去理解四元数:四元数(以后不特指四元数=单位四元数)是四维空间中⼀个超球上⾯的点,满⾜w²+x²+y²+z²=1;⽽纯四元数是四维空间在w=0时的⼀个⼦空间的点,形式为{0, q},特别注意的是纯四元数与四元数是不同的概念。

四元数是复数虚部扩展的结果,复数的虚部为1个,⽽四元数虚部有3个,且两两互相正交,其中实部是cosθ/2,⽽虚部为⼀个単位轴乘以sinθ/2。

四元数⾃由度并没有四个维度,由于存在w²+x²+y²+z²=1这个约束,它的⾃由度其实只有3,且每个四元数可以对应⼀个特征向量,即n。

但请记住四元数并不是与特征向量⼀⼀对应的,后⽂会有说。

如何利⽤低维信息去理解⾼维信息?例⼦:三维的球⽤代数表⽰为x²+y²+z²=1,虽然球上⾯的点是由x,y,z三个参数来确定,但实际上我们只需要两个。

假设取x和z表⽰,其中y可以通过x和z进⾏求解。

那么,我们将y轴信息给隐去,只看投影平⾯,如下图所⽰。

这张图的意思是,整个球在XOZ平⾯上投影是⼀个圆,当球⾯⼀点投影在圆上时,y=0;投影的位置位于圆内时,则分别两种情况,y>0处于北半球,y<0处于南半球。

所以我们仅通过投影后的圆即可还原出整个球体。

推⼴到四维,w²+x²+y²+z²=1中取x、y和z来表⽰超球。

四元数

四元数
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 )
二.四元数与姿态阵之间的关系

四元数

四元数
此处仅讨论具有实数元素之四元数,并将以两种形式来描述四元数。其中一种是向量与纯量的结合,另一形 式两个创建量(constructor)与双向量(bivector;i、j与k)的结合。
定义两个四元数:
其中表示矢量 ;而表示矢量。
跟复数、向量和矩阵一样,两个四元数之和需要将不同的元素加起来。 加法遵循实数和复数的所有交换律和结合律。
威廉·卢云·哈密顿
明确地说,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一 个四维空间,相对于复数为二维空间。
四元数是除环(除法环)的一个例子。除了没有乘法的交换律外,除法环与域是相类的。特别地,乘法的结 合律仍旧存在、非零元素仍有逆元素。
四元数形成一个在实数上的四维结合代数(事实上是除法代数),并包括复数,但不与复数组成结合代数。 四元数(以及实数和复数)都只是有限维的实数结合除法代数。
不只如此,哈密顿还创造了向量的内外积。他亦把四元数描绘成一个有序的四重实数:一个纯量和向量的组 合。若两个纯量部为零的四元数相乘,所得的纯量部便是原来的两个向量部的纯量积的负值,而向量部则为向量 积的值,但它们的重要性仍有待发掘。
哈密顿之后继续推广四元数,并出了几本书。最后一本《四元数的原理》(Elements of Quaternions)于 他死后不久出版,长达八百多页。
非奇异表达(和例如欧拉角之类的表示相比)
比矩阵更紧凑(更快速)
单位四元数的对可以表示四维空间中的一个转动。
所有单位四元数的集合组成一个三维球和在乘法下的一个群(一个李群)。是行列式为1的实正交3×3正交 矩阵的群的双面覆盖,因为每两个单位四元数通过上述关系对应于一个转动。群和同构,是行列式为1的复酉 2×2矩阵的群。令为形为的四元数的集合,其中或者都是整数或者都是分子为奇数分母为2的有理数。集合是一 个环,并且是一个格。该环中存在 24个四元数,而它们是施莱夫利符号为的正二十四胞体的顶点。

四元数解析

四元数解析

四元数解析一、四元数是啥呢?嘿呀,四元数这个东西啊,可有点小神秘又有点小酷呢。

它就像是数学这个大乐园里一个超级独特的小天地。

四元数啊,其实是一种复数的扩展啦。

就好像我们本来有个小房子,然后突然给它加盖了好几层,变得超级酷炫。

二、四元数的构成它是由一个实数部分和三个虚数部分组成的哦。

这就好像是一个小团队,有一个队长(实数部分),还有三个特别的小伙伴(虚数部分)。

这三个虚数部分还都有着自己独特的小标识,它们可不是随便凑在一起的,而是有着非常奇妙的组合规则呢。

三、四元数的历史在数学的发展长河里,四元数的出现也是一段很有趣的故事。

有好多聪明的数学家们不断探索,就像探险家在未知的大陆上寻找宝藏一样。

经过很多人的努力,四元数才逐渐被发现和完善。

它在数学发展中可是有着很重要的地位,就像一颗璀璨的星星照亮了数学天空的一角。

四、四元数的用途1. 在计算机图形学里它可厉害了呢。

比如说在3D游戏的制作中,要让那些虚拟的角色动起来,转圈圈,四元数就能很好地来处理旋转的问题。

就像一个超级小助手,默默地在背后让游戏画面变得更加流畅和逼真。

2. 在物理学领域它也有自己的小舞台。

像是在研究一些物体的旋转运动的时候,四元数就可以简洁又高效地描述物体的状态。

这可比其他的方法有时候要方便很多呢。

五、四元数的计算它的计算规则有点像我们玩一种特别的数学游戏。

比如说加法、乘法之类的运算,都有着自己独特的小算法。

这些算法虽然刚开始学的时候可能有点绕,但只要你耐心去探索,就会发现其中的乐趣。

就像解开一道道有趣的小谜题一样。

六、四元数和其他数学概念的关系四元数和复数、向量这些数学概念都有着千丝万缕的联系。

它就像是一个大家庭里的一员,和其他成员之间有着相互的影响和作用。

复数可以说是四元数的小前辈,而四元数又对向量的发展有着一定的启发呢。

四元数-第1讲

四元数-第1讲

四元数-第1讲
What-四元数
定义1:
若存在复数A=a+bi和C=c+di,构建Q=A+Cj并定义k=ij,因此生成
四元数空间H:
Q=a+bi+cj+dk
上式a,b,c,d为R;i,j,k为虚数单位向量;
ii=jj=kk=ijk=-1,ij=-ji=k,jk=-kj=i,ki=-ik=j;右手法则
注:通过Q发现,实数、虚数、复数均属于四元数;
定义2:
四元数定义为标量与向量的和,第一部分是实数或标量,第二部分(加粗)
是虚数或向量,
四元数Q视作四维向量q,可表示实数和纯虚数;
2.How-四元数basis
基本运算法则:
+、、 1、 *、 ||.||、 -1(逆)、 normalized
2.1加法(+):
对应位置相加,满足加法交换律和结合律;
p+q=q+p p+(q+r)=(p+q)+r
2.2乘法():
不满足交换律(因叉乘导致,叉乘为零可交换),满足结合律;
并满足对加法的分配律:
四元数乘法可转变为矩阵乘积:
注:
表示向量生成斜对称矩阵;
(向量叉乘)
2.3单元四元数([1,0,0,0]) :
满足
2.4共轭(*):
四元数共轭定义标量部分不变,向量(虚数部分)取相反数;
四元数与其共轭四元数相乘等于各部分平方和;
2.5范数(||.||):
定义如下,
2.6逆(-1):
四元数乘以四元数的逆等于单元四元数[1,0,0,0];
结合四元数共轭可知:
2.7单位四元数(normalized):
范数等于1的四元数,结合上式可得,
单位四元数可作为方向/旋转操作符,这意味旋转逆操作可使用四元数共轭。

四元数详解

四元数详解

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

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

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

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

它由一个实部和三个虚部组成,可以写成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叫做四元数,并把虚数部分称作是向量。

四元数

四元数

我们举个最简单的例子:把点 P(1, 0, 1)绕旋转轴 u = (0, 1, 0)旋转 90°,求旋转后的顶点坐标。首先将 P 扩充到四元数, 即 p = (P, 0)。而 q = (u*sin45°, cos45°)。求 p′=qpq−1 的值。建议大家一定要在纸上计算一边,这样才能加深印象, 连笔都懒得动的人还是不要往下看了。最后的结果 p` = ((1, 0, -1), 0),即旋转后的顶点位置是(1, 0, -1)。
在 Unity 里,tranform 组件有一个变量名为 rotation,它的类型就是四元数。很多初学者会直接取 rotation 的 x、y、 z,认为它们分别对应了 Transform 面板里 R 的各个分量。当然很快我们就会发现这是完全不对的。实际上,四元数的 x、y、z 和 R 的那三个值从直观上来讲没什么关系,当然会存在一个表达式可以转换,在后面会讲。
那么,四元数又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于 复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即 x = a + bi,i 是虚数单位,如果你 还记得的话应该知道 i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位, i、j、k,即一个四元数可以表示为 x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢?
[csharp] view plain copy print?
1.
transform.rotation = Quaternion.AngleAxis(degrees, transform.right) * transform.rotation;

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∗证明,略。

四元数简介

四元数简介
• 四元数都ຫໍສະໝຸດ 1、i、j 和 k 的线性组合,一般
可表示为 d + ai + bj + ck,a、b、c、d是 实数。 • 四元数的其它表示方法: 1、q=[w,v] 其中v=(x,y,z)是矢量,w是标量。 2、q=( cosθ/2 , (x ,y,z )sinθ/2) 3、q=[d,a,b,c]T
• • • • •
纠正陀螺仪积分得出的姿态。 长期融合用到的传感器是加速度计和电子罗盘 假设正确的姿态四元数为Q,那么可以利用四元数旋转将参考坐标系和 体坐标系下的向量互相转换,将Eh和Eg转换到体坐标系下 BEh=Q×Eh×Q* BEg=Q×Eg×Q * 理论上Bg=BEg,Bh=BEh 即 { Q×Eh×Q* - Bh = 0} , { Q×Eg×Q* - Bg = 0} 这两个方程成立,联立这两个方程就可以解得姿态四元数Q。但是,由 于各种误差的存在,这个方程组只能找到最优解,找最优解的问题有许 多方法可以采用,如[梯度下降][高斯牛顿]
• q1 q2=
w2 x 2 y2 z2
四元数在姿态运算上的应用
• 一个单位化的四元数可以描述一个三维旋转的过程。例如:
p0以原点为旋转中心,旋转的轴是(α, β, γ) ( α^2 + β^2 + γ^2 = 1), 转θ角的旋转,用四元数表示就是: p1= qp0q-1
四元数
齐朋冲
四元数的引入
• 复数的加、乘运算可以表示平面向量的合成、伸
缩和旋转变换,这些知识我们已经在中学课程中 学过了。 那么,很自然的问题就是,在三维,或更高维空 间中是否也有复数的类似物?其中的元素还可以 像复数域那样做加、减、乘、除运算,并满足通 常复数的那些运算律,包括加法和乘法的交换律 与结合律、乘法对加法的分配律等待?更进一步, 我们是否可以期望用这样的数来表示三维或更高 维空间中的伸缩和旋转,就像用复数表示平面向 量的伸缩旋转那样方便?

四元数的初步总结

四元数的初步总结

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

复数是由实数加上元素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。

四元数 科普版1

四元数 科普版1

四元数
笛卡尔 乘积
C = A × B = |A||B|sin# #代表向量A、B之间的夹角
四元素 结论
i × j = k, j × k = i k × i = j, j × i = -k i × k = -j, i × k = -j
四元素运算
负四元数、单位四元数、模
单位四元数 负四元数 四元数的模
z1z2
- x2y1)k
01
02
03
04
四元素运算
四元数的旋转
01 3D上的旋转? 02 四维上的点[w, v]
旋转
q = [w1, (x1i, y1j, z1k)]
04 p’ = qpq^-1 03 计算qp与(qp)q^-1
p = qpq^-1
四元数插值
Four element interpolation
单位四元数的模
四元素运算
四元数的加、减、乘、共轭和逆
向量的点积
A ▪ B = x1x2 + y1y2 +
向量的叉乘
A × B = (y1z2 - y2z1)i + (z1x2 - z2x1)j + (x1y2
四元数的乘
[w1w2 - A ▪ B, w1A + w2B + A × B]
共轭和逆
(q1q2q3...qn) ^ -1 = (qn)^-1...(q2^-1)(q1^1)
PART 03
四元素插值
线性插值
01
OPTION
02
OPTION
03
OPTION
线性插值
四元素插值
1 3
球面插值
四元数插值法
2
p of four elements

四元数概念

四元数概念

四元数概念四元数(Quaternions)是一种数学工具,它是由爱尔兰数学家 William Rowan Hamilton 于1843年发明的。

四元数被广泛应用于计算机图形和动画,机器人控制,摄影测量,化学和物理的研究中。

四元数具有复数的性质并且比复数更为丰富。

复数是由一个实部和一个虚部组成的,而四元数是由一个实部和三个虚部组成的。

四元数的定义如下:Quaternions = {a + bi + cj + dk | a, b, c, d∈R}i²=j²=k²=ijk=-1在四元数中,公式(1)具有一些有趣的特性,这使得四元数成为一种非常有用的工具。

其中一条是四元数具有完整的乘法结构,即使在虚部之间的乘法也是如此。

在计算机图形和动画应用中,四元数极为有用,因为它可以表示多种变换操作(如平移,旋转和缩放)。

q = cos(theta/2) + sin(theta/2)*(vi + vj + vk)这里,cos是余弦函数,sin是正弦函数,theta是旋转角度,v表示旋转轴的单位向量。

p + q = (a1 + a2) + (b1 + b2)i + (c1 + c2)j + (d1 + d2)kkp = ka + kb*i + kc*j + kd*k这些运算遵循基本的加、减和乘法法则,类似于向量的运算。

这些规则具有一些有趣的性质,四元数的乘法不是可交换的,即pq≠qp。

四元数是一种非常有用的数学工具,尤其是在计算机图形和动画,机器人控制,摄影测量,化学和物理的应用中。

它包含了复数所具有的性质,并增加了第三个和第四个虚部,使得它更加丰富和灵活。

四元数还具有证明某些矢量不变性的作用。

对于一个物体的旋转,它的角速度可以通过四元数的导数来表示,这个导数有一个重要的应用,即可以证明质心不受任何外部力矩的影响而保持恒定,这被称为质点定则证明。

四元数还与矩阵有密切的联系。

事实上,四元数乘法可以被转换为矩阵运算,它的实部和虚部也可以被表示为一个4x4的旋转矩阵。

四元数的理解

四元数的理解

四元数的理解四元数,听起来是不是特别高大上?就像那种住在神秘数学城堡里的贵族,让人感觉有点难以接近。

可实际上呢,只要我们用对方法去理解,它就像邻家小伙伴一样亲切。

四元数这东西啊,和我们平常认识的数不太一样。

咱们平常打交道的数,像1、2、3这种,就像是走在一条笔直大路上的行人,规规矩矩,方向明确。

而四元数呢,就像是一群在四维空间里跳舞的小精灵。

你要是只习惯看二维平面或者三维空间的东西,那突然接触四元数,就好比一个在小村庄里生活惯了的人突然到了超级大都市,满眼都是新鲜玩意儿,有点晕头转向。

你看啊,咱们生活的世界是三维的,长宽高嘛。

这就像一个大盒子,东西在里面有它的位置。

可四元数呢,它生活在一个四维的世界里。

这四维是啥?你可以这么想,假如三维世界是一个装满了各种玩具的大箱子,那四维世界就像是有无数个这样箱子的大仓库,还多了一个我们不太好理解的维度。

这个维度就像是一个隐藏的通道,四元数可以通过这个通道做一些在三维世界里看起来很神奇的事情。

咱们再来说说四元数的组成部分。

它有一个实部和三个虚部。

这实部就像一个队伍里的队长,稳坐中军帐,指挥着整个四元数的行动。

而那三个虚部呢,就像是三个身手敏捷的小队员,各自有着独特的本事,它们和队长一起,组成了这个独特的四元数。

这就有点像一个篮球队,队长是核心,可那几个厉害的队员也各有各的作用,少了谁都不行。

那四元数有啥用呢?用处可大了去了!在计算机图形学里,它就像是一个魔法棒。

比如说,我们要让一个三维的物体旋转,这要是按照以前的方法,就像一个人在黑暗里摸索,又麻烦又容易出错。

可是有了四元数就不一样了,它就像一盏明灯,一下子就把路照亮了。

它可以非常方便地描述物体的旋转,而且计算起来还特别高效。

这就好比你要去一个很远的地方,以前只能步行,又累又慢,现在有了汽车,一下子就轻松又快速地到达了。

在机器人的运动控制方面,四元数也是个得力助手。

机器人的关节动来动去,就像人的四肢一样。

要想让机器人的动作准确又自然,这可不容易。

四元数

四元数
詹姆斯·克拉克·麦克斯韦曾经在他的《电磁场动力理论》(A Dynamical Theory of Electromagnetic Field)直接以20条有20个变 数的微分方程组来解释电力、磁力和电磁场之间的关系。某些早期的麦克斯韦方程组使用了四元数来表述,但与后来亥维赛使用四条 以矢量为基础的麦克斯韦方程组表述相比较,使用四元数的表述并没有流行起来。
双曲正切:
反双曲函数
反双曲正弦: 反双曲余弦: 反双曲正切:
反三角函数
将这些被放到最后,是因为需要先定义四元数中的反双曲三角函数。 反正弦函数: 反余弦函数: 反正切函数:
广义化
若 F 是一个域,且 a、b 为 F 的元素,那么就可在 F 上定义一个四维单一结合代数,而它的产生是由符合 i2 = a、j2 = b 和 ij = -ji 的 i、j 而起。 这些代数不是与 F 的二阶矩阵代数同型,就是 F 的除法代数。它们称为“四元数代数”。
幂和对数
因为四元数有除法,所以幂和对数可以定义。 自然幂: 自然对数: 幂:
三角函数
正弦: 余弦:
正切:
https:///wiki/%E5%9B%9B%E5%85%83%E6%95%B8
5/7
2015/7/17
双曲函数
双曲正弦: 双曲余弦:
四元数 ­ 维基百科,自由的百科全书
第二种则是以四阶实数矩阵表示:
其中四元数的共轭等于矩阵的转置。
四元数运算
四元数运算在电动力学与广义相对论中有广泛的应用。四元数可以用来取代张量表示。有时候采用带有复数元素之四元数会比较容 易,导得结果不为除法代数之形式。然而亦可结合共轭运算以达到相同的运算结果。
https:///wiki/%E5%9B%9B%E5%85%83%E6%95%B8

简单讲解四元数

简单讲解四元数

简单讲解四元数《简单讲解四元数篇一》嘿,今天咱们来唠唠四元数这个有点神秘的玩意儿。

四元数啊,就像是数学世界里的一个小怪兽,乍一听挺唬人的,但其实也没那么可怕啦。

你可以把四元数想象成是数字界的一个小团体,这个团体里有四个成员呢。

在我们平常熟悉的数的世界里,像实数,就像一个独来独往的大侠,只有一个值。

而四元数就不一样了,它是由一个实数部分和三个虚数部分组成的。

这就好比一个组合,主唱是实数,旁边还有三个伴舞的虚数。

我第一次听到四元数的时候,我就想,这都是啥呀?简直就像是外星来的概念。

但是后来我慢慢发现,它在很多地方可是超级有用的。

比如说在计算机图形学里,就像游戏开发或者3D建模。

当你要让一个物体旋转的时候,四元数就像一把神奇的小钥匙。

以前用别的方法来处理旋转,就像是开一把生锈的锁,又费劲又容易出错。

但是四元数就不一样了,它能让这个旋转的操作变得特别顺滑,就像给那把生锈的锁上了润滑油一样。

我给你讲个我自己捣鼓小项目的事儿吧。

我当时想做一个简单的3D动画,就是一个小方块在空间里转来转去。

最开始我按照老办法,用矩阵来处理旋转。

哎呀妈呀,那代码写得乱七八糟的,就像一团乱麻。

小方块转起来的时候,那画面简直惨不忍睹,就像是一个喝醉酒的人在跳舞,东倒西歪的。

后来我偶然间接触到四元数,刚开始也是一头雾水,但是我咬着牙研究。

嘿,你还别说,当我把代码改成用四元数来处理旋转之后,那个小方块就像被施了魔法一样,转得那叫一个漂亮,就像一个专业的舞者在舞台上翩翩起舞。

也许有人会说,这么复杂的东西,学它干嘛呢?其实我也犹豫过,毕竟它看起来这么难懂。

但是你想啊,在这个科技发展越来越快的时代,多掌握一点这种有点难度的知识,就像是给自己的大脑装上了一个更高级的芯片。

你不知道什么时候,它就会派上大用场呢。

四元数就像一个隐藏在深处的宝藏,虽然挖掘起来有点费劲,但是一旦你找到了,那可就是收获满满啊。

它可能不是那种每天都会用到的东西,但是当你需要它的时候,你就会庆幸自己曾经花时间去了解它了。

四元数 旋转举证 转 欧拉角

四元数 旋转举证 转 欧拉角

四元数旋转举证转欧拉角四元数什么是四元数四元数(Quaternion)是一种数学工具,用来表示三维空间的旋转。

它由一个实部和三个虚部组成,通常表示为 q = a + bi + cj + dk。

其中,a为实部,bi、cj和dk为虚部。

四元数的定义和运算四元数的定义如下:其中,a、b、c和d都是实数,i、j和k为虚数单位。

为了满足四元数的运算规则,它们之间满足如下关系:四元数的加法和减法遵循常规复数的加法和减法规则,乘法规则如下:四元数的逆元可以通过共轭操作计算得到,共轭定义如下:四元数的旋转表示在三维空间中,旋转可以通过四元数来表示。

具体地,给定一个旋转角度theta和一个单位向量v = (x,y,z),旋转可以表示为:这个旋转表示可以方便地转换为四元数的形式。

具体地,令:其中,R = (Rij)是一个3x3的旋转矩阵。

可以证明,这样得到的四元数是一个合法的旋转表示。

欧拉角什么是欧拉角欧拉角(Euler Angles)是一种用来表示旋转的方法,可以将任意旋转表示为绕三个轴的依次旋转。

通常用三个角度来表示,分别是绕x轴的角度phi,绕y轴的角度theta和绕z轴的角度psi。

欧拉角的表示方法欧拉角有多种不同的表示方法,常见的有ZYX、YZX、ZYZ等。

这里以ZYX欧拉角为例进行讨论。

ZYX欧拉角的表示方式如下:其中,R = (Rij)是一个3x3的旋转矩阵。

通过这个公式可以计算出给定旋转矩阵R时的欧拉角。

四元数转欧拉角将四元数转换为欧拉角可以通过以下步骤进行:1.计算旋转矩阵R,其中的元素可以通过四元数的实部和虚部计算得到。

2.计算ZYX欧拉角,根据上述公式将旋转矩阵R转换为欧拉角。

总结在三维空间中,旋转可以通过四元数和欧拉角来表示。

四元数是一种数学工具,用来表示旋转,具有一些好的性质,例如方便的旋转合成和插值。

欧拉角是另一种表示旋转的方法,通过三个角度来表示绕三个轴的依次旋转。

通过旋转矩阵,可以将四元数转换为欧拉角,从而实现不同表示方法之间的转换。

四元数的介绍

四元数的介绍

四元数的介绍四元数,这是个啥玩意儿呢?听起来就很神秘,对吧?咱先这么想,平常咱们都熟悉实数,就像1、2、3这些数字,它们就像老老实实站在数轴上的小士兵,规规矩矩的。

然后呢,又有了复数,复数就像是给这些小士兵找了个伴儿,变成了a + bi这样的形式,就好像原本孤单的一个人,现在有了个影子跟着,这个影子就是虚数部分。

这虚数啊,刚开始的时候好多人都觉得很奇怪,就像突然出现了一种新的生物一样。

那四元数呢?它可就更厉害了。

它的形式是a + bi+ cj + dk,这就像是从两个人的小团队,一下子变成了一个小团伙。

这里的i、j、k啊,它们之间的关系可复杂了。

比如说,i² = j² = k² = -1,这就像是它们三个都有自己的小脾气,不按常理出牌。

而且ij = k,jk = i,ki = j,但是ji = -k,kj = -i,ik = -j。

这就像三个人之间的小默契,但是这个默契还有正反两种情况,是不是很神奇?你要是想理解四元数在现实中的用处啊,那可不少呢。

就拿飞机的飞行姿态来说吧。

飞机在空中可不是随随便便飞的,它有各种姿态,像翻滚啊、偏航啊、俯仰啊。

要是用普通的数学方法来描述这些姿态的变化,就会变得很复杂,就像你要把一团乱麻理清楚一样难。

但是四元数就不一样了,它就像一个聪明的小助手,能够很简洁地描述飞机的这些姿态变化。

就好比你本来要走好多弯路才能到达目的地,现在有了一条捷径,一下子就轻松多了。

再比如说机器人的运动控制。

机器人的关节那么多,每个关节的运动方向和角度都要控制好。

这要是用一般的数学方法来搞,那得算到什么时候去啊。

四元数就像是一把神奇的钥匙,能把这些复杂的关系简单化。

它能让机器人的动作更流畅、更准确,就像一个熟练的舞者,每个动作都能做到恰到好处。

在计算机图形学里,四元数也有很大的作用。

咱们看到的那些炫酷的3D游戏,里面的人物和物体的旋转啊、变换啊,要是没有四元数,那制作起来可就麻烦死了。

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

形象解说四元数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是一致的。

三,四元数的规范化[单位化]OpenTK.Quaternion q2= OpenTK.Quaternion.Normalize(q1); //单位化,使平方和等于1四元数建构方式二、方式三在这方面有明显优势。

四,四元数的共轭OpenTK.Quaternion q2= OpenTK.Quaternion.Conjugate(q1);//共轭,仅向量取反方向若q=w+(ix+jy+kz); p=w-(ix+jy+kz);则q,p称为共轭,记q=p*或p=q*;共轭为取四元数中的标量与向量提供了方便:1、四元数的标量部:S=(q+q*)/2;2、四元数的向量部:V=(q-q*)/2;五,四元数的转置OpenTK.Quaternion q2 = OpenTK.Quaternion.Invert(q1); //倒数,转置:方向相反,模互为倒数六,四元数的逻辑运算主要是相等,不相等的判断:q1 == q2, q1 != q2bool b = q2.Equals(q1);七,四元数的算术运算运算符有:+、-、*,对应有Add(q,p )、Sub(q,p )、 Multiply( q,*)加法的定义:public static OpenTK.Quaternion Add(OpenTK.Quaternion left, OpenTK.Quaternion right)减法的定义:public static OpenTK.Quaternion Sub(OpenTK.Quaternion left, OpenTK.Quaternion right)乘法有二种:public static OpenTK.Quaternion Multiply(OpenTK.Quaternion quaternion, float scale)public static OpenTK.Quaternion Multiply(OpenTK.Quaternion left, OpenTK.Quaternion right)注意,乘法没有交换律:q2*q1 != q1*q2乘法的定义和数学算法如下:例如:四元数与标量相乘,是对原四元数在正方向或反方向进行伸缩:OpenTK.Quaterniond q2 = OpenTK.Quaterniond.Multiply(q1, 0.5f); //q1*0.5四元数与四元数相乘,是两种旋转的叠加作用:OpenTK.Quaterniond q3 = OpenTK.Quaterniond.Multiply(q2, q1); //q2*q1q3 = q1·q2 =(a1a2-b1b2-c1c2-d1d2) +i(a1b2+b1a2+c1d2-d1c2) +j(a1c2+a2c1+b2d1-d2b1) +k(a1d2+d1a2+b1c2-c1b2)四元数与四元数相乘是不容易心算的游戏,就方向的变化也很难摸准,见下例://向量连乘效果图:private void QuatMults() //向量连乘效果图{qs[0] = new OpenTK.Quaternion(.5f, -.6f, -.7f, .4f);DwQuat(qs[0], Color.FromArgb(255, 255, 0), 4f);qs[1] = new OpenTK.Quaternion(-.6f, -.5f, .4f, .6f);DwQuat(qs[1], Color.FromArgb(0, 255, 255), 4f);for (int i = 0; i < 255; i++){qs[i + 2] = OpenTK.Quaternion.Multiply(qs[i], qs[i + 1]); qs[i + 2] = OpenTK.Quaternion.Normalize(qs[i + 2]);DwQuat(qs[i + 2], Color.FromArgb(i, i, i), 2f);}}//表现四元数:private void DwQuat(OpenTK.Quaternion q,Color clr,float d){//画线段:GL.LineWidth(d);GL.Begin(BeginMode.Lines);GL.Color3((byte)clr.R, (byte)clr.G, (byte)clr.B);GL.Vertex3(0, 0, 0);GL.Vertex3(q.X, q.Y, q.Z);GL.End();//画球:GL.PushMatrix();GL.Translate(q.X, q.Y, q.Z);GL.Color3((byte)clr.R, (byte)clr.G, (byte)clr.B);Glu.Sphere(Glu.NewQuadric(), .05, 9, 9);//画球GL.PopMatrix();}三维效果如下:正是这一特点,可以让程序建构出很多艺术品出来。

四元数的除法,如果按乘法的逆运算是除法这一法则去找因数1、因数2,要解一个4X4的联列方程组,可参考下面的矩阵:先用克莱姆法则判断一下,它的解可能唯一,可能无解,也可能有无数多组解。

设:q3 = q1*q2(q1:左四元数因子,q2:右四元数因子),如果把左、右因子分别叫作左、右商,我们可以自己构造函数进行计算://除法1: 求左商,右商:OpenTK.Quaternion q= QuaternionDiv(qs[1], qs[0], 1); // LR=1:返回右商OpenTK.Quaternion q1 = QuaternionDiv(qs[1], qs[0], -1); // LR=-1:返回左商//除法2: 以qs[0]的转置乘qs[1]OpenTK.Quaternion q2 = OpenTK.Quaternion.Multiply(qs[2], qs[1]);实际计算表明,两种除法不一致,所以不应该用转置来替代除法。

四元数连除三维图为了测试255次连续相除,设计算法如下:进行12次迭代后制作了下图之前另一算法的效果图:八,“轴+角”方式转四元数public static OpenTK.Quaternion FromAxisAngle(OpenTK.Vector3axis, float angle)其中OpenTK.Vector3axis 是轴向量,float angle 是以弧度表示的角如:OpenTK.Quaternion q3 = OpenTK.Quaternion.FromAxisAngle(new Vector3(0.4f, 0.4f, 0.8f), PI / 2f); 九,四元数转“轴+角”方式1,public OpenTK.Vector4ToAxisAngle()2,public void ToAxisAngle(out OpenTK.Vector3axis, out float angle)其中OpenTK.Vector4 形如(float x, float y, float z, float angle)float angle是以弧度表示的角。

如:OpenTK.Vector4 v4 = q3.ToAxisAngle();十,四元数到欧拉角的转换//四元数转欧拉角,欧拉角的球面RGB(用自定义类实现):private void QuaternionToEulerAngle_BallRGB(){//声明类与结构:Eular EL = new Eular();Quaternion q = new Quaternion();EulerAngle ea = new EulerAngle();//利用三角式生成四元数:double PI = 3.1416;//double a = PI / 8; double b = PI / 2; double c = 0; //转轴:Y轴,转动角:PI/4//double a = PI / 2; double b = 0; double c = 0;//转轴:X轴,转动角:PI//double a = PI / 2; double b = PI / 2; double c = 0;//转轴:Y轴,转动角:PI//double a = PI / 2; double b = 0; double c = PI / 2;//转轴:Z轴,转动角:PIdouble a = PI/2; //转动角:2a(=PI)double b = PI / 2;double c = 0;for (b = -PI; b < PI; b += .1){for (c = -PI/2; c < PI/2; c += .1){q.w = Math.Cos(a);q.x = Math.Cos(b) * Math.Cos(c) * Math.Sin(a);q.y = Math.Sin(b) * Math.Cos(c) * Math.Sin(a);q.z = Math.Sin(c) * Math.Sin(a);//四元数转欧拉角:ea = EL.QuaternionToEulerAngle(q);byte R = (byte)(255 * (PI + ea.pitch) / (2 * PI));byte G = (byte)(255 * (PI + ea.yaw) / (2 * PI));byte B = (byte)(255 * (PI + ea.roll) / (2 * PI));GL.Color3(0f, 0f, 0f);GL.LineWidth(4f);GL.Begin(BeginMode.Lines);GL.Vertex3(0, 0, 0);GL.Color3(R, G, B);GL.Vertex3(q.x, q.y, q.z);GL.End();}}}四元数转欧拉角,欧拉角的球面RGB四元数转欧拉角的数学算法如下,不同的坐标系可能要作适当的调整:如果分别为绕Z轴、Y轴、X轴的旋转角度,则有:十一,欧拉角到四元数的转换private void EulerAngleToQuaternion(){double A = Math.PI / 6; double B = Math.PI / 4; double C = Math.PI / 2;double c1 = Math.Cos(A / 2);double s1 = Math.Sin(A / 2);double c2 = Math.Cos(B / 2);double s2 = Math.Sin(B / 2);double c3 = Math.Cos(C / 2);double s3 = Math.Sin(C / 2);double w = c1 * c2 * c3 - s1 * s2 * s3;double x = s1 * s2 * c3 + c1 * c2 * s3;double y = s1 * c2 * c3 + c1 * s2 * s3;double z = c1 * s2 * c3 - s1 * c2 * s3;//窗体标题栏显示:this.Parent.Text = "W,X,Y,Z=" + w+","+x+","+y+","+z;}欧拉角转四元数的数学算法如下,不同的坐标系可能要作适当的调整:十二,向量绕四元数旋转//向量绕四元数旋转,就是用四元数作用于向量:private void VectorRotByQuaternion(){//======================================Vector3 v01 = new Vector3(1f, 0f, -1f);double PI = 4.1416;float x = (float)(Math.Sin(PI / 8) * Math.Cos(PI / 4) * (float)Math.Cos(PI / 9)); float y = (float)(Math.Sin(PI / 8) * Math.Cos(PI / 4) * (float)Math.Sin(PI / 9)); float z = (float)(Math.Sin(PI / 8) * Math.Sin(PI / 9));float w = (float)Math.Cos(PI / 8);OpenTK.Quaternion q = new OpenTK.Quaternion(x, y, z, w);Vector3 v5 = OpenTK.Vector3.Transform(v01, q);GL.PointSize(6f);GL.LineWidth(4f);GL.Begin(BeginMode.Lines);GL.Color3(.0f, 0f, .5f);GL.Vertex3(0, 0, 0);GL.Vertex3(v01);//深蓝色:原来的向量GL.Color3(.5f, 0f, .0f);GL.Vertex3(0, 0, 0);GL.Vertex3(v5);//深红色:旋转后的V01GL.Color3(1f, 1f, 1f);GL.Vertex3(0, 0, 0);GL.Vertex3(5 * x, 5 * y, 5 * z); //白色:四元数GL.End();//======================================}见下图(深蓝色:原来的向量,深红色:旋转后的向量, 白色:四元数)十三,二个给定的向量的线性混合:private void LineLerp(){//======================================Vector3 v1 = new Vector3(1f, 0f, 2f);Vector3 v2 = new Vector3(0f, 2f, 1f);GL.PointSize(6f);GL.LineWidth(4f);GL.Begin(BeginMode.Lines);for (float f = 0; f < 1; f += 0.1f){GL.Color3(1f, f, 1 - f);GL.Vertex3(0, 0, 0);Vector3 vf = OpenTK.Vector3.Lerp(v1, v2, f); GL.Vertex3(vf);}GL.End();//======================================}十四,2个给定的向量的球面插值:private void BallLerp(){//======================================Vector3 v1 = new Vector3(.7f, 1f, -.2f);Vector3 v2 = new Vector3(-1f, .2f, .7f);double PI = 3.1416;GL.PointSize(6f);GL.LineWidth(4f);GL.Begin(BeginMode.Lines);for (float f = 0.01f; f < 1; f += 0.01f){GL.Color3(1f, f, 1 - f);GL.Vertex3(0, 0, 0);//余弦式球面插值:Vector3 vMul_1 = OpenTK.Vector3.Multiply(v1, (float)(Math.Cos(f)));Vector3 vMul_2 = OpenTK.Vector3.Multiply(v2, (float)(Math.Cos(1 - f)));Vector3 vAdd = OpenTK.Vector3.Add(vMul_1, vMul_2);////指数式插值://Vector3 vMul_1 = OpenTK.Vector3.Mult(v1, (float)( Math.Exp( -f*f)));//Vector3 vMul_2 = OpenTK.Vector3.Mult(v2, (float)( Math.Exp(f*f-1)));//Vector3 vAdd = OpenTK.Vector3.Add(vMul_1, vMul_2);////正弦式球面插值://v1 = OpenTK.Vector3.Normalize(v1);//v2 = OpenTK.Vector3.Normalize(v2);//double g =Math.Acos(OpenTK.Vector3.Dot(v1, v2));//Vector3 vMul_1 = OpenTK.Vector3.Multiply(v1, (float)(Math.Sin(f * g)/Math.Sin(g))); //Vector3 vMul_2 = OpenTK.Vector3.Multiply(v2, (float)(Math.Sin((1-f)*g)/Math.Sin(g))); //Vector3 vAdd = OpenTK.Vector3.Add(vMul_1, vMul_2);GL.Vertex3(vAdd);}GL.End();//======================================}余弦式球面插值十五,四元数对飞行姿态的控制当运用高阶、多元偏微后,可模拟各种姿态的,各种加速度效果的空间运动。

相关文档
最新文档