轉載+整理 - 計算機圖形學 - 模型視圖矩陣和投影矩陣

出處:http://blog.csdn.net/qb371/article/details/8650094動畫

  根據原文,我將其中關於模型視矩陣和投影矩陣的比較重要的知識整理出來再加工一下,若是有什麼地方看得不適合明白的話仍是去看一下原文吧。atom

模型矩陣

咱們必須考慮,當空間中點的位置會發生變化的時候,其座標如何變化。考慮三種基本的變換:平移、旋轉和縮放。spa

「變換」的含義就是,將點的初始位置的座標P映射到平移、旋轉、縮放後的位置座標P’,即:.net

 

平移變換是最簡單的變換:3d

 

 

旋轉變換有一些複雜,先看在二維平面上的旋轉變換:blog

Untitled-1

很容易獲得:get

 

x=xcosθysinθ
y=xsinθ+ysinθ

 

矩陣形式的表達更加簡潔,後面大多使用這種形式:it

 

 

推廣到三維空間中: 
點繞z軸旋轉:io

 

 

點繞x軸旋轉:table

 

 

點繞y軸旋轉:

 

 

繞指定的任意軸旋轉變換是由幾個繞座標軸旋轉變換和平移變換效果疊加而成的,後文會有詳細敘述。

縮放變換也比較簡單:

 

 

總結一下:平移變換,變換後點座標等於初始位置點座標加上一個平移向量;而旋轉變換和縮放變換,變換後點座標等於初始位置點座標乘以一個變換矩陣。

 

P=P+T,P=RP,P=SP

 

齊次座標這天才的發明,容許平移變換也表示成初始位置點座標左乘一個變換矩陣的形式。齊次座標使用4個份量來表示三維空間中的點,前三個份量和普通座標同樣,第四個份量爲1。

 

 

平移變換巧妙地表示爲:

 

 

旋轉變換(以繞z軸旋轉爲例)和縮放變換相應爲:

 

 

綜上,在齊次座標下三種基本變換實現了形式上的統一,這種形式的統一意義重大。

 

P=TP,P=RP,P=SP

 

矩陣有一個性質:

 

M(AB)=(MA)B

 

考慮一個點,先進行了一次平移變換,又進行了一次旋轉變換,結合上面矩陣的性質,可知變換後的點P’爲:

 

P=R(TP)=(RT)P

 

旋轉矩陣和平移矩陣的乘積R·T也是一個4×4的矩陣,這個矩陣表明了一次平移變換和一次旋轉變換效果的疊加;若是這個點還要進行變換,只要將新的變換矩陣按照順序左乘這個矩陣,獲得的新矩陣可以表示以前全部變換效果的疊加,將最初的點座標左乘這個矩陣就能獲得一系列變換後最終的點座標,這個矩陣稱爲「模型矩陣」。一個模型矩陣乘以另外一個模型矩陣獲得的仍是一個模型矩陣,表示先進行右側模型矩陣表明的變換,再進行左側模型矩陣表明的變換這一過程的效果之和,所以模型矩陣的乘法又能夠認爲是閉合的。 
模型矩陣之因此稱之爲「模型矩陣」,是由於該矩陣與點的位置沒有關係,僅僅包含了一系列變換的信息。而在三維世界中,一個模型裏全部的頂點每每共享同一個變換,對應同一個模型矩陣,好比拋在空中的一個木塊,運起色器的一個齒輪。

以前說到,考慮一個物體繞指定軸旋轉,如如下這個變換:繞着過頂點(x,y,z)方向爲(a,b,c)的軸旋轉角度θ,利用多個變換的疊加構建繞任意軸旋轉的變換矩陣。 
首先將頂點(x,y,z)平移到原點,繞x軸旋轉角度p使指定的旋轉軸在x-z平面上,繞y軸旋轉角度q使指定的旋轉軸與z軸重合,繞指定旋轉軸(也就是z軸)旋轉角度θ,繞y軸旋轉角度-q,繞x軸旋轉角度-p,將頂點平移到向量(x,y,z),p和q的值由方向(a,b,c)決定。綜上,變換矩陣爲:

 

 

所以在處理圍繞非座標軸旋轉的模型時,根據指定的旋轉參數能夠直接按照上述公式生成按照指定軸旋轉的旋轉矩陣,參加模型矩陣的構建。

齊次座標還有一個優勢,可以區分點和向量:在普通座標裏,點和向量都是由三個份量組成的,表示位置的點座標(2,3,4)和表示方向的向量(2,3,4)沒有區別。而在齊次座標中,第四個份量能夠區分它們,點座標的第四個份量爲1,而向量座標第四個份量爲0。好比,平移一個點是有意義的,可以獲得平移後的點座標;而平移一個向量是沒有意義的,方向不會由於平移而改變。

以上,咱們已經瞭解到模型矩陣能夠存儲一個模型空間位置變化的信息,在生成三維動畫每一幀的過程當中,咱們首先計算每一個模型的模型矩陣,而後將最初的模型的每一頂點座標都左乘該模型矩陣,獲得這一幀表示的時刻(模型已經通過屢次變換)該模型每一頂點的座標。上面說的「幀」並不狹義地指屏幕的兩次刷新時間的短暫間隔中屏幕上呈現的圖像,而是指在這幅圖像所描繪的整個三維空間的這個瞬間的全部頂點的位置。

來看個具體的例子:一個繞z軸勻速螺旋勻速上升的立方體,在某一幀中(即在這一幀對應的時刻t下),其向z軸正方向平移的長度和繞z軸旋轉的角度分別爲:

 

 

則模型矩陣(注意上文齊次座標下的基本變換矩陣)爲:

 

 

產生這一幀時,只須要計算一次模型矩陣,再將立方體中8個頂點座標分別左乘該矩陣,就能夠獲得通過變換後8個頂點的座標。當一個模型頂點數量增長到上百甚至上千個,模型變換的步驟數也增長到幾十步時,模型矩陣的做用就很明顯了:若是沒有齊次座標(也固然沒有模型矩陣),對每一個頂點都須要一步一步地變換:平移的時候加上一個向量,旋轉的時候左乘一個矩陣,才能獲得變換後的頂點座標;而模型變換隻須要計算一次模型矩陣(固然也是一步一步的),而後每一個頂點左乘模型矩陣就能夠直接獲得變換後的座標了。

 

視圖矩陣

在模型矩陣中,咱們關心的是空間中的點在經歷變換後在世界座標系下的位置。事實上,咱們更加關心空間中的點相對於觀察者的位置。最簡單的方案是將觀察者置於原點處,面向z軸(或x軸、y軸)正半軸,那麼空間中的點在世界座標系下的位置就是其相對於觀察者的位置。 
觀察者的位置和方向會變化,看上去就好像整個世界的位置和方向發生變化了同樣,因此解決的方案很簡單,將世界裏的全部模型看做一個大模型,在全部模型矩陣的左側再乘以一個表示整個世界變換的模型矩陣,就能夠了。這個表示整個世界變換的矩陣又稱爲「視圖矩陣」,由於他們常常一塊兒工做,因此將視圖矩陣乘以模型矩陣獲得的矩陣稱爲「模型視圖矩陣」模型視圖矩陣的做用是:乘以一個點座標,得到一個新的點座標,得到的點座標表示點在世界裏變換,同時觀察者也變換位置,觀察者也變換後,點相對於觀察者的位置。

視圖矩陣一樣也能夠分爲平移、旋轉和縮放,視圖矩陣是將觀察者視爲一個模型,得到的觀察者在世界中變換的模型矩陣的逆矩陣(這裏能夠當作觀察者不移動,可是世界相對觀察者運動)。

觀察者平移了(tx,ty,tz),視圖矩陣以下,能夠看出若是將視圖矩陣看做整個世界的模型矩陣,至關於整個世界平移了(-tx,-ty,-tz)。

 

 

觀察者繞z軸旋轉了角度θ,視圖矩陣以下,至關於整個世界繞z軸旋轉了-θ度。

 

 

觀察者在三個方向等比例縮小了s倍,視圖矩陣以下,至關於整個世界放大了s倍。

 

觀察者縮小的情形可能會引發困惑:若是人和貓咪的眼睛在同一個位置,人看到的世界和一隻貓咪看到的世界應當是同樣尺寸的,這和上述視圖矩陣的情形矛盾;可是直覺告訴我,若是你喝了縮小藥水,你應該會以爲整個世界在膨脹,就像視圖矩陣所表現的那樣。解答是這樣:若是在計算機上模擬觀察者喝了縮小藥水的情形,在屏幕上看到整個世界是膨脹的,由於在那個虛擬的三維空間中,計算機屏幕這個「窗口」也隨你(觀察者)縮小。 
視圖矩陣實際上就是整個世界的模型矩陣,這給我一點啓發:一個模型可能由多個較小的子模型組成,模型自身有其模型矩陣,而子模型也有本身的局部模型矩陣。考慮一輛行駛中的汽車的輪胎,其模型視圖矩陣是局部模型矩陣(描述輪胎的旋轉)左乘汽車的模型矩陣(描述汽車的行駛)再左乘視圖矩陣獲得的。

 

投影矩陣

模型視圖矩陣的做用是肯定某一幀中,空間裏每一個頂點的座標,而投影矩陣則將這些頂點座標映射到二維的屏幕上,即:

 

 

最主要的有兩種投影方式,正射投影和透視投影。前者用於精確製圖,如工業零件側視圖或建築物頂視圖,從屏幕上就能夠量測平行於屏幕的線段長度;後者用於模擬視覺,遠處的物體看上去較小。下圖中,空間中的同一個矩形,正射投影后仍然是矩形,而透視投影后則變成了梯形。

正射投影(投影面和相機空間):

透視投影(投影面和相機空間):

三維世界的顯示中,屏幕模擬了一個窗口,你透過這個窗口觀察「外面」的世界。你的屏幕是有邊緣的(除非你有一個球形的房間,內壁全是屏幕),所以你僅僅能觀察到那個世界的一部分,即「相機空間」。相機空間的左、右、上、下邊界是受限於屏幕的邊緣,同時也設定前、後邊界,由於你很難看清太近或太遠的東西。在正射投影中,相機空間是一個規則的立方體,而在透視投影中則是一個方臺體。 
三維模型可能在不一樣的顯示器上展示,所以投影的過程當中不應將顯示器參數加入進來,而是將空間中的點投影到一個規範的顯示器中。另外,透視投影中的z值並非毫無用處,它能夠用來表示頂點的「深度」:若是三維空間中的兩個不一樣頂點投影到平面上時重合了,那麼將顯示深度較淺的頂點。

定義一個規範的視窗區域(CCV),爲x,y,z都處在區間[-1,1]之間的邊長爲2的立方體。x和y座標值用來線形拉伸到到實際屏幕上,而z值存儲了「深度」。而投影的過程就是將三維空間中的點從相機空間映射到CCV中。 
正射投影很是簡單,直接將矩形的相機空間線形壓縮到CCV中便可。採起頂視圖,相機空間的左右邊界爲 xleft 和 xright :

Untitled-21

簡單的線造成比例關係:

 

 

推廣到y軸和z軸:

 

相機空間中的點通過正射投影矩陣左乘後獲得的點都在CCV之中:

 

 

透視投影相對較爲複雜,一樣用頂視圖考慮x座標的狀況:

 

 

Untitled-122

轉化爲齊次的方式:

 

推廣到y軸:

 

 

透視投影矩陣的第三行不是咱們關心的內容,只要保證不一樣頂點投影先後的點座標的第三個份量z和z’的大小關係不變就能夠。 
透視投影矩陣尾行是(0,0,1,0),這樣就將計算獲得的座標的第四個份量賦值爲z而不是1。將相機空間左乘投影矩陣後的結果不是一個CCV空間,若是你將這個空間畫出來,會發現其仍然是一個方臺形。這時進行「透視除法」,將上一步獲得的點座標化爲第四個份量爲1的標準齊次座標:

 

 

而後咱們直接取齊次座標中的x’和y’值,並將其線形映射到屏幕上,好比點(0,0)出如今屏幕中央,點(-1,1)出如今屏幕左上角。

 

相關:這一篇關於投影矩陣的博文:http://blog.csdn.net/yanwei2016/article/details/7326180(雖然題目是模型視圖矩陣變化,但大部分篇幅都在講投影矩陣)

 

 總結:

    模型矩陣:保存了模型裏面的點須要怎樣運動到下一個位置(包括平移、旋轉、縮放)。

    視圖矩陣:保存了整個世界模型(我就這樣叫它吧,包括全部的模型)相對於觀察者須要作的變換,知足觀察者的觀察需求,也就是至關於觀察者移動的操做的逆矩陣。

    投影矩陣:還不是很瞭解這東西。主要就是將一個三維的物體投影到二維平面所須要作的變換的矩陣。

    模型視矩陣:模型矩陣和視圖矩陣的合併。

相關文章
相關標籤/搜索