我們知道所有模型都是獨立建立的,他們擁有自己獨立的乙個區域性座標系來描述模型內部各個麵片頂點之間位置的關係,當我們將這些模型放在一起來組建遊戲場景的時候,邏輯上他們就處在了同乙個座標系內來描述模型與模型之間位置與角度的關係,這個座標系我們所說的世界座標系,而將模型中的每乙個頂點從區域性座標系轉換到世界座標系的過程,我們稱之為世界變換。
世界變換是通過將模型中每乙個頂點乘以世界變換矩陣來完成的,通常情況下這個世界變換矩陣是通過一系列變換矩陣的結合形成的乙個包含了所有變換內容的矩陣來完成計算的,包括平移、旋轉、縮放等等變換。
在3d圖形學裡的矩陣變換同2d圖形學裡一樣,只是多了一維座標,一般的變換矩陣如下圖所示:
單獨平移矩陣和縮放矩陣如下圖所示,也比較好理解,其中tx,ty,tz分別表示在各個座標軸上平移的距離,sx,sy,sz分別表示在各個座標方向上縮放的倍數。
旋轉矩陣在理解上需要一點點推導,以2維空間下圍繞原點旋轉為例,大家可以畫乙個草圖來幫助推導,設點(x,y)與原點的連線同x軸的角度為b,以此方向繼續旋轉a度,至點(x』,y』),我們可知旋轉軌跡所在圓的半徑r=x/cosb,r=y/sinb。而x』=r*cos(a+b),y』=r*sin(a+b),根據合角公式拆開,再將前面的式子帶入,可得x』=xcosa-ysina;y』=xsina+ycosa。
3維空間下以此相推可分別得出圍繞x軸方向旋轉、圍繞y軸方向旋轉、圍繞z軸方向旋轉的變換矩陣:
另外3維空間下圍繞任意軸旋轉的旋轉變換矩陣是通過平移矩陣和圍繞各個軸旋轉的矩陣復合而得出的。
在世界座標系裡的任何乙個模型的狀態都可以通過若干中變換矩陣的組合來表明它的唯一狀態,通過矩陣相乘來得到最終的變換矩陣,需要注意的是因為所有的變換矩陣都是相對座標系的原點完成的,所以變換矩陣相乘時候的順序關係很重要,相互顛倒會產生完全不同的變換矩陣。
視角變換
通過世界變換,我們將所有的模型都轉換到乙個統一的世界座標系中,但是在遊戲中我們的觀察點不可能總是世界座標系的原點,面向著z軸的正方向。攝像機和模型是同樣可以游離於場景中的任何地點,面向任意角度的,所以這就需要通過視角變換來實現。
乙個視角變換通常是由一次平移變換和三次旋轉變換來完成的,平移矩陣負責將相機從預設的世界座標系的原點平移到正確的位置,三次旋轉分別負責圍繞三個座標軸的旋轉,將相機調整至正確的朝向。
說的很抽象,但實際上可以理解為將轉換到世界座標下的各個模型再轉換到以攝像機為原點的攝像機座標系下,當然在遊戲中是不需要手動生成這個矩陣的,我們只需要提供相機的位置,朝向等等引數,api會幫我們生成正確的視角矩陣。
投影變換
投影變換的工作就是將攝影空間中的三維物體投影到二維的平面上,邏輯上也就是使用者的螢幕區域。這種三維到二維的變換過程就是投影變換,即從取景空間到投影空間的變換。
投影變換分為兩種基本的投影變換:正交投影和透視投影
正交投影中,投影向量和觀察平面垂直,物體座標沿觀察座標系的z軸平行投影到觀察平面上,觀察點和觀察平面間的距離不會影響物體的投影大小。工程設計中的頂檢視、前檢視和側檢視就是典型的正交投影,正交投影沒有透視關係,可以利用正交投影來完成d3d渲染2d遊戲畫面。
而透視投影實現的是乙個縮放、透視的投影。透視投影的特點是:距離攝像機越遠的物體在投影平面上的成像越小。更像人眼所能看到的現實世界中的透視關係。
下面我們來根據透視投影的幾何關係來推導一下透視投影下的投影矩陣的生成:
在遊戲中,當以透視的方法從攝像機來觀察場景的時候,會在場景內形成乙個金字塔形狀的可見區域,又因為遠近兩個裁剪面的存在,所以實際上可見區域是乙個截體,透視投影矩陣的作用是將這個取景截體轉換成乙個立方體(將近攝像機端拉伸),分別將x和y座標對映到投影平面的正確的位置上,同時保持深度資訊不變,因為截體的近端比遠端小,所以靠近攝像機的物件將被放大,而遠離攝像機的物件,則會相對保持原樣。
到齊次裁剪空間的對映是通過乙個4×4的投影矩陣實現的。在這個投影矩陣中,除了其他的變換功能外,還要保證變換後的點w座標等於攝像機空間中的點的z座標的負值,這樣,將變換後的點的座標分量除以w座標後,就可以生成裁剪空間中相應的三維點。
我們設圖中可視區中一點p(px,py,pz),將p點同攝像機相連同投影面交於一點(x,y,z),這個點就是投影變換後p所應該在的點,遠近裁剪面到攝像機的距離分別是d和zf。根據相似三角形,我們可以知道x=d*px/pz;y=d*py/pz,設投影平面的四個邊框的橫縱座標位置分別是r,l,t,b(右左上下)。為了滿足取景截體到齊次空間的對映,我們還需要需要將投影後的x,y座標對映到[-1,1]區間,而通常的,將z座標對映到[0,1]區間,對映後的座標為x』,y』,z』。根據兩個平面內座標同平面的線性比例關係,我們繼續推導:
z軸的線性關係相對簡單,但是因為在光柵化過程中為避免透視失真而進行的乘以z倒數的插值操作(顯示卡的工作,為什麼要這樣的具體原理還理解不夠透徹,以後補齊),所以這裡要建立關於1/z的對映,這樣就可以對投影深度值進行線性插值了:
將所得的x』,y』,z』同px,py,pz所對應的關係進一步整理,就可以得到最終的正確的投影矩陣了。這個投影矩陣也是d3d中所用的投影矩陣,雖然我們通常都是提供相機的fov,朝向,位置等引數利用api生成, 但是理解原理是非常重要的,關於正交投影的投影矩陣大家也可以利用類似的步驟推導出來。
寫的非常粗糙,只描述了一些關鍵步驟,權作筆記,畫圖和公式可真是耽誤了我好多好多時間啊,真累人……
七引數空間直角座標系座標轉換
一 引言 在測繪領域中,經常遇到不同空間直角座標系之間轉換的問題,比如在空間大地測量,攝影測量以及gis,gps在測量中經常會用到wgs 84座標系與我國北京54座標系或與地方座標系之間的轉換,空間直角座標轉換的七引數模型主要有1.布林莎模型 2.莫洛琴斯基模型 3.武測模型。目前大多實際應用多採用...
ArcGIS 實習12空間座標轉換
1.勾選檔案的相對儲存路徑,設定預設檔案。開啟arcmap 在map document properties勾選檔案的相對儲存路徑,設定預設檔案路徑儲存至實驗12的檔案地理資料庫中。瀏覽右側catalog中的實驗12 資料。可以看到,包含了中國東部 西部的向量線資料。東部控制點 西部控制點。兩個投影...
空間定位中座標系轉換 (1)
從畫素座標系到天球座標系的轉換 1.畫素座標系 畫素座標系通常以左上角為原點,向右,向下分別為i,j方向,數值代表畫素的行列號 2.像平面座標系 像平面座標系原點在探測器焦平面幾何中心,x,y軸分別平行i,j軸,數值代表像點在成像平面的物理位置 3.相機座標系 相機座標系原點位於相機投影中心,x,y...