天天看點

推導相機變換矩陣

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

目錄(?)[+]

-潘宏

-2009.12.31

-本人水準有限,疏忽錯誤在所難免,還請各位數學高手、程式設計高手不吝賜教

一些網友寫信給我希望能夠了解固定流水線中世界空間到相機空間變換矩陣的具體推導過程。其實之前我在《向量幾何在遊戲程式設計中的使用6》中已經簡單的把相機變換作為一個使用基理論的例子進行了說明,但可能仍然不夠具體。這篇文章中,我會盡力闡述相機變換的整個來龍去脈。希望能夠對正在學習固定流水線的朋友們有所幫助。這裡我們仍然會在推導相機變換之前介紹幾個理論知識,目的是為了更好的了解推導過程。我們馬上開始!

什麼是相機變換?

在流水線中,當物體從模型坐标通過世界矩陣變換到世界空間之後,它将通過相機變換從世界空間變換到相機空間。下圖的固定流水線中,藍色框中的部分就是這個過程。

推導相機變換矩陣

其實,所謂的相機空間,就是以相機作為坐标原點的一個參考系,是以,從世界空間變換到相機空間,就是把物體從世界坐标系,變換到相機為原點的相機坐标系,如下圖所示。

推導相機變換矩陣

左半部分是小人在世界空間中的位置,右半部分是小人變換到相機空間後的位置。這樣的一個變換可以有很多種方式來實作:歐拉相機系統、UVN系統、Two Points & A Twist等等。這裡我們讨論最為廣泛的UVN系統建構相機矩陣,如果讀者對其他方法感興趣,可以查找相關的資料。我們仍然讨論OpenGL的相機矩陣的推導,其他API可以類似的推導。

坐标轉換公式

我們在《向量幾何在遊戲程式設計中的使用6》中提到了正交矩陣,這是在基理論基礎上的一個概念(如果對基理論不是很熟悉,請參考《向量幾何在遊戲程式設計中的使用6》)。正交矩陣所有列(行)向量構成了一個标準正交基(它的列向量都是互相正交,并且長度為1),是以,可以把正交矩陣看成是對一個坐标系的描述。同時,我們知道:同一個向量,在不同的基下面的坐标是不同的。是以,可以用正交矩陣來代表坐标系(也可以看作基)進而寫出在統一的參考系(全局坐标系)下同一個向量在不同基中的坐标。

推導相機變換矩陣

上面的式子表示,參考系中向量v在基Q中的坐标是v’,在基R中的坐标是v’’(注意這裡的環境下基矩陣是用列向量表示的,這樣相乘之後的結果表示的是基向量的線性組合)。如下圖,黑色基表示的是參考系,紅色是基Q,藍色是基R,v是參考系中的一個向量。

推導相機變換矩陣

為了讓大家更清楚,我舉一個例子:

上式的意思是:參考系中的向量v,在基Q( 1 0 0 ), ( 0 1 0 ), ( 0 0 1)下的坐标是( 1 2 6 ),在基R( 0 1 0 ), ( 0 0 1 ), ( 1 0 0 )下的坐标是( 2 6 1 )。注意,我們所讨論的所有基和向量的關系都隻是線性表示的關系,沒有位移關系,是以我們用3D向量表示,而不是4D的齊次表示(如果對齊次坐标不是很熟悉,請參考《深入探索透視投影變換》中的齊次坐标部分)。

這樣,已知一個基Q和向量v在它之中的坐标v’,以及另外一個基R,我們可以通過v=Qv’=Rv’’公式來計算v’’。

推導相機變換矩陣

上面就是求v’’的公式,注意到右邊需要計算基R的逆矩陣R^-1,因為基R是正交矩陣,而正交矩陣的一個重要性質就是逆等于轉置。是以,我們可以把它寫成

推導相機變換矩陣

這個公式就是坐标轉換公式。特别地,如果Q是和參考系相同的坐标系(3D程式設計中大多數情況下如此),比如世界坐标系,則Q是一個機關矩陣I,則我們可以把它寫成

這個坐标轉換公式可以解釋為:對于世界坐标系中的向量v’,它在坐标系R中的坐标是v’’。我們在後面會用到這個公式。

    除了用正交矩陣來闡述坐标轉換,我們還可以使用點積所代表的共線程度(colinear amount)來描述坐标轉換(André LaMothe的《Tricks Of The 3D Game Programming Gurus》)。這個理論基于點積的幾何意義:一個向量在另一個向量上的共線程度。比如兩個向量v和s點積

推導相機變換矩陣

幾何意義就是v在s方向上的投影長和s的長的乘積,或者是s在v方向上的投影長和v的長的乘積(積的符号為:若v和s的角度小于90度,積為正,如果是直角,積為零,否則為負)。

推導相機變換矩陣

進一步地,如果v是一個機關向量,則這個點積可以解釋為s在v方向上的投影長;如果s是一個機關向量,則可以解釋為v在s方向上的投影長。現在,我們把點積推廣到基的層次上,把一個向量v’和一個基R的三個機關軸向量進行點積,點積得到的三個值則表示這個向量在這個基下的坐标v’’

推導相機變換矩陣

數學表達為

推導相機變換矩陣

請注意,為了讓v’能夠和基的每一個軸向量進行點積,我們必須把基寫成轉置形式,即行向量乘法,否則就變成了線性組合的形式。這個公式的意義就是世界空間中的向量v’和基R的軸向量進行點積進而得到v’在R下的共線程度——坐标v’’。這個公式和上面我們得到的坐标轉換公式一模一樣。實際上我們是從兩個不同的方向解釋同一個公式,希望你能夠把兩個方向都了解。

UVN系統

UVN系統本身是一個基。如下圖所示,三個基向量U,V,N分别指向相機的右方、上方和後方進而構成右手坐标系,相機則處于坐标原點。

推導相機變換矩陣

使用UVN系統可以非常友善的設定相機朝向。它的建構過程如下如所示

推導相機變換矩陣

在參考系下(這裡是世界坐标系),我們給定相機的位置——eye,被觀察的小人的位置——lookat,以及一個輔助向量——參考系中表示“上方”的向量up,這個向量會影響U和V的生成,因為以後求出的V向量會在up和N向量所決定的平面上(有興趣可以自己證明一下),是以可以通過這個向量讓相機産生不同的偏轉。

首先我們求出向量N

推導相機變換矩陣

很簡單,用目标位置減去相機的位置,就是圖中的步驟2。第3步,我們求出向量U。這一步需要使用輔助向量up,如果不希望相機産生偏轉,一般取(0, 1, 0)

推導相機變換矩陣

U使用向量的叉乘實作,就是圖中的步驟3。最後,使用N和U計算出向量V

推導相機變換矩陣

最後将計算出的U,V和N進行機關化,就得到了相機的UVN系統。結合上面我們談到的坐标轉換理論,我們可以把UVN系統看作是相機的基,進而可以友善的把一個向量在世界坐标和相機坐标進行轉換。

OpenGL的gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz)方法就是使用的上面的步驟進行相機矩陣的設定。它的前三個參數就是相機的位置向量,中間三個參數是所觀察的目标位置向量,最後三個參數就是輔助向量up。

相機矩陣的推導

上面我們已經說明了UVN系統,标準流水線中就是使用了UVN系統來描述相機。U, V, N分别對應相機坐标系的三個基向量。

此外,對于一個相機來說,它在開始的時候和世界坐标系是重合的,使用者控制相機在世界空間中移動之後,相機的狀态可以用兩個屬性來描述——朝向和位置。也就是說,有了這兩個屬性,一個相機模型在世界中的狀态就确定了。而這兩個屬性,我們用變換的理論來描述,就是旋轉和平移。可以想象,對于世界中的任何一個相機狀态,我們都可以把它看成是:相機先圍繞自身基原點旋轉一定的角度,然後平移到世界空間的某個地方。下圖展示了這個過程

推導相機變換矩陣

圖中,紅色是相機的基,而黑色是世界的基,也就是參考系。小人是世界中的一個物體。相機在移動之前,兩個基是重合的。當相機在螢幕中定位時,它首先會進行朝向的确定——旋轉,然後進行位置的确定——平移。圖中的Rotation和Translation兩步就是相機定位時所發生的變換。可以看到相機相對于小人的運動。而當進行相機變換的時候,小人應該從世界基變換到相機的基裡面。這樣,他應該進行一個相機定位的逆定位,先逆平移小人和相機,然後再逆旋轉小人和相機,最後相機歸位,小人随相機變到了相機空間。這是由Inverse Translation和Inverse Rotation兩個步驟完成的,這兩個步驟就是相機變換。現在我們推導這個變換。我們把關系寫出來,相機本身的變換C包括兩個元素

推導相機變換矩陣

其中T是平移變換,R是旋轉變換。而相機變換是相機本身變換的逆變換

這個C^-1就是我們要求出的相機變換。其中T^-1很容易求出,即

推導相機變換矩陣

而R^-1就沒有這麼容易求出來了。是以,我們不求它,我們用UVN系統。什麼意思?請看上面的那張相機變換的圖,當相機變換進行完Inverse Translation這一步之後,相機的原點和世界原點就重合了,也就是處理完了關于平移的變換。接下來我們要做的是逆旋轉,而其實逆旋轉的目的,就是要得到目前世界坐标中經過逆平移的小人在相機坐标系中的坐标。是不是似曾相識?我們的坐标變換理論就派上用場了。我們回憶上面坐标變換的公式

推導相機變換矩陣

這個坐标轉換公式可以解釋為:對于世界坐标系中的向量v’,它在坐标系R中的坐标是v’’。那麼,我們可以套用在這裡:對于世界坐标中的已經經過逆平移的坐标v’,它在相機坐标系R中的坐标是v’’。什麼是相機坐标系R?就是我們的相機UVN系統!就是

推導相機變換矩陣

則相機變換的完整公式就是

推導相機變換矩陣

這裡,v是小人在世界空間中的坐标,v’’是小人在相機空間中的坐标。則相機變換矩陣就是

推導相機變換矩陣

至此,我們就完成了相機矩陣的推導。物體經過這個矩陣就從世界空間變換到了相機空間,等待流水線對它進行投影變換。OpenGL就使用了上面推導出的最後的那個矩陣。希望你能夠了解這個推導過程,如果你有什麼問題或者不同的看法,請一定給我發信J下次見!

-email: [email protected]

推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣
推導相機變換矩陣