1. 程式人生 > >OpenGl學習筆記3之模型變換、檢視變換、投影變換、視口變換介紹

OpenGl學習筆記3之模型變換、檢視變換、投影變換、視口變換介紹

模型變換、檢視變換、投影變換、視口變換介紹

opengl中存在四種變換,分別是模型變換,檢視變換,投影變換,視口變換。這四種變換是圖形渲染的基本操作,實質上這四種變換都是由矩陣乘法表示(這些操作都是由一個4*4的矩陣來完成的),通過變換,我們可以看到各種通的顯示效果,最簡單的效果就是讓圖元沿著某個方向變換(放大,縮小,翻轉等)或者對所要顯示的圖元進行裁剪。接下來我們就詳細介紹這四種變換以及相互之間的聯絡。

我們要在螢幕上顯示一個具有三維座標的物體,大致需要以下步驟:

1.     進行模型,檢視變換(變換並不是都需要的,根據自己所繪製的圖形情況來確定使用哪種變換),效果為:旋轉,平移,縮放等。一般情況下,繪製一個場景時需要組合使用幾種變換。

2.     位於視窗(即視景體,暫時理解為視窗)之外的物體(或者一部分)需要裁減掉,等於最後所顯示的圖形中並沒有視窗之外的物體。即:“投影變換”。

3.     經過變換後的座標和螢幕的畫素建立對應關係。該過程稱為“視口變換”。

我們現在用“攝像師照畢業照”所涉及的動作來解釋下產生目標場景檢視變換中四種變換的作用。

1.     檢視變換:照相時我們需要把照相機固定在三腳架上,並讓鏡頭對準所照物體(圖形學叫:場景,我們以後使用“場景”來代表所照物體)。

2.     模型變換:我們需要對場景中的物體進行安排,類似於我們的畢業照,攝像師總要對照相的人進行規劃(:這個高個子人往後站,那個人往左邊一點,那個往右一點)。這樣做的目的是讓場景中的物體位置是我們所期望的。

3.     投影變換:當鏡頭的人看著很小(也就是距離照相機很遠),攝像師要推鏡頭,讓場景(照片)中的人變大,當場景(照片)中人很多,沒有覆蓋全,我們需要拉鏡頭,把所有人放到場景(照片)中。

注:照片可以理解為我們所繪製的場景。

4.     視口變換:當攝像師給我們照好畢業照時,需要進行洗印相片,此時我們可能根據需要放大照片(PS:12寸變32寸)或者縮小照片,這個過程稱為視口變換

注:視口變換後,洗印出的照片就相當於我們在螢幕上繪製的場景的最後效果。

注:以上的場景變換順序比一定嚴格一致,但是,檢視變換必須出現在模型變換前,投影和視口變換可以放在程式(繪製)結束之前的任何地方。

四種場景檢視變換的原理(PS:這些原理了解即可,寫程式時我們只需要呼叫opengl中相對應的函式來實現以上功能):

為了進行場景中各種檢視的變換,我們需要建立一個4*4的矩陣M,然後把它與場景中的每個頂點V的座標相乘,來實現座標的變換,即V`=M*V。M矩陣中的引數就表示我們進行何種變換。頂點中的物體的座標與M相乘變成V`,然後經過繪製,就變成我們想要看到的結果了。

注:物體的頂點有四個座標(x,y,z,w),其中W預設為1,所以我們編寫程式時只編寫前三個座標,即X,Y,Z。

注:當我們使用四種變換來改變場景中的物體時,其物體表面的法線也隨之變換(使得變換後的物體的頂點座標與其所在平面的法線之間具有正確的對應關係)。PS:法線在我們繪製場景中很重要。

四種場景檢視變換後產生的效果

[1] 其中檢視和模型變換共同形成了【模型檢視矩陣】,這個矩陣與物體世界座標相乘,產生對應的視覺座標。

[2] 若程式中定義了投影矩陣,投影矩陣將產生“裁剪座標”,這些裁剪座標共同定義了“視景體”(PS:暫時理解為一個框框,在這個框框裡的物體,才能被顯示出來),作用於這個視景體之外的物體將會被裁剪掉,不會在最終的場景(理解為:沖洗出來的照片)中出現。

[3] 隨後,opengl程式中發生的是“透視除法”,它把物體的座標值分別除以W(W預設為1),產生“裝置座標”(opengl自動進行此步)。

[4] 接下來該“視口變換”,作用是把上一步的座標變成“視窗座標”,我們可以通過控制視口的大小來讓場景中的物體變大或者變小。

以上的繪製場景步驟我們概括為一段話:

程式中指定了必要的變換後,我們就可以繪製場景了(理解為:準備拍照),

(1)opengl通過模型、檢視變換,對場景中的物體的每個頂點進行變換。(2)然後根據我們自己指定的投影變換對每個頂點再次進行變換,如果頂點位視景體之外,它就被裁剪掉。(3)最後經過變換的剩餘頂點除以W(透視除法),然後對映到視口。

注:有人一定要問了?在我們電腦螢幕上顯示出的物體只需要具備X,Y座標即可(螢幕是二維的),為什麼還有Z座標?

Z座標的作用是反應物體頂點的深度(即從頂點到螢幕的距離),由於我們生活中看到的景象是“近大遠小”,當兩個物體前後放在我們面前時,由於前一個物體的遮擋,我們只能看到後一個物體的區域性(很明顯的道理嘛),Z座標就是要實現以上的效果,當場景中兩個物體的XY座標一致,而Z座標不同,opengl就可以使用此資訊判斷哪個表面被另一個表面遮擋了,從而避免繪製那個被遮擋的表面(讓程式渲染效率更高),此技術稱為“隱藏表面消除技術”。

本節簡單介紹了opengl中的四種場景變換的概念,下一章我們分章節詳細介紹各變換是如何使用的。