轴锁(Gimbal Lock)的题目。使用变换矩阵描述平移、旋转等易。

澳门金冠开户 1

要在活动、旋转、缩放这几种植转移着,又坐旋转的事态绝复杂。实际上,计算机图形学着三维空间的旋转不仅仅发生旋转矩阵一种表达形式,欧拉角(Euler
angles)和四元数(Quaternions)也是常用的法门。

转载:http://www.game798.com/html/2007-05/3689.htm

四元数以及旋转

此处直接吃有结论:如果将单位四元数表示也:

 

q=(n⃗ ⋅sinθ2, cosθ2)q=(n→⋅sinθ2, cosθ2)

 

的款型,那么该单位四元数可以象征绕轴 n⃗ n→
进展 θθ 角的旋。

拖欠单位四元数对应之转矩阵为

 

R(q)=⎡⎣⎢1−2(y2+z2)2(xy+zw)2(xz−yw)2(xy−zw)1−2(x2+z2)2(yz+xw)2(xz+yw)2(yz−xw)1−2(x2+y2)⎤⎦⎥R(q)=[1−2(y2+z2)2(xy−zw)2(xz+yw)2(xy+zw)1−2(x2+z2)2(yz−xw)2(xz−yw)2(yz+xw)1−2(x2+y2)]

 

此处的推理用到了轴-角旋转表示着之Rodrigues’ rotation
formula,具体说明这里不开展了,有趣味之好查相关资料。

俺们发现用四元数描述旋转需要之贮存空间十分粗,更为重要的凡足以动用被称之为球面线性插值(Slerp
Algorithm)的法对四元数进行插值运算,从而解决了平坦旋转的插值问题。

当 OpenGL 或者 DirectX
中我们普通用模型视图矩阵来展开几何变换,当我们期望实现只滑旋转、对旋转进行插值时,就可以采用四首届数就无异器。处理过程为:

  • 范视图矩阵 -> 四元数
  • 下四首位数进行演算
  • 四元数 -> 模型视图矩阵

q=[w,v]


如图:

四元数底定义

四元数凡由数学家 William Rowan Hamilton
于1843年所发明的数学概念,是复数的扩,可以说凡是“三维的复数”,形式呢 w+x i+y j+z kw+x i+y j+z k ,其中 i,j,ki,j,k 的关系如下:

 

i2=j2=k2=−1i⋅j=−j⋅i=ki⋅k=−k⋅i=jj⋅k=−k⋅j=ii2=j2=k2=−1i⋅j=−j⋅i=ki⋅k=−k⋅i=jj⋅k=−k⋅j=i

 

假定发生三三两两单四正数:

 

q1=w1+x1 i+y1 j+z1 kq2=w2+x2 i+y2 j+z2 kq1=w1+x1 i+y1 j+z1 kq2=w2+x2 i+y2 j+z2 k

 

四元数底加法定义如下:

 

q1+q2=(w1+w2)+(x1+x2) i+(y1+y2) j+(z1+z2) kq1+q2=(w1+w2)+(x1+x2) i+(y1+y2) j+(z1+z2) k

 

四元数的乘法定义,利用简易的分配律定义如下:

 

q1⋅q2=(w1⋅w2−x1⋅x2−y1⋅y2−z1⋅z2)+(w1⋅x2+x1⋅w2+y1⋅z2−z1⋅y2) i+(w1⋅y2−x1⋅z2+y1⋅w2+z1⋅x1) j+(w1⋅z2+x1⋅y2−y1⋅x2+z1⋅w2) kq1⋅q2=(w1⋅w2−x1⋅x2−y1⋅y2−z1⋅z2)+(w1⋅x2+x1⋅w2+y1⋅z2−z1⋅y2) i+(w1⋅y2−x1⋅z2+y1⋅w2+z1⋅x1) j+(w1⋅z2+x1⋅y2−y1⋅x2+z1⋅w2) k

 

为好表示,我们以四元数记为:

 

q=(x,y,z,w)=(v⃗ ,w)q=(x,y,z,w)=(v→,w)

 

注意,这里四元数之象征形式与“齐次坐标”长得千篇一律,但是它们之间不要紧关联

四元数常常用来代表旋转,很多人拿其知为“w表示旋转角度,v代表即转轴”,也是错误的!

没错的知晓应为:“w与旋转角度有关,v与现转轴有关”。

四元数底模(norm)定义为

 

|q|=x2+y2+z2+w2|q|=x2+y2+z2+w2

 

模为1的季长数称为单位四元数(Unit quaternions)。

四元数之共轭(conjugate)定义也:

 

q∗=(−v⃗ ,w)q∗=(−v→,w)

 

四元数底倒数定义为:

 

1/q=q∗/|q|21/q=q∗/|q|2

 

 

这就是说轴、角的讲述道以出啊问题啊?虽然轴、角的叙述解决了Gimbal
Lock,但这么的叙说道会造成差值不平坦,差值结果也许跳跃,欧拉描述同样发生这样的题目。

欧拉角

方讨论了纠缠三长达为标轴旋转的盘矩阵,旋转矩阵的一般式(这里没有就此齐次坐标)为:

 

C=⎡⎣⎢c11c21c31c12c22c32c13c23c33⎤⎦⎥C=[c11c12c13c21c22c23c31c32c33]

 

体在三维空间受到之转可以打坐标系的盘来设想(三维空间被盖标轴,即三维线性空间中基的换)。那么矩阵 CC 的老三独列向量实际对诺在原坐标系三个因标轴方向的单位向量在转动后的初坐标系下之坐标。

咱懂得直角坐标系的老三单因标轴方向的单位向量实际上是千篇一律组正式正交基,于是矩阵 CC 是一个正交矩阵。所以旋转矩阵表面上看起依赖让
9 个参数,实际上只是来三只是独立的。

为重新直接地指出这三只单身参数,欧拉(Euler)证明了如下事实:任何一个盘都可由连续实施的老三糟绕轴旋转来促成,这三赖绕轴旋转的转动角就是三独独立参数,称为欧拉角。

冲绕轴旋转的一一不同,欧拉角底表示也殊。常见的欧拉角表示有
Yaw-Pitch-Roll (Y-X-Z顺序),通过下面的图形可以像地进行了解。

澳门金冠开户 2Yaw-Pitch-Roll

偏航(Yaw):

澳门金冠开户 3airplane Yaw

仰俯(Pitch):

澳门金冠开户 4airplane Pitch

侧偏(Roll):

澳门金冠开户 5airplane Roll

设 Yaw 、Pitch 、Roll 三独角度分别吗 θ,φ,ψθ,φ,ψ,那么下欧拉角进行盘对应的旋转变换矩阵为:

 

⎡⎣⎢cosψ cosθ−sinψ cosφ sinθcosψ sinθ+sinψ cosφ cosθsinψ sinφ−sinψ cosθ−cosψ cosφ sinθ−sinψ sinθ+cosψ cosφ cosθcosψ sinφsinφ sinθ−sinφ cosθcosφ⎤⎦⎥[cosψ cosθ−sinψ cosφ sinθ−sinψ cosθ−cosψ cosφ sinθsinφ sinθcosψ sinθ+sinψ cosφ cosθ−sinψ sinθ+cosψ cosφ cosθ−sinφ cosθsinψ sinφcosψ sinφcosφ]

 

骨子里 Yaw 、Pitch 、Roll 的转就各自针对许在前我们吃起之盘矩阵 Rx(θ),Ry(φ),Rz(ψ)Rx(θ),Ry(φ),Rz(ψ),上面的矩阵就是及时三个矩阵的复合。

欧拉角的益处是粗略、容易懂,但采用它们看成旋转的家伙来人命关天的短—万向节死锁(Gimbal
Lock)。

万往节死锁是负物体的少数单转轴指向同一个势。实际上,当半只转轴平行时,我们便说万朝向节锁现象产生了,换句话说,绕一个轴旋转可能会见挂住其它一个幅的转,从而失去一维自由度。

如,三维空间受到有一个平行于 X 轴的通向量,我们拿其绕 Y 轴旋转直到其平行于
Z 轴,这时,我们会发觉其他绕 Z
轴的盘都改成不了拖欠向量的势头,即出现了万朝向节死锁。

由万通往节死锁的有,使用欧拉角也无力回天充分好地处理旋转的插值(以落实“平滑”旋转)。

 


q(t)=(1-t)q1+t q2

盘矩阵

老三维空间受到的一个点 PP ,我们因而齐次坐标表示:

 

P=[x,y,z,w]TP=[x,y,z,w]T

 

咱俩第一考虑个别绕 X 轴、Y 轴、Z 轴转动一定角度的状。

澳门金冠开户 6纠缠以标轴旋转

设 PP 绕
X 轴、Y 轴、Z 轴的旋转角度分别吗 αα、ββ 和 θθ。

咱俩采取右手坐标系,旋转角度的正向由右手定则确定。

点绕以标轴旋转可以考虑点在相应坐标平面上影的转动。比如绕 Y
轴旋转,那么考虑点 PP 在
X-Z 平面上的阴影的转,如下图所示:

澳门金冠开户 7绕Y轴旋转

假设点 PP 在
X-Z 平面及的投影点与坐标原点连成的向量长度也 L
,那么根据粗略的面几何知识,我们得收获:

 

[x1z1]=[cosβ−sinβsinβcosβ][xz][x1z1]=[cosβsinβ−sinβcosβ][xz]

 

故此齐次坐标表示绕Y轴的盘也:

 

⎡⎣⎢⎢⎢x1y1z1w1⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢cosβ0−sinβ00100sinβ0cosβ00001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢xyzw⎤⎦⎥⎥⎥[x1y1z1w1]=[cosβ0sinβ00100−sinβ0cosβ00001][xyzw]

 

同理可各自获得绕X轴与绕Y轴的事态。

绕X轴旋转:

 

⎡⎣⎢⎢⎢x2y2z2w2⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢10000cosαsinα00−sinαcosα00001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢xyzw⎤⎦⎥⎥⎥[x2y2z2w2]=[10000cosα−sinα00sinαcosα00001][xyzw]

 

绕Z轴旋转:

 

⎡⎣⎢⎢⎢x3y3z3w3⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢cosθsinθ00−sinθcosθ0000100001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢xyzw⎤⎦⎥⎥⎥[x3y3z3w3]=[cosθ−sinθ00sinθcosθ0000100001][xyzw]

 

俺们好拿绕X、Y和Z坐标轴的转矩阵分别记否 Rx(α),Ry(β),Rz(θ)Rx(α),Ry(β),Rz(θ),则生:

 

Rx(α)=⎡⎣⎢⎢⎢10000cosαsinα00−sinαcosα00001⎤⎦⎥⎥⎥Rx(α)=[10000cosα−sinα00sinαcosα00001]

 

 

Ry(β)=⎡⎣⎢⎢⎢cosβ0−sinβ00100sinβ0cosβ00001⎤⎦⎥⎥⎥Ry(β)=[cosβ0sinβ00100−sinβ0cosβ00001]

 

 

Rz(θ)=⎡⎣⎢⎢⎢cosθsinθ00−sinθcosθ0000100001⎤⎦⎥⎥⎥Rz(θ)=[cosθ−sinθ00sinθcosθ0000100001]

 

旋转矩阵可以经另外旋转矩阵复合得到(矩阵乘法)。

 


其中w是实数,x,y,z是虚数,其中:

四元数

自从前面的议论我们发现三角度系统(three-angle
system)无法充分好地处理旋转的插值。下面介绍四元数(Quaternions)以及怎样使用四元数描述旋转。

 

首先||q|| = Norm(q)=sqrt(w2 + x2 + y2 + z2)

在微机图形学的就学着,几何变换(Transformations)是如出一辙片要的内容,我们用齐次坐标(Homogeneous
coordinates)描述点和向量,使用变换矩阵描述平移、旋转等转移。

关于四长数的运算法则和演绎这里出篇详细的稿子介绍,重要的凡少数,类似与Matrix的季处女数之乘法是不足交换的,四最先数之乘法的含义也类似于Matrix的乘法-可以以简单只转合并,例如:

 


了应对是题材,先来探望一般关于旋转(面向)的叙说道-欧拉描述法。它使最简便易行的x,y,z值来分别代表在x,y,z轴上的盘角度,其取值为
0-360(或者0-2pi),一般以roll,pitch,yaw来表示这些分量的转动值。需要专注的是,这里的旋是对世界坐标系说的,这表示
第一不好的转不见面影响第二、三不良的转轴,简单的说,三角度系统无法表现任意轴的旋转,只要同开始转动,物体本身即失去了任意轴的自主性,这也即造成了万向
轴锁(Gimbal Lock)的题材。


中(ax,ay,az)表示轴的矢量,theta代表绕此轴的旋转角度,为什么是这么?和轴、角描述到底有啊不同?这是坐轴角描述的“四元组”并无是
一个空中下的物,首先(ax,ay,az)是一个3维坐标下之矢量,而theta则是级坐标下的角度,简单的将她们结合及联合并无可知保证他们插值结果的
稳定性,因为她们没辙归一化,所以无克担保最终插值后拿走的矢量长度(经过旋转变换后少接触次的相距)相等,而四元数在是于一个合的4维空间中,方便归
一化来插值,又能够有益之获取轴、角这样用于3D图像的信数量,所以用四首数还当不过了。

尽管线性插值很实惠,但无能够以一定的速率描述q1到q2之间的曲线,这也是该弊端,我们需要找到同样种植插值方法让q1->q(t)之间的夹角θ是线性的,即θ(t)=(1-t)θ1+t*θ2,这样我们取得了球形线性插值函数q(t),如下:

y = ay * sin(theta/2)

q(t)=(1-t)q1+t q2 / || (1-t)q1+t q2 ||

i*i=-1

还有同种植是轴角的叙说道(即我直接认为的季头数之代表拟),这种办法较欧拉描述自己,它避免了
Gimbal
Lock,它应用一个3维向量表示转轴和一个角度分量表示绕此转轴的转角度,即(x,y,z,angle),一般代表为(x,y,z,w)或者
(v,w)。但这种描述法也未符合插值。

theta, ax, ay, az = From (FinalQ)

胡四元数可以避Gimbal Lock

glRotatef( angleY, 0, 1, 0)

说了如此多,那么四元数与旋转到底出啊关系?我原先一直当轴、角的叙述就是是四元数,如果是那么其和旋转的关系吧家喻户晓,但连无是这般简单,轴、角描述到四第一数的中转:

其间(ax,ay,az)描述一长达任意轴,theta描述了纠缠此任意轴旋转的角度,而有所的参数澳门金冠开户都出自于具有描述旋转的季处女数开乘法之后得到的价,可以看来这样一次性的旋不见面带来问题。这里有个例演示了采用四状元数不见面来Gimbal
Lock的问题。

glRotatef(theta, ax, ay, az);

里头v=(x,y,z)是矢量,w是标量,虽然v是矢量,但非克简单的明啊3D空间的矢量,它是4维空间被之之矢量,也是甚勿容易想像的。

因为w2 + x2 + y2 + z2=1

四元数吧是足以归一化的,并且只有单位化的季老大数才用来描述旋转(面向),四首届数之单位化与Vector类似,

哎呀是四首位数

于欧拉描述中,之所以会发出Gimbal
Lock是盖运用的三角度系统是逐一、顺序变换的,如果在OGL中,代码可能这么:

唯独这个结果是索要规格化的,否则q(t)的单位长度会发生变化,所以

好吧,我得承认到目前为止我还尚无了知晓四元数,我已经把季长数清楚为轴、角表示的4维向量,也就于下午本身才起与同事的答辩中了解了季状元数不净是比、轴这么简单,为者状点感受给那些和自己同一将了2年3D娱乐的还免了解四元数的爱人。

Q=Q1*Q2

啊可代表也:

q=w+xi+yj+zk

关于插值

glRotatef( angleX, 1, 0, 0)

表示Q的是先做Q2的旋,再举行Q1的转的结果,而多只四首批数的旋转也是足以统一的,根据四元数乘法的概念,可以算是有个别只四元数开同样软乘法需要16浅乘法和加法,而3×3的矩阵则需27运算,所以当有多次转悠操作时,使用四元数可以获得重新胜之盘算效率。

在意:以上代码是逐一执行,而以的同时是联合之世界坐标,这样当第一旋转了Y轴后,Z轴将不再是本来的Z轴,而可能变成X轴,这样针对Z的变通可能失效。

FinalQ =CameraQ * NewQ

所以Normlize(q)=q/Norm(q)=q / sqrt(w2 + x2 + y2 + z2)

w = cos(theta/2)

假如用D3D,可以直接用D3DXQuaternionSlerp函数就足以完成这插值过程。

z = az * sin(theta/2)

glRotatef( angleZ, 0, 0, 1)

j*j=-1

要是四状元数描述的团团转代码可能是这样:

干什么用四元数

四元数一般定义如下:

那究竟什么是Gimbal
Lock呢?正而前所说,因为欧拉描述着针对x,y,z的转描述是世界坐标系下的值,所以当任意一幅转动90°的时光会招致该轴同其他轴重合,此时旋
转受叠的轴可能无任何作用,这就算是Gimbal
Lock,这里产生个例证演示了Gimbal
Lock,点击这里下载。运行此事例,使用左右箭头改变yaw为90°,此时不论是是运用前后箭头还是Insert、Page
Up键都心有余而力不足转移Pitch,而还是改了范的roll。

以四元数的由就是在乎她非常适合插值,这是坐他是一个得规格化的4维向量,最简易的插值算法就是线性插值,公式要:

TempQ = From Eula(x,y,z)

k*k=-1

q(t)=q1 * sinθ(1-t)/sinθ + q2 * sinθt/sineθ

x = ax * sin(theta/2)

相关文章