3D圖形:矩陣、歐拉角、四元數(shù)與方位的故事


概述


又研究了將近兩個星期的3D圖形到了我最想研究的地方了,因為歐拉角與四元數(shù)的原因?qū)е翺penGL ES的研究進度變緩,研究完這一塊,我將教大家如何使用OpenGL ES做一個自轉(zhuǎn)加公轉(zhuǎn)的正立方體.效果如下.



方向、方位與角位移的區(qū)別


在說矩陣、歐拉角與四元數(shù)三種與角位移的關(guān)系之前,我們先來說說 方向、方位與角位移的區(qū)別.

在現(xiàn)實生活中,我們很少區(qū)分"方向"和"方位"的區(qū)別(非路癡觀點),比如一個朋友來看望你,但是他可能在某一個公交站下車了,你去接他,但是找不到他,你急忙給他來一個電話"兄弟,你在哪個方向呢?"或者說是"兄弟,你在哪個方位呢?",如果不細細品味這兩句話,其實感覺差異不是太大.通過一痛電話的扯,然后你們成功的面基了,但是你們卻并不會在意"方向"和"方位"的區(qū)別.那么在幾何中,這兩者到底有什么差異呢?

這里我就盜用一下書上的例子,比如一個向量如果沿著自己的方向選擇是不會改變自身任何屬性的,如下圖所示,因為向量是只有方向沒有方位的.


那么對于一個物體,情況卻是不一樣的,一個物體如果朝向某一個方向的時候,然后自轉(zhuǎn),那么這個物體是會發(fā)生空間上的改變的,如下圖一個錐體的自轉(zhuǎn),那么它的空間位置是發(fā)生改變的,也就是錐體的方位發(fā)生了改變了.

上面讓我們對物體的方向和方位的區(qū)別有了一個大體上的了解,那么我們在空間中如何描述一個方位呢?這就需要使用到角位移了.

我們先說一個類似的例子,我們該如何描述空間中一個物體的位置呢?必須要把物體放在特定的坐標系中(好像很生澀).比如,如果我們說在一個坐標系中,有一個點是[1,1,1],那么你會非常輕易的想到了這個點在空間中的位置.描述空間位置其實就是描述相對于給定參考點(坐標原點)的位移.

其實,描述一個物體的方位是一樣的,我們是不可能憑空描述一個物體的方位,我盟需要一個已知方位的參考量,通過這個參考量的旋轉(zhuǎn)得到當(dāng)前方位,那么旋轉(zhuǎn)的量就叫做角位移.通過概念我們知道,角位移就是用來描述方位的,類似于速度就是用來描述物體運動快慢的一樣.當(dāng)然了,這里我要聲明的一點就是雖然角位移是用來描述方位的,但是兩者是不同的.例如,我們可以這么說,一個物體的方位是如何如何的;一個物體是通過某個已知方位經(jīng)過角位移XXX旋轉(zhuǎn)得到.所以說,方位是用來描述一個單一的"狀態(tài)".但是角位移是用來描述兩個狀態(tài)之間的差異.

那么,我們在實際中如何描述方位與角位移呢?具體而言,我們使用矩陣和四元數(shù)來表示"角位移",用歐拉角來表示方位.接下來,我們逐一介紹一下.


使用矩陣表示角位移


在3D環(huán)境中,描述坐標系中方位的方式就是列出這個坐標系的基向量,當(dāng)然了,這些基向量是用其他表示的,并不是它本身的基向量,比如當(dāng)前轉(zhuǎn)換完成的坐標系的三個基向量p [1,0,0] q[0,1,0] r[0,0,1],這是使用本身的坐標系表示,如果放在其他坐標系中表示當(dāng)前的三個基向量可能就會發(fā)生改變.這是因為參照點選擇的不同.至于基向量是如何改變的就需要在3D圖形:矩陣與線性變換說過的旋轉(zhuǎn)矩陣的相關(guān)知識了.這個就不過多的解釋了.比如下圖,由向量p,q,r組建的新的坐標系用原來的坐標系表示確實如圖右邊所示.

其實對于我們開發(fā)來說,我們只需要知道方位是可以使用3X3矩陣來表示的.矩陣表示的是轉(zhuǎn)換后的基向量即可.接下來我們說一下使用矩陣來表示角位移有什么樣的優(yōu)勢和缺點.我就直接拿書上所講的了,各位看官莫怪莫怪.

使用矩陣表示角位移的優(yōu)勢
  • 可以立即進行向量的旋轉(zhuǎn).后面使用四元數(shù)進行空間變化其實是和使用對應(yīng)的矩陣的空間變化的效果是一樣的.
  • 矩陣的形式被圖形API所使用.這一點我們從OpenGL ES 就可以看出來了,無需過多解釋了.
  • 多個角位移連接.我們知道使用矩陣進行空間變換是可以連續(xù)進行多個的.那么角位移也是一樣的.
  • 矩陣的逆.這個比較好理解,如果我們進行了一次旋轉(zhuǎn)變換(也就是空間方位的變化),那么如何回到原來的方位呢,只要再乘上一次矩陣的逆即可,前面說過矩陣的逆是有這樣的功能的.
使用矩陣表示角位移的缺點
  • 矩陣可能占有更多內(nèi)存.這其實是由比較性的,這種比較是要與歐拉角做比較,與歐拉角比較矩陣所占的內(nèi)存將會更多.
  • 難以使用.這個確實是,你想想,如果現(xiàn)在你要x軸旋轉(zhuǎn)80°,你還要想想它對應(yīng)的向量是多少.一痛計算之后,才能得到對用的值,后面直接看到這個矩陣的時候還要接著計算,看看它是如何變換的.這樣使用起來是不是非常的惡心?
  • 并非所有矩陣都能描述方位.這一點,我將單獨寫一篇來討論這個問題.現(xiàn)在還不是太了解,見諒.

當(dāng)然了,我們使用矩陣來表示角位移只是作為了解而已,接下來,我們看一下如何使用歐拉角表示方位的.


歐拉角表示方位與萬向鎖問題


很多人在大學(xué)中可能會接觸到矩陣,但是歐拉角可能是接觸的比較少,最少作為一個學(xué)物理的我是這樣的.一開始覺得歐拉角比較難理解,但是看了3D圖形之后,發(fā)現(xiàn)用歐拉角表示方位將會比矩陣更加的直觀而且易于使用.下面我們就看一下歐拉角相關(guān)的知識.(下面的基本概念跟書上的差不多,因為我覺得書上寫個就很好了,所以我就沒有再次總結(jié),所以只是寫了一遍.)

首先,歐拉角的基本思想是將角位移分解為繞三個互相垂直軸的三個旋轉(zhuǎn)組成的序列.那么這個三個互相垂直的軸是如何定義的呢?其實任意三個軸和任意順序都是可以的,但是最常用的就是使用笛卡爾坐標系并且按照一定順序組成的旋轉(zhuǎn)序列.最常用的約定,就是所謂的"heading-pitch-bank"約定,在這個系統(tǒng)中,一個方位被定義為heading角,一個pitch角,一個bank角.其中,在左手坐標系中,我們把heading角定義為繞y軸旋轉(zhuǎn)量,pitch角為繞x軸旋轉(zhuǎn)量,bank角為繞z軸旋轉(zhuǎn)量.旋轉(zhuǎn)法則遵守左手法則(具體請參考3D圖形:矩陣與線性變換中的旋轉(zhuǎn)模塊).它的基本思想是讓物體開始于"標準"方位,就是物體坐標軸和慣性坐標軸對齊.讓物體做heading、pitch、bank旋轉(zhuǎn)之后達到最終的空間方位.

例如下圖一個錐體,一開始它自身坐標軸與慣性坐標軸是一致.

然后我把heading角設(shè)置為45°.根據(jù)左手法則(通常使用,但是決定每個旋轉(zhuǎn)的正方向不一定要準守右手或者左手定則),它是會做順時針旋轉(zhuǎn).

接著物體的坐標系就發(fā)生如下的改變了.錐體的自身坐標軸不再與慣性坐標軸一致,x,z軸都發(fā)生了對應(yīng)的改變.當(dāng)然了,物體的空間方位也發(fā)生了對應(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)的坐標軸都是自身的坐標軸!不是慣性坐標軸!

上面,看完了"heading-pitch-bank"約定系統(tǒng)是如何做空間方位的旋轉(zhuǎn)改變的,接下來,我們來瞅瞅關(guān)于歐拉角的其他約定.

  • "heading-pitch-bank"約定系統(tǒng)是有多個名字的,其中的有一組叫做"roll-pitch-yaw",其中roll等同于bank,yaw等價于heading.我們知道"heading-pitch-bank"約定是讓方位從慣性坐標系到最終的物體自身坐標系,但是"roll-pitch-yaw"約定卻是剛好相反.它是從最終的物體坐標系到最開始的慣性坐標系的旋轉(zhuǎn)變換.
  • 任意的三個軸都能作為旋轉(zhuǎn)軸,但是使用笛卡爾坐標軸是最有意義的,這句話我就不過多解釋了,我們在上面的例子中已經(jīng)深有體會了.
  • 決定每一個旋轉(zhuǎn)的正方向不一定必須遵守左手或者右手法則,這樣遵守只是習(xí)慣而已.
  • 旋轉(zhuǎn)是可以以不同的順序進行的, "heading-pitch-bank"約定系統(tǒng)只是更比較如何人的習(xí)慣而已.因為一個物體放在一個水平面上,如果進行旋轉(zhuǎn)操作的話,我們首先想到的是物體按照垂直軸進行旋轉(zhuǎn)操作.也就是heading旋轉(zhuǎn).

上面我們對歐拉角的接下來,我們看一下歐拉角的優(yōu)點和缺點.透露一點,其實歐拉角的缺點就是引起萬向鎖的原因.

歐拉角表示方位的優(yōu)點
  • 歐拉角使用起來非常的簡單方便,它比四元數(shù)以及矩陣更加的生動形象.因為歐拉角使用都是角度,對于人來說旋轉(zhuǎn)還是使用角度比較直觀.
  • 最簡潔的表達方式.在3D中,歐拉角用3個數(shù)就可以表達方位,四元數(shù)則要用4個數(shù),而矩陣是最多的,需要9個數(shù).
  • 任意三個數(shù)都是合法的,任意的三個數(shù)都是能構(gòu)成合法的歐拉角,矩陣和四元數(shù)可不一定是這樣的.
歐拉角表示方位的缺點
  • 給定的方位表達方式不唯一.我們雖然說任意三個數(shù)組成的歐拉角都是合法的,但是比如heading旋轉(zhuǎn)360°和選擇720°,物體的方位是一直的,雖然歐拉角的數(shù)值是發(fā)生了改變的.
  • 兩個角度求插值非常的困難.比如方位A的heading角度為720°,方位B的角度為45°.那么heading值差了多少呢?沒錯就是45°,因為720°就是旋轉(zhuǎn)了兩周而已,但是實際上我們操作的時候需要選擇將近兩周.如下圖所示.

萬向鎖問題

其實是使用歐拉角會出現(xiàn)一個非常有趣的現(xiàn)象,那就是萬向鎖,我們看一下"heading-pitch-bank"系統(tǒng)這個系統(tǒng)中,如果pitch角度為±90°,那么就出事了,會出現(xiàn)什么問題呢?heading角與bank角如果相同,那么你會發(fā)現(xiàn)物體最終的方位是一致的,這怎么可能,這就比較尷尬了,其實類似于這種旋轉(zhuǎn)pitch角度為±90°中,物體是缺失一個旋轉(zhuǎn)軸的.也就是說,當(dāng)pitch角度為±90°,那么bank是0.只有heading一個旋轉(zhuǎn)軸起作用,是不是懵圈了?沒問題,下面我要分享一個視頻,我覺得這個視頻會比文字更加生動形象,請對照上面的文字自行研究.

歐拉旋轉(zhuǎn)—萬向節(jié)鎖視頻傳送門??


四元數(shù)與復(fù)數(shù)


看完使用矩陣和歐拉角表示方位.接下來,我們就看一下四元數(shù),四元數(shù)一個新的概念出現(xiàn)在我的眼前的時候我在想,他否是因為有四個數(shù)才叫四元數(shù),確實,四元數(shù)實際是一個標量分量和一個3D向量分量組成用來表示方位.四元數(shù)的兩種記法如下所示:[ω,ν],[ω,(x,y,z)].
復(fù)數(shù),真心好久沒用了.高中的時候我們就開始接觸簡單的復(fù)數(shù)了,現(xiàn)在簡單說一下復(fù)數(shù),其實我也順道復(fù)習(xí)一下了.
首先,復(fù)數(shù)的形式為a+bi,其中i2=-1,a稱作實部(實數(shù)部分),b稱作虛部(虛數(shù)部分).對于復(fù)數(shù)的運算,我們主要說說復(fù)數(shù)的模,復(fù)數(shù)的模可以很好的表示2D中的旋轉(zhuǎn)變換,我們先看看前面說到過的2D環(huán)境中的旋轉(zhuǎn)矩陣.

然后,我們再看一下,一個示例,假設(shè)一個復(fù)數(shù)v = (x,y)旋轉(zhuǎn)θ度得到v',如下圖所示.

為了完成此次的旋轉(zhuǎn),我們需要引入第二個復(fù)數(shù) q = (cosθ,sinθ),現(xiàn)在旋轉(zhuǎn)之后的復(fù)數(shù)v'就可以使用復(fù)數(shù)的乘法計算出來了.計算過程如下所示.
v = x +yi
q = cosθ +isinθ
v' = vq = (x +yi)(cosθ +isinθ) = (xcosθ-ysinθ)+(xsinθ+ycosθ)i
跟上面的2D環(huán)境中旋轉(zhuǎn)矩陣效果是一樣的.只是形式不相同而已.

上面說了這么一大堆,那么到底四元數(shù)和復(fù)數(shù)有著怎樣的關(guān)系呢?其實一個四元數(shù)[w,(x,y,z)]定義了復(fù)數(shù)w +xi +yj +zk,也就是說一個四元數(shù)是包含著一個實部和三個虛部.
其實四元數(shù)的出現(xiàn)也是有故事的,我直接把書上搬過來,當(dāng)做在枯燥的學(xué)習(xí)中的一個輕松時刻吧(實際上,然并卵??????),愛爾蘭的數(shù)學(xué)家哈密爾頓其實一直想把復(fù)數(shù)復(fù)數(shù)從2D擴展到3D,一開始他認為,3D中的復(fù)數(shù)應(yīng)該有一個實部和兩個虛部,然后他沒有創(chuàng)造出這種一個實部兩個虛部有意義的復(fù)數(shù).1843年,在他去演講的路上他突然意識到應(yīng)該有三個虛部而不是兩個虛部.他把這種新復(fù)數(shù)類型行者的等式刻在了Broome橋上.這樣四元數(shù)就誕生了.等式如下所示.
i2 = j2 = k2 = -1
ij = k,ji = -k
jk = i,kj = -i
ki = j,ik = -j


四元數(shù)和軸-角對


我們已經(jīng)知道了矩陣和歐拉角的情況,現(xiàn)在我們就看一下四元數(shù)是如何表示角位移的.在3D環(huán)境中任意的一個角位移都可以理解為繞某個軸旋轉(zhuǎn)一定的角度,在3D圖形:矩陣與線性變換這個里面曾經(jīng)說過一個3D中繞任意軸旋轉(zhuǎn)的公式(還記得當(dāng)初那個驗證過程嗎,愣是搞了一天??,具體驗證過程就不說了,請查看原來的文章).公式如下所示.其中,θ代表著旋轉(zhuǎn)角度,n代表著旋轉(zhuǎn)軸.因此軸-角對(n,θ)定義了一個角位移:繞n指定的軸旋轉(zhuǎn)θ角.

四元數(shù)的解釋其實就是角位移的軸-角對方式,但是呢,n和θ并不是直接放入到四元數(shù)中的.它們的形式如下所示.

q = [ cos (θ/2) sin(θ/2)n ]
=[ cos (θ/2) ( sin(θ/2)nx sin(θ/2)ny sin(θ/2)nz ) ]

那么問題來了,為什么不直接放入四元數(shù)中呢?這是有原因的,這個原因,我將會在下一篇四元數(shù)的相關(guān)運算中來說明一下.現(xiàn)在只要知道四元數(shù)的解釋其實就是角位移的軸-角對方式即可.

</b>

結(jié)束


自己寫完這篇文章總算是對矩陣、歐拉角、四元數(shù)、角位移、方位有了一個大體的了解了.整體下來發(fā)現(xiàn)真心枯燥的,但是還是堅持了下來了,希望小伙伴也能堅持看完,不懂的或者有疑問可以與騷棟一起探討.3D圖像下一篇我將接著研究本篇的四元數(shù),不過是與四元數(shù)的運算相關(guān)的知識.希望大家持續(xù)關(guān)注.

最后還是要附上<<3D數(shù)學(xué)基礎(chǔ) 圖形與游戲開發(fā)>>的pdf版的傳送門.

--> <<3D數(shù)學(xué)基礎(chǔ) 圖形與游戲開發(fā)>>傳送門??


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容

  • 1 前言 OpenGL渲染3D模型離不開空間幾何的數(shù)學(xué)理論知識,而本篇文章的目的就是對空間幾何進行簡單的介紹,并對...
    RichardJieChen閱讀 7,058評論 1 11
  • 什么是方位? 物體的“方位”主要描述的是物體的朝向,但是“方位”和“方向”不是同一個概念,例如,向量有方向沒有方位...
    xiaoxingyun閱讀 3,051評論 0 0
  • 歐拉旋轉(zhuǎn)、四元數(shù)、矩陣旋轉(zhuǎn)之間的差異 除了歐拉旋轉(zhuǎn)以外,還有兩種表示旋轉(zhuǎn)的方式:矩陣旋轉(zhuǎn)和四元數(shù)旋轉(zhuǎn)。接下來我們比...
    AndrewFan閱讀 2,547評論 0 3
  • 在我們的3D數(shù)學(xué)中,如果使用矩陣來旋轉(zhuǎn)的話就會顯得十分的復(fù)雜和笨拙。計算中使用最為廣泛的旋轉(zhuǎn)方式為歐拉角。??歐拉...
    Levi_Wan閱讀 5,249評論 0 4
  • 行者悟道大光明 慧心妙語法意誠 誠意法語妙心慧 明光大道悟者行 禪舞?光明
    姜冠閱讀 240評論 0 1