3D图形:矩阵、欧拉角、四元数与方位的故事


又研究了将近两个星期的3D图形到了我最想研究的地方了,因为欧拉角与四元数的原因导致OpenGL ES的研究进度变缓,研究完这一块,我将教大家如何使用OpenGL ES做一个自转加公转的正立方体.效果如下.


在说矩阵、欧拉角与四元数三种与角位移的关系之前,我们先来说说 方向、方位与角位移的区别.

在现实生活中,我们很少区分"方向"和"方位"的区别(非路痴观点),比如一个朋友来看望你,但是他可能在某一个公交站下车了,你去接他,但是找不到他,你急忙给他来一个电话"兄弟,你在哪个方向呢?"或者说是"兄弟,你在哪个方位呢?",如果不细细品味这两句话,其实感觉差异不是太大.通过一痛电话的扯,然后你们成功的面基了,但是你们却并不会在意"方向"和"方位"的区别.那么在几何中,这两者到底有什么差异呢?

这里我就盗用一下书上的例子,比如一个向量如果沿着自己的方向选择是不会改变自身任何属性的,如下图所示,因为向量是只有方向没有方位的.

那么对于一个物体,情况却是不一样的,一个物体如果朝向某一个方向的时候,然后自转,那么这个物体是会发生空间上的改变的,如下图一个锥体的自转,那么它的空间位置是发生改变的,也就是锥体的方位发生了改变了.

上面让我们对物体的方向和方位的区别有了一个大体上的了解,那么我们在空间中如何描述一个方位呢?这就需要使用到 角位移 了.

我们先说一个类似的例子,我们该如何描述空间中一个物体的 位置 呢?必须要把物体放在特定的坐标系中(好像很生涩).比如,如果我们说在一个坐标系中,有一个点是[1,1,1],那么你会非常轻易的想到了这个点在空间中的位置.描述 空间位置 其实就是描述相对于给定参考点(坐标原点)的 位移 .

其实,描述一个物体的方位是一样的,我们是不可能凭空描述一个物体的方位,我盟需要一个已知方位的参考量,通过这个参考量的旋转得到当前方位,那么旋转的量就叫做 角位移 .通过概念我们知道,角位移就是用来描述方位的,类似于速度就是用来描述物体运动快慢的一样.当然了,这里我要声明的一点就是虽然角位移是用来描述方位的,但是两者是不同的.例如,我们可以这么说,一个物体的方位是如何如何的;一个物体是通过某个已知方位经过角位移XXX旋转得到.所以说,方位是用来描述一个单一的"状态".但是角位移是用来描述两个状态之间的差异.

那么,我们在实际中如何描述方位与角位移呢?具体而言,我们使用矩阵和四元数来表示"角位移",用欧拉角来表示方位.接下来,我们逐一介绍一下.


在3D环境中,描述坐标系中方位的方式就是列出这个坐标系的基向量,当然了,这些基向量是用其他表示的,并不是它本身的基向量,比如当前转换完成的坐标系的三个基向量 p [1,0,0] q[0,1,0] r[0,0,1] ,这是使用本身的坐标系表示,如果放在其他坐标系中表示当前的三个基向量可能就会发生改变.这是因为参照点选择的不同.至于基向量是如何改变的就需要在 3D图形:矩阵与线性变换 说过的旋转矩阵的相关知识了.这个就不过多的解释了.比如下图,由向量 p,q,r 组建的新的坐标系用原来的坐标系表示确实如图右边所示.

其实对于我们开发来说,我们只需要知道方位是可以使用3X3矩阵来表示的.矩阵表示的是转换后的基向量即可.接下来我们说一下使用矩阵来表示角位移有什么样的优势和缺点.我就直接拿书上所讲的了,各位看官莫怪莫怪.

当然了,我们使用矩阵来表示角位移只是作为了解而已,接下来,我们看一下如何使用欧拉角表示方位的.


很多人在大学中可能会接触到矩阵,但是欧拉角可能是接触的比较少,最少作为一个学物理的我是这样的.一开始觉得欧拉角比较难理解,但是看了3D图形之后,发现用欧拉角表示方位将会比矩阵更加的直观而且易于使用.下面我们就看一下欧拉角相关的知识.(下面的基本概念跟书上的差不多,因为我觉得书上写个就很好了,所以我就没有再次总结,所以只是写了一遍.)

首先,欧拉角的基本思想是 将角位移分解为绕三个互相垂直轴的三个旋转组成的序列 .那么这个三个互相垂直的轴是如何定义的呢?其实任意三个轴和任意顺序都是可以的,但是最常用的就是使用笛卡尔坐标系并且按照一定顺序组成的旋转序列.最常用的约定,就是所谓的 "heading-pitch-bank"约定 ,在这个系统中,一个方位被定义为heading角,一个pitch角,一个bank角.其中,在左手坐标系中,我们把heading角定义为绕y轴旋转量,pitch角为绕x轴旋转量,bank角为绕z轴旋转量.旋转法则遵守左手法则(具体请参考 3D图形:矩阵与线性变换 中的旋转模块).它的基本思想是让物体开始于"标准"方位,就是物体坐标轴和惯性坐标轴对齐.让物体做heading、pitch、bank旋转之后达到最终的空间方位.

例如下图一个锥体,一开始它自身坐标轴与惯性坐标轴是一致.

然后我把heading角设置为45°.根据左手法则(通常使用,但是决定每个旋转的正方向不一定要准守右手或者左手定则),它是会做顺时针旋转.

接着物体的坐标系就发生如下的改变了.锥体的自身坐标轴不再与惯性坐标轴一致,x,z轴都发生了对应的改变.当然了,物体的空间方位也发生了对应的改变.

然后接下来就是pitch、bank旋转,分别是绕x轴旋转和z轴旋转,跟heading旋转是类似的,最后得到锥体的最终的空间方位.这里需要注意的是 不管是 heading旋转、 pitch旋转还是bank旋转,旋转的坐标轴都是自身的坐标轴!不是惯性坐标轴!

上面,看完了"heading-pitch-bank"约定系统是如何做空间方位的旋转改变的,接下来,我们来瞅瞅关于欧拉角的其他约定.

上面我们对欧拉角的接下来,我们看一下欧拉角的优点和缺点.透露一点,其实欧拉角的缺点就是引起万向锁的原因.

其实是使用欧拉角会出现一个非常有趣的现象,那就是 万向锁 ,我们看一下"heading-pitch-bank"系统这个系统中,如果pitch角度为±90°,那么就出事了,会出现什么问题呢?heading角与bank角如果相同,那么你会发现物体最终的方位是一致的,这怎么可能,这就比较尴尬了,其实类似于这种旋转pitch角度为±90°中,物体是缺失一个旋转轴的.也就是说,当pitch角度为±90°,那么bank是0.只有heading一个旋转轴起作用,是不是懵圈了?没问题,下面我要分享一个视频,我觉得这个视频会比文字更加生动形象,请对照上面的文字自行研究.


看完使用矩阵和欧拉角表示方位.接下来,我们就看一下四元数, 四元数 一个新的概念出现在我的眼前的时候我在想,他否是因为有四个数才叫四元数,确实,四元数实际是一个标量分量和一个3D向量分量组成用来表示方位.四元数的两种记法如下所示:[ω, ν ],[ω,(x,y,z)].
复数,真心好久没用了.高中的时候我们就开始接触简单的复数了,现在简单说一下复数,其实我也顺道复习一下了.
首先,复数的形式为a+bi,其中i²=-1,a称作实部(实数部分),b称作虚部(虚数部分).对于复数的运算,我们主要说说 复数的模 , 复数的模 可以很好的表示2D中的旋转变换,我们先看看前面说到过的2D环境中的旋转矩阵.

然后,我们再看一下,一个示例,假设一个复数v = (x,y)旋转θ度得到v',如下图所示.

为了完成此次的旋转,我们需要引入第二个复数 q = (cosθ,sinθ),现在旋转之后的复数v'就可以使用复数的乘法计算出来了.计算过程如下所示.
v = x +yi
q = cosθ +isinθ
v' = vq = (x +yi)(cosθ +isinθ) = (xcosθ-ysinθ)+(xsinθ+ycosθ)i
跟上面的2D环境中旋转矩阵效果是一样的.只是形式不相同而已.

上面说了这么一大堆,那么到底四元数和复数有着怎样的关系呢?其实一个四元数[w,(x,y,z)]定义了复数 w +xi +yj +zk ,也就是说一个四元数是包含着一个实部和三个虚部.
其实四元数的出现也是有故事的,我直接把书上搬过来,当做在枯燥的学习中的一个轻松时刻吧(实际上,然并卵😂😂😂),爱尔兰的数学家哈密尔顿其实一直想把复数复数从2D扩展到3D,一开始他认为,3D中的复数应该有一个实部和两个虚部,然后他没有创造出这种一个实部两个虚部有意义的复数.1843年,在他去演讲的路上他突然意识到应该有三个虚部而不是两个虚部.他把这种新复数类型行者的等式刻在了Broome桥上.这样四元数就诞生了.等式如下所示.
i² = j² = k² = -1
ij = k,ji = -k
jk = i,kj = -i
ki = j,ik = -j


我们已经知道了矩阵和欧拉角的情况,现在我们就看一下四元数是如何表示角位移的.在3D环境中任意的一个角位移都可以理解为绕某个轴旋转一定的角度,在 3D图形:矩阵与线性变换 这个里面曾经说过一个3D中绕任意轴旋转的公式(还记得当初那个验证过程吗,愣是搞了一天😭,具体验证过程就不说了,请查看原来的文章).公式如下所示.其中,θ代表着旋转角度, n 代表着旋转轴.因此轴-角对( n ,θ)定义了一个角位移:绕 n 指定的轴旋转θ角.

四元数的解释其实就是角位移的轴-角对方式,但是呢, n 和θ并不是直接放入到四元数中的.它们的形式如下所示.

那么问题来了,为什么不直接放入四元数中呢?这是有原因的,这个原因,我将会在下一篇四元数的相关运算中来说明一下.现在只要知道四元数的解释其实就是角位移的轴-角对方式即可.

</b>

自己写完这篇文章总算是对矩阵、欧拉角、四元数、角位移、方位有了一个大体的了解了.整体下来发现真心枯燥的,但是还是坚持了下来了,希望小伙伴也能坚持看完,不懂的或者有疑问可以与骚栋一起探讨.3D图像下一篇我将接着研究本篇的四元数,不过是与四元数的运算相关的知识.希望大家持续关注.

最后还是要附上<<3D数学基础 图形与游戏开发>>的pdf版的传送门.




  • 3D鍥惧舰:鐭╅樀銆娆ф媺瑙銆鍥涘厓鏁涓庢柟浣嶇殑鏁呬簨
    绛旓細鎴戜滑宸茬粡鐭ラ亾浜嗙煩闃靛拰娆ф媺瑙鐨勬儏鍐,鐜板湪鎴戜滑灏辩湅涓涓鍥涘厓鏁鏄浣曡〃绀鸿浣嶇Щ鐨.鍦3D鐜涓换鎰忕殑涓涓浣嶇Щ閮藉彲浠ョ悊瑙d负缁曟煇涓酱鏃嬭浆涓瀹氱殑瑙掑害,鍦 3D鍥惧舰:鐭╅樀涓庣嚎鎬у彉鎹 杩欎釜閲岄潰鏇剧粡璇磋繃涓涓3D涓粫浠绘剰杞存棆杞殑鍏紡(杩樿寰楀綋鍒濋偅涓獙璇佽繃绋嬪悧,鎰f槸鎼炰簡涓澶,鍏蜂綋楠岃瘉杩囩▼灏变笉璇翠簡,璇锋煡鐪嬪師鏉ョ殑鏂囩珷).鍏紡濡...
  • 濡備綍閫氫織鍦拌В閲娆ф媺瑙?涔嬪悗涓轰綍瑕佸紩鍏鍥涘厓鏁?
    绛旓細缁撹鍦ㄦ暟瀛椾笘鐣岀殑鑸炲彴涓婏紝娆ф媺瑙掑拰鍥涘厓鏁灏卞儚鏃嬭浆鐨勮垶鑰咃紝娆ф媺瑙掍互鍏剁洿瑙傛у惛寮曠溂鐞冿紝浣嗗洓鍏冩暟浠ュ叾绮剧‘鍜屾棤姝婚攣鐨勪紭鍔挎垚涓虹幇浠f妧鏈殑棣栭夈傝窡闅忛┈鍚屽锛岃鎴戜滑涓鍚屾帰绱㈡暟瀛︾殑濂囧涓栫晫锛岃В閿佹洿澶氫笁缁寸┖闂寸殑濂ョ銆
  • 鍥涘厓鏁(Quaternions)
    绛旓細鍥涘厓鏁帮紝杩欎釜鐪嬩技澶嶆潅鍗存棤姣旂簿宸х殑鏁板宸ュ叿锛屼互鍏跺湪绋冲畾鏃嬭浆鎻掑间腑鐨勫崜瓒婅〃鐜帮紝瓒呰秺浜嗕紶缁熺殑娆ф媺瑙鍜鐭╅樀锛鎴愪负涓夌淮瀹氬悜鐨勯閫夎〃杈炬墜娈点傛瘡涓笁缁村畾鍚戯紝閮藉彲浠ラ氳繃涓涓壒瀹氳酱鐨勬棆杞潵绮惧噯鎻忕粯锛岃屽洓鍏冩暟鐨勮繍绠楋紝濡傚姞娉曘佷箻娉曞拰鍏辫江锛屼娇寰楁棆杞殑琛ㄧず鍜岃浆鎹㈠彉寰楁棦鐩磋鍙堥珮鏁堛傜壒鍒湴锛屽崟浣嶅洓鍏冩暟锛屽叾妯″间负1...
  • 鍥涘厓鏁鍦ㄨ绠楁満鍥惧舰瀛﹂鍩熶腑鏈夊摢浜涘簲鐢?
    绛旓細1.3D鏃嬭浆锛氬洓鍏冩暟鍙互鐢ㄤ簬琛ㄧず鍜岃绠3D鐗╀綋鐨勬棆杞傜浉姣斾簬娆ф媺瑙掞紝鍥涘厓鏁鍙互閬垮厤涓囧悜閿侀棶棰橈紝骞朵笖鍏锋湁鏇村ソ鐨勬暟鍊肩ǔ瀹氭с傚洜姝わ紝瀹冧滑琚箍娉涚敤浜3D鍥惧舰娓叉煋鍜屽姩鐢讳腑銆2.鎻掑煎拰骞虫粦锛氬洓鍏冩暟鍙互鐢ㄤ簬鎻掑煎拰骞虫粦鎿嶄綔锛屼緥濡傚湪鍏抽敭甯у姩鐢讳腑鎻掑肩墿浣撶殑浣嶇疆銆佹棆杞拰缂╂斁銆傞氳繃浣跨敤鍥涘厓鏁帮紝鍙互瀹炵幇骞虫粦鐨勮繃娓℃晥鏋滐紝...
  • 3D涓殑瑙掍綅绉诲拰鏂逛綅
    绛旓細鎵浠ヤ竴鑸敤鐭╅樀鍜鍥涘厓鏁鏉ユ弿杩扳滆浣嶇Щ鈥濓紝鐢娆ф媺瑙鏉ユ弿杩扳滄柟浣嶁濄傛鎷夎鐨勫熀鏈濇兂鏄皢瑙掍綅绉诲垎瑙d负缁曚笁涓簰鐩稿瀭鐩磋酱鐨勪笁涓棆杞粍鎴愮殑搴忓垪銆備竴鑸槸浣跨敤绗涘崱灏斿潗鏍囩郴骞舵寜鐓т竴瀹氱殑椤哄簭鎵缁勬垚鐨勬棆杞簭鍒楋紝鏈甯哥敤鐨勭害瀹氾紝鏄渉eading-pitch-bank鈥濈害瀹氥俬eading涓虹粫y杞寸殑鏃嬭浆閲忥紝pitch涓虹粫鐗╀綋鍧愭爣绯荤殑x杞...
  • 娆ф媺瑙鍙樻崲闇瑕佸摢鍥涗釜鍙傛暟?
    绛旓細鏃嬭浆瑙 琛ㄧず鍏堕暱搴 娆ф媺瑙 鍗冲皢杞磋褰㈠紡鍒嗙鎴愪笁涓酱涓婄殑鏃嬭浆鍙樻崲瑙掑舰寮 鍥涘厓鏁 涓绉嶆墿灞曞鏁板舰寮忥紝绗﹀彿 锛屾暟瀛﹀舰寮忥細 鍏朵腑 鍥涜呬箣闂寸殑涓浜涜浆鎹㈠叧绯伙細 锛1锛夋棆杞鐭╅樀涓庤酱瑙掗棿鐨勫彉鎹細 琛ㄧず鍚戦噺鍒板弽瀵圭О鐭╅樀鐨勮浆鎹紝 琛ㄧず鐭╅樀鐨 杩 锛 绗竴涓紡瀛愬嵆缃楀痉閲屾牸鏂叕寮忥紝杞...
  • VR-鍥涘厓绱犮娆ф媺瑙杞崲鏉′欢
    绛旓細涓鑸浜庢棆杞鐭╅樀(3 3),鏃嬭浆鍚戦噺/瑙掕酱(3 1),鍥涘厓鏁(4*1),鎴戜滑缁欏畾涓涓叉暟瀛,灏辫兘琛ㄧず娓呮涓涓Э鎬/鏃嬭浆.姣斿杩欓噷缁欏嚭涓涓棆杞煩闃礡:琛ㄧず鍒氫綋鍦ˋ鏌愬潗鏍囩郴涓嬬殑濮挎, 鎴戜滑灏卞彲浠ョ‘鍒囩殑鐢诲嚭鍒氫綋A鐨勫Э鎬.浣嗗鏋滄垜缁欏嚭涓缁娆ф媺瑙(鍚庨潰閮芥槸鎸嘥ait鈥揃ryan angles),缁晉,y,z涓変釜杞寸殑杞鍒嗗埆涓(伪,...
  • 鍥涘厓鏁杞娆ф媺瑙浠涔堜功涓婅
    绛旓細鍥涘厓鏁杞娆ф媺瑙浠ヤ笅涔︿笂璁诧細1銆"3DMathPrimerforGraphicsandGameDevelopment"锛堜綔鑰咃細FletcherDunn銆両anParberry锛-杩欐湰涔︽槸涓鏈緢濂界殑鍏ラ棬鏁欐潗锛屽畠娑电洊浜嗚绠楁満鍥惧舰瀛︿腑鐨勮澶氭暟瀛︽蹇碉紝鍖呮嫭鍥涘厓鏁板拰娆ф媺瑙掋2銆"Real-TimeRendering"锛堜綔鑰咃細TomasAkenine-M?ller銆丒ricHaines銆丯atyHoffman锛-杩欐槸涓鏈粡鍏哥殑...
  • 鍥涘厓鏁鍜娆ф媺瑙浠ュ強鏂瑰悜浣欏鸡鐨勫尯鍒
    绛旓細鍥涘厓鏁鍜屾鎷夎浠ュ強鏂瑰悜浣欏鸡鐨勫尯鍒 鐢ㄤ竴鍙ヨ瘽璇锛屾鎷夎灏辨槸鐗╀綋缁曞潗鏍囩郴涓変釜鍧愭爣杞(x,y,z杞达級鐨勬棆杞搴︺傚湪杩欓噷锛屽潗鏍囩郴鍙互鏄笘鐣屽潗鏍囩郴锛屼篃鍙互鏄墿浣撳潗鏍囩郴锛屾棆杞『搴忎篃鏄换鎰忕殑锛屽彲浠ユ槸xyz,xzy,yxz,zxy,yzx,zyx涓殑浠讳綍涓绉嶏紝鐢氳嚦鍙互鏄痻yx,xyy,xzz,zxz绛夌瓑绛夌瓑銆傘傘傛墍浠ヨ娆ф媺瑙掑绉嶅鏍枫
  • 濡備綍璁$畻绌洪棿杩愬姩瀛鐭╅樀?
    绛旓細4. 瀵逛簬姣忎釜鏃堕棿闂撮殧锛岃绠楃墿浣撳湪璇ユ椂闂存鍐呯殑浣嶇Щ鍜屾柟鍚戝彉鍖栥傝繖鍙互閫氳繃浣跨敤杩愬姩瀛︽柟绋嬫潵瀹炵幇銆傝繍鍔ㄥ鏂圭▼鎻忚堪浜嗙墿浣撳湪鏌愪竴鏃跺埢鐨勪綅缃拰鏂瑰悜涓庡墠涓鏃跺埢鐨勪綅缃拰鏂瑰悜涔嬮棿鐨勫叧绯汇備緥濡傦紝鍙互浣跨敤娆ф媺瑙鎴鍥涘厓鏁鏉ヨ〃绀虹墿浣撶殑鏂瑰悜銆5. 灏嗘瘡涓椂闂撮棿闅斿唴鐨勪綅绉诲拰鏂瑰悜鍙樺寲缁勫悎璧锋潵锛屽緱鍒扮墿浣撳湪鏁翠釜杩愬姩杩囩▼涓殑...
  • 扩展阅读:3d定位100%稳 ... 3d九宫图八卦图 ... 3d定位直选准确率99 ... 3d牛彩藏机正版原创图 ... 3d矩阵宝典图 藏宝图 ... 3d矩阵图正版 ... 3d藏宝图全图正版 ... 今日3d正版图纸今天 ... 今日福彩3d藏机诗图 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网