您好,欢迎访问三七文档
复数是由实数加上虚数单位i组成,其中i^2=-1\,。相似地,四元数都是由实数加上三个元素i、j、k组成,而且它们有如下的关系:i^2=j^2=k^2=ijk=-1\,每个四元数都是1、i、j和k的线性组合,即是四元数一般可表示为a+bi+cj+dk\,。四元数不像实数或复数那样,它的乘法是不可交换的,看乘数表四元数的优点是:表达式无奇点(和例如欧拉角之类的表示相比)比矩阵更简炼(也更快速)单位四元数的对可以表示四维空间中的一个转动。以矩陣表示四元數[编辑]有兩種方法能以矩陣表示四元數,並以矩陣之加法、乘法應用於四元數之加法、乘法。第一種是以二階複數矩陣表示。若h=a+bi+cj+dk則它的複數形式為:這種表示法有如下優點:所有複數(c=d=0)就相應於一個實矩陣。四元數的絕對值的平方就等於矩陣的行列式。四元數的共軛值就等於矩陣的共軛轉置。對於單位四元數(|h|=1)而言,這種表示方式給了四維球体和SU(2)之間的一個同型,而後者對於量子力學中的自旋的研究十分重要。(請另見泡利矩陣)第二種則是以四階實數矩陣表示:其中四元數的共軛等於矩陣的轉置。(转载)四元数入门(2012-02-1400:52:24)转载▼标签:computergraphicquaternion四元数it分类:学习(转载)四元数入门---------------------------------------------------------------------=735114元数宝典这是国内找不到的超好文章。(为什么大陆的4元数文章很垃圾呢?)(翻译中。。。奉献给大家~~)70秒即懂,能使用,用四元数,4元数,阔特尼恩,Quaternion旋转(C)中田亨(独立行政法人产业技术综合研究所数字人类研究中心研究员博士(工学))2003年11月25日★这个页面的对象读者想把三次元的旋转,用CG等定量地处理的人使用欧拉角(EulerAngles)的话,不懂得其道理的人卡尔丹角和欧拉角(CardanAngles)不能区别的人对吉恩瓦尔洛克很困惑的人但是,对数学之类麻烦的事情很讨厌的人想要实例程序的人没有时间的人★旋转篇:我将说明使用了四元数(siyuanshu,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」是外积的意思。注意:一般ABBA所以乘法的左右要注意!(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的共轭四元数。)那么,如要实行旋转,则RPQ=(0;答案)请像这样三明治式地计算。这个值的虚部就是旋转之后的点的坐标值。(另外,实部应该为零。请验算看看)*未完。。。instemast_REAL2007-2-2419:04:57注册:2007-2状态:Offline1Topinstemast_REALExp:124侦察兵发表于:2007-2-2419:06:00档案|短信|树状|收藏|编辑|删除|引用--------------------------------------------------------------------------------Re:4元数宝典///Quaternion.cpp///(C)ToruNakata,toru-nakata@aist.go.jp///2004Dec29#includemath.h#includeiostream.h///DefineDatatypetypedefstruct{doublet;//real-componentdoublex;//x-componentdoubley;//y-componentdoublez;//z-component}quaternion;////Kakezan乘quaternionKakezan(quaternionleft,quaternionright){quaternionans;doubled1,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;d2=right.t*left.z;d3=left.x*right.y;d4=-left.y*right.x;ans.z=d1+d2+d3+d4;returnans;}////MakeRotationalquaternion求旋转四元quaternionMakeRotationalQuaternion(doubleradian,doubleAxisX,doubleAxisY,doubleAxisZ){quaternionans;doublenorm;doubleccc,sss;ans.t=ans.x=ans.y=ans.z=0.0;norm=AxisX*AxisX+AxisY*AxisY+AxisZ*AxisZ;if(norm=0.0)returnans;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.x=sss*AxisX;ans.y=sss*AxisY;ans.z=sss*AxisZ;returnans;}////PutXYZintoquaternion把XYZ到四元quaternionPutXYZToQuaternion(doublePosX,doublePosY,doublePosZ){quaternionans;ans.t=0.0;ans.x=PosX;ans.y=PosY;ans.z=PosZ;returnans;}/////mainintmain(){doublepx,py,pz;doubleax,ay,az,th;quaternionppp,qqq,rrr;coutPointPosition(x,y,z)endl;coutx=;cinpx;couty=;cinpy;coutz=;cinpz;ppp=PutXYZToQuaternion(px,py,pz);while(1){cout/nRotationDegree?(Enter0toQuit)endl;coutangle=;cinth;if(th==0.0)break;coutRotationAxisDirection?(x,y,z)endl;coutx=;cinax;couty=;cinay;coutz=;cinaz;th*=3.1415926535897932384626433832795/180.0;///Degree-radian;qqq=MakeRotationalQuaternion(th,ax,ay,az);rrr=MakeRotationalQuaternion(-th,ax,ay,az);ppp=Kakezan(rrr,ppp);ppp=Kakezan(ppp,qqq);cout/nAnserX=ppp.x/nY=ppp.y/nZ=ppp.zendl;}return0;}*未完。。。四元数的长处和缺点冰川球的吉恩瓦尔。吸收前后左右的倾斜而保持水平长处“直观的”如果给出旋转轴和旋转角度的话,就算不考虑欧拉角之类的,也可以立即计算。“连续性”表示相似的旋转的四元数的值也相似。没有吉恩瓦尔洛克现象。(所谓吉恩瓦尔洛克就是,“北极和南极等特殊点,在自转的情况下是不能动的。”“在中国餐馆的圆桌上,放在正中央的酱油怎么转也转不近”等,有效的自由度和次元丧失的现象。在软件中成为例外处理的困难因而是麻烦事。本来吉恩瓦尔是把罗盘针吊起来的机构。为了使得即便船摇晃罗盘针也保持水平而不摇晃。吉恩瓦尔的柄把罗盘针晃晃荡荡地吊着,但若使得这些东西的方向一致了,就不能晃了(=洛克lock),振动传到罗盘针了。)“记忆效率好,计算快”旋转能够只用4个数值记述。与阿弗因变换矩阵等相比,不用记忆。减少不必要的计算。缺点“从外观上看不知道表示什么意思”从四元数的成分来看,其表示什么意思,一眼看不出来。“不能表示多圈旋转”如你所见,使用cos和sin,所以θ是10度,370度,还是-350度,不能区别。想要制作咕噜咕噜转许多圈的动画的情况下,不想只旋转一遍,请仔细区分。“是以原点为中心的旋转”想以原点以外为中心的情况,请让坐标穿上木屐,旋转,然后还原木屐。(下文的一般位移篇也check一下吧!)四元数旋转的软件的源代码sourcecode贴过了一般位移篇:作为旋转以外的变形的扩大缩小(与并进)的步骤考虑四元数的标量倍,就可以将旋转篇的结果坐标给扩大缩小。比如,P=(0;x,y,z)(另外实部可以为任意值。0好算)kQ=(kcos(θ/2);kαsin(θ/2),kβsin(θ/2),kγsin(θ/2))kR=(kcos(θ/2);-kαsin(θ/2),-kβsin(θ/2),-kγsin(θ/2))(KR是KQ的共轭四元数。)则有,kRPkQ=(0;旋转后的XYZ坐标的k的自乘倍)这样,就可以将以原点为中心的旋转,和以原点为中心的扩大缩小一起操作了。这表示,可以自由地操作以原点为准的方位及其距离。就是说,将一点(X,Y,Z)映射到任意的点(X',Y',Z')的变换,可以用四元数表示。但X=Y=Z=0的情况例外。制作你所希望的四元数篇:实施某旋转的四元数的作法表示将一点A,移到别的点B的以原点为中心的旋转的四元数,像这样制作。旋转轴(α,β,γ)和位置向量的外积B×A平行且同向。(A和B的顺序,按四元数R和Q的乘法的顺序交替。本文的乘法顺序的定义的话,就是BA的顺序。)作了除法之后,将把长度改为1。(α,β,γ)=(B×A)/(|B×A|)cos(θ)是,将位置向量的内积B·A除以|B|·|A|。cos(θ)=(B·A)/(|B|·|A|)根据三角函数的半角公式,cos(θ/2)=
本文标题:学习四元数笔记
链接地址:https://www.777doc.com/doc-2487027 .html