概述又研究了將近兩個(gè)星期的3D圖形到了我最想研究的地方了,因?yàn)闅W拉角與四元數(shù)的原因?qū)е翺penGL ES的研究進(jìn)度變緩,研究完這一塊,我將教大家如何使用OpenGL ES做一個(gè)自轉(zhuǎn)加公轉(zhuǎn)的正立方體.效果如下. 方向,、方位與角位移的區(qū)別在說矩陣,、歐拉角與四元數(shù)三種與角位移的關(guān)系之前,我們先來說說 方向,、方位與角位移的區(qū)別. 在現(xiàn)實(shí)生活中,我們很少區(qū)分"方向"和"方位"的區(qū)別(非路癡觀點(diǎn)),比如一個(gè)朋友來看望你,但是他可能在某一個(gè)公交站下車了,你去接他,但是找不到他,你急忙給他來一個(gè)電話"兄弟,你在哪個(gè)方向呢?"或者說是"兄弟,你在哪個(gè)方位呢?",如果不細(xì)細(xì)品味這兩句話,其實(shí)感覺差異不是太大.通過一痛電話的扯,然后你們成功的面基了,但是你們卻并不會(huì)在意"方向"和"方位"的區(qū)別.那么在幾何中,這兩者到底有什么差異呢? 這里我就盜用一下書上的例子,比如一個(gè)向量如果沿著自己的方向選擇是不會(huì)改變自身任何屬性的,如下圖所示,因?yàn)橄蛄渴侵挥蟹较驔]有方位的. 那么對(duì)于一個(gè)物體,情況卻是不一樣的,一個(gè)物體如果朝向某一個(gè)方向的時(shí)候,然后自轉(zhuǎn),那么這個(gè)物體是會(huì)發(fā)生空間上的改變的,如下圖一個(gè)錐體的自轉(zhuǎn),那么它的空間位置是發(fā)生改變的,也就是錐體的方位發(fā)生了改變了. 上面讓我們對(duì)物體的方向和方位的區(qū)別有了一個(gè)大體上的了解,那么我們?cè)诳臻g中如何描述一個(gè)方位呢?這就需要使用到角位移了. 我們先說一個(gè)類似的例子,我們?cè)撊绾蚊枋隹臻g中一個(gè)物體的位置呢?必須要把物體放在特定的坐標(biāo)系中(好像很生澀).比如,如果我們說在一個(gè)坐標(biāo)系中,有一個(gè)點(diǎn)是[1,1,1],那么你會(huì)非常輕易的想到了這個(gè)點(diǎn)在空間中的位置.描述空間位置其實(shí)就是描述相對(duì)于給定參考點(diǎn)(坐標(biāo)原點(diǎn))的位移. 其實(shí),描述一個(gè)物體的方位是一樣的,我們是不可能憑空描述一個(gè)物體的方位,我盟需要一個(gè)已知方位的參考量,通過這個(gè)參考量的旋轉(zhuǎn)得到當(dāng)前方位,那么旋轉(zhuǎn)的量就叫做角位移.通過概念我們知道,角位移就是用來描述方位的,類似于速度就是用來描述物體運(yùn)動(dòng)快慢的一樣.當(dāng)然了,這里我要聲明的一點(diǎn)就是雖然角位移是用來描述方位的,但是兩者是不同的.例如,我們可以這么說,一個(gè)物體的方位是如何如何的;一個(gè)物體是通過某個(gè)已知方位經(jīng)過角位移XXX旋轉(zhuǎn)得到.所以說,方位是用來描述一個(gè)單一的"狀態(tài)".但是角位移是用來描述兩個(gè)狀態(tài)之間的差異. 那么,我們?cè)趯?shí)際中如何描述方位與角位移呢?具體而言,我們使用矩陣和四元數(shù)來表示"角位移",用歐拉角來表示方位.接下來,我們逐一介紹一下. 使用矩陣表示角位移在3D環(huán)境中,描述坐標(biāo)系中方位的方式就是列出這個(gè)坐標(biāo)系的基向量,當(dāng)然了,這些基向量是用其他表示的,并不是它本身的基向量,比如當(dāng)前轉(zhuǎn)換完成的坐標(biāo)系的三個(gè)基向量p [1,0,0] q[0,1,0] r[0,0,1],這是使用本身的坐標(biāo)系表示,如果放在其他坐標(biāo)系中表示當(dāng)前的三個(gè)基向量可能就會(huì)發(fā)生改變.這是因?yàn)閰⒄拯c(diǎn)選擇的不同.至于基向量是如何改變的就需要在3D圖形:矩陣與線性變換說過的旋轉(zhuǎn)矩陣的相關(guān)知識(shí)了.這個(gè)就不過多的解釋了.比如下圖,由向量p,q,r組建的新的坐標(biāo)系用原來的坐標(biāo)系表示確實(shí)如圖右邊所示. 其實(shí)對(duì)于我們開發(fā)來說,我們只需要知道方位是可以使用3X3矩陣來表示的.矩陣表示的是轉(zhuǎn)換后的基向量即可.接下來我們說一下使用矩陣來表示角位移有什么樣的優(yōu)勢和缺點(diǎn).我就直接拿書上所講的了,各位看官莫怪莫怪. 使用矩陣表示角位移的優(yōu)勢
使用矩陣表示角位移的缺點(diǎn)
當(dāng)然了,我們使用矩陣來表示角位移只是作為了解而已,接下來,我們看一下如何使用歐拉角表示方位的. 歐拉角表示方位與萬向鎖問題很多人在大學(xué)中可能會(huì)接觸到矩陣,但是歐拉角可能是接觸的比較少,最少作為一個(gè)學(xué)物理的我是這樣的.一開始覺得歐拉角比較難理解,但是看了3D圖形之后,發(fā)現(xiàn)用歐拉角表示方位將會(huì)比矩陣更加的直觀而且易于使用.下面我們就看一下歐拉角相關(guān)的知識(shí).(下面的基本概念跟書上的差不多,因?yàn)槲矣X得書上寫個(gè)就很好了,所以我就沒有再次總結(jié),所以只是寫了一遍.) 首先,歐拉角的基本思想是將角位移分解為繞三個(gè)互相垂直軸的三個(gè)旋轉(zhuǎn)組成的序列.那么這個(gè)三個(gè)互相垂直的軸是如何定義的呢?其實(shí)任意三個(gè)軸和任意順序都是可以的,但是最常用的就是使用笛卡爾坐標(biāo)系并且按照一定順序組成的旋轉(zhuǎn)序列.最常用的約定,就是所謂的"heading-pitch-bank"約定,在這個(gè)系統(tǒng)中,一個(gè)方位被定義為heading角,一個(gè)pitch角,一個(gè)bank角.其中,在左手坐標(biāo)系中,我們把heading角定義為繞y軸旋轉(zhuǎn)量,pitch角為繞x軸旋轉(zhuǎn)量,bank角為繞z軸旋轉(zhuǎn)量.旋轉(zhuǎn)法則遵守左手法則(具體請(qǐng)參考3D圖形:矩陣與線性變換中的旋轉(zhuǎn)模塊).它的基本思想是讓物體開始于"標(biāo)準(zhǔn)"方位,就是物體坐標(biāo)軸和慣性坐標(biāo)軸對(duì)齊.讓物體做heading,、pitch,、bank旋轉(zhuǎn)之后達(dá)到最終的空間方位. 例如下圖一個(gè)錐體,一開始它自身坐標(biāo)軸與慣性坐標(biāo)軸是一致. 然后我把heading角設(shè)置為45°.根據(jù)左手法則(通常使用,但是決定每個(gè)旋轉(zhuǎn)的正方向不一定要準(zhǔn)守右手或者左手定則),它是會(huì)做順時(shí)針旋轉(zhuǎn). 接著物體的坐標(biāo)系就發(fā)生如下的改變了.錐體的自身坐標(biāo)軸不再與慣性坐標(biāo)軸一致,x,z軸都發(fā)生了對(duì)應(yīng)的改變.當(dāng)然了,物體的空間方位也發(fā)生了對(duì)應(yīng)的改變. 然后接下來就是pitch、bank旋轉(zhuǎn),分別是繞x軸旋轉(zhuǎn)和z軸旋轉(zhuǎn),跟heading旋轉(zhuǎn)是類似的,最后得到錐體的最終的空間方位.這里需要注意的是不管是 heading旋轉(zhuǎn),、 pitch旋轉(zhuǎn)還是bank旋轉(zhuǎn),旋轉(zhuǎn)的坐標(biāo)軸都是自身的坐標(biāo)軸!不是慣性坐標(biāo)軸! 上面,看完了"heading-pitch-bank"約定系統(tǒng)是如何做空間方位的旋轉(zhuǎn)改變的,接下來,我們來瞅瞅關(guān)于歐拉角的其他約定.
上面我們對(duì)歐拉角的接下來,我們看一下歐拉角的優(yōu)點(diǎn)和缺點(diǎn).透露一點(diǎn),其實(shí)歐拉角的缺點(diǎn)就是引起萬向鎖的原因. 歐拉角表示方位的優(yōu)點(diǎn)
歐拉角表示方位的缺點(diǎn)
萬向鎖問題其實(shí)是使用歐拉角會(huì)出現(xiàn)一個(gè)非常有趣的現(xiàn)象,那就是萬向鎖,我們看一下"heading-pitch-bank"系統(tǒng)這個(gè)系統(tǒng)中,如果pitch角度為±90°,那么就出事了,會(huì)出現(xiàn)什么問題呢?heading角與bank角如果相同,那么你會(huì)發(fā)現(xiàn)物體最終的方位是一致的,這怎么可能,這就比較尷尬了,其實(shí)類似于這種旋轉(zhuǎn)pitch角度為±90°中,物體是缺失一個(gè)旋轉(zhuǎn)軸的.也就是說,當(dāng)pitch角度為±90°,那么bank是0.只有heading一個(gè)旋轉(zhuǎn)軸起作用,是不是懵圈了?沒問題,下面我要分享一個(gè)視頻,我覺得這個(gè)視頻會(huì)比文字更加生動(dòng)形象,請(qǐng)對(duì)照上面的文字自行研究. 歐拉旋轉(zhuǎn)—萬向節(jié)鎖視頻傳送門四元數(shù)與復(fù)數(shù)看完使用矩陣和歐拉角表示方位.接下來,我們就看一下四元數(shù),四元數(shù)一個(gè)新的概念出現(xiàn)在我的眼前的時(shí)候我在想,他否是因?yàn)橛兴膫€(gè)數(shù)才叫四元數(shù),確實(shí),四元數(shù)實(shí)際是一個(gè)標(biāo)量分量和一個(gè)3D向量分量組成用來表示方位.四元數(shù)的兩種記法如下所示:[ω,ν],[ω,(x,y,z)]. 然后,我們?cè)倏匆幌?一個(gè)示例,假設(shè)一個(gè)復(fù)數(shù)v = (x,y)旋轉(zhuǎn)θ度得到v',如下圖所示. 為了完成此次的旋轉(zhuǎn),我們需要引入第二個(gè)復(fù)數(shù) q = (cosθ,sinθ),現(xiàn)在旋轉(zhuǎn)之后的復(fù)數(shù)v'就可以使用復(fù)數(shù)的乘法計(jì)算出來了.計(jì)算過程如下所示. 上面說了這么一大堆,那么到底四元數(shù)和復(fù)數(shù)有著怎樣的關(guān)系呢?其實(shí)一個(gè)四元數(shù)[w,(x,y,z)]定義了復(fù)數(shù)w +xi +yj +zk,也就是說一個(gè)四元數(shù)是包含著一個(gè)實(shí)部和三個(gè)虛部. 四元數(shù)和軸-角對(duì)我們已經(jīng)知道了矩陣和歐拉角的情況,現(xiàn)在我們就看一下四元數(shù)是如何表示角位移的.在3D環(huán)境中任意的一個(gè)角位移都可以理解為繞某個(gè)軸旋轉(zhuǎn)一定的角度,在3D圖形:矩陣與線性變換這個(gè)里面曾經(jīng)說過一個(gè)3D中繞任意軸旋轉(zhuǎn)的公式(還記得當(dāng)初那個(gè)驗(yàn)證過程嗎,愣是搞了一天????,具體驗(yàn)證過程就不說了,請(qǐng)查看原來的文章).公式如下所示.其中,θ代表著旋轉(zhuǎn)角度,n代表著旋轉(zhuǎn)軸.因此軸-角對(duì)(n,θ)定義了一個(gè)角位移:繞n指定的軸旋轉(zhuǎn)θ角. 四元數(shù)的解釋其實(shí)就是角位移的軸-角對(duì)方式,但是呢,n和θ并不是直接放入到四元數(shù)中的.它們的形式如下所示.
那么問題來了,為什么不直接放入四元數(shù)中呢?這是有原因的,這個(gè)原因,我將會(huì)在下一篇四元數(shù)的相關(guān)運(yùn)算中來說明一下.現(xiàn)在只要知道四元數(shù)的解釋其實(shí)就是角位移的軸-角對(duì)方式即可. 結(jié)束自己寫完這篇文章總算是對(duì)矩陣,、歐拉角、四元數(shù),、角位移,、方位有了一個(gè)大體的了解了.整體下來發(fā)現(xiàn)真心枯燥的,但是還是堅(jiān)持了下來了,希望小伙伴也能堅(jiān)持看完,不懂的或者有疑問可以與騷棟一起探討.3D圖像下一篇我將接著研究本篇的四元數(shù),不過是與四元數(shù)的運(yùn)算相關(guān)的知識(shí).希望大家持續(xù)關(guān)注. 最后還是要附上<<3d數(shù)學(xué)基礎(chǔ)>>的pdf版的傳送門. <<3d數(shù)學(xué)基礎(chǔ)>>傳送門 |
|