轉自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.htmlhtml
爲了說明在三維物體到二維圖象之間,須要通過什麼樣的變換,咱們引入了相機(Camera)模擬的方式,假定用相機來拍攝這個世界,那麼在相機的取景器中,就存在人眼和現實世界之間的一個變換過程。
編程
![]()
第一步:視點變換(如同拍照的時候設置相機的位置)
在拍照的時候,咱們首先要將相機置於三角架上,讓它對準三維場景。在OpenGL中調整視點的位置就像是是要放置相機同樣,咱們稱之爲視點變換(Viewing Transformation)。
視點變換肯定了場景中物體的視點(即相機)的位置和方向,讓相機對準要拍攝的物體。缺省時,相機(即視點)定位在世界座標系的原點,(注意:初始時世界座標系和當前繪圖座標系位於相同的位置);相機的初始方向都指向Z負軸。
初始狀況下,相機和物體都位於世界座標系的原點,即相機(視點)與物體是重疊的。試想一下,在用相機拍攝物體時,咱們能夠保持物體的位置不動,而將相機移離物體,這就至關於視點變換。
視點變換函數gluLookAt(): OpenGL實用庫提供了gluLookAt()函數,該函數有三個變量,分別定義了視點的位置、相機瞄準方向的參考點以及相機的向上方向。該函數的原型爲:
該函數定義了視點矩陣,並用該矩陣乘以當前矩陣。eyex,eyey,eyez定義了視點的位置;centerx、centery和centerz變量指定了參考點的位置,該點一般爲相機所瞄準的場景中心軸線上的點;upx、upy、upz變量指定了向上向量的方向。
使用這個函數以後,只設定好了視點(相機)的位置了。
第二步:模型變換(如同拍照時調整三維物體的位置)函數
在拍照時,咱們也能夠保持相機的固定位置,將物體移離相機以將三維物體擺放在場景中的適當位置。在OpenGL中,對物體的顯示位置方向的設置就與之相似,咱們稱之爲模型變換(Modeling Transformation)。而顯示位置與當前的繪圖座標系密切相關,由於物體老是在當前的繪圖座標系中進行繪製的,所以實際上模型變換能夠說就是對當前繪圖座標系位置的變換,這一變換是在世界座標系下進行的。
設置物體位置涉及到即對模型進行旋轉、平移和縮放。缺省時,物體模型(即繪圖座標系)的中心定位在世界座標系的中心處。OpenGL在這個座標系中,有以下三個函數來實現模型變換。
一、模型平移
該函數用指定的x,y,z值沿着(世界座標系的)x軸、y軸、z軸移動繪圖座標系(也便是按照相同的量值平移物體)。
二、模型旋轉
該函數中第一個變量angle制定模型旋轉的角度,單位爲度,後三個變量表示以世界座標系下的原點(0,0,0)到點(x,y,z)的連線爲軸線逆時針旋轉繪圖座標系。例如,glRotatef(45.0,0.0,0.0,1.0)的結果是繞z軸旋轉45度。
三、模型縮放
該函數能夠對物體沿着x,y,z軸分別進行放大縮小。函數中的三個參數分別是x、y、z軸方向的比例變換因子。缺省時都爲1.0,即物體沒變化。程序中物體Y軸比例爲2.0,其他都爲1.0,就是說將立方體變成長方體。
注意:一般,視點轉換操做在模型轉換操做以前發出,以便模型轉換先對物體發生做用。場景中物體的頂點通過模型轉換以後移動到所但願的位置,而後再對場景進行視點定位等操做。模型轉換和視點轉換共同構成模型視景矩陣。
第三步:投影變換(就如同拍照中的選鏡頭並調焦距)
在相機和物體都放好後,咱們要選擇相機鏡頭並調焦拍照,使三維物體投影在二維膠片上。與之相似,OpenGL中把三維模型投影到二維屏幕上的過程,即OpenGL的投影變換(Projection Transformation)。
爲了使顯示的物體能以合適的位置、大小和方向顯示出來,必需要經過投影來下降維數。事實上,投影變換的目的就是定義一個視景體,使得視景體外多餘的部分裁剪掉,最終進入圖像的只是視景體內的有關部分。投影包括透視投影(Perspective Projection)和正視投影(Orthographic Projection)兩種。
1. 透視投影
透視投影符合人們心理習慣,即離視點近的物體大,離視點遠的物體小,遠到極點即爲消失,成爲滅點。它的視景體相似於一個頂部和底部都被進行切割過的棱椎,也就是棱臺。這個投影一般用於動畫、視覺仿真以及其它許多具備真實性反映的方面。
OpenGL透視投影函數有兩個glFrustum()和gluPerspective()。
(1)函數glFrustum():
它建立一個透視視景體。其操做是建立一個透視投影矩陣,而且用這個矩陣乘以當前矩陣(三維物體的各個頂點座標組成的矩陣)。這個函數的參數只定義近裁剪平面的左下角點和右上角點的三維空間座標,即(left,bottom,-near)和(right,top,-near);最後一個參數far是遠裁剪平面的Z負值,其左下角點和右上角點空間座標由函數根據透視投影原理自動生成。near和far表示離視點的遠近,它們總爲正值。該函數造成的視景體如圖三所示。
(2)透視函數gluPerspective()是:
它也建立一個對稱透視視景體,但它的參數定義於前面的不一樣,參數fovy定義視野在X-Z平面的角度,範圍是[0.0, 180.0];參數aspect是投影平面寬度與高度的比率;參數zNear和Far分別是遠近裁剪面沿Z負軸到視點的距離,它們總爲正值。
以上兩個函數缺省時,視點都在原點,視線沿Z軸指向負方向。
2.正射投影
正射投影,又叫平行投影。這種投影的視景體是一個矩形的平行管道,也就是一個長方體,如圖五所示。正射投影的最大一個特色是不管物體距離相機多遠,投影后的物體大小尺寸不變。這種投影一般用在建築藍圖繪製和計算機輔助設計等方面,這些行業要求投影后的物體尺寸及相互間的角度不變,以便施工或製造時物體比例大小正確。
OpenGL正射投影函數也有兩個, glOrtho()和gluOrtho2D() (1)glOrtho():
它建立一個平行視景體。實際上這個函數的操做是建立一個正射投影矩陣,而且用這個矩陣乘以當前矩陣。其中近裁剪平面是一個矩形,矩形左下角點三維空間座標是(left,bottom,-near),右上角點是(right,top,-near);遠裁剪平面也是一個矩形,左下角點空間座標是(left,bottom,-far),右上角點是(right,top,-far)。全部的near和far值同時爲正或同時爲負。若是沒有其餘變換,正射投影的方向平行於Z軸,且視點朝向Z負軸。這意味着物體在視點前面時far和near都爲負值,物體在視點後面時far和near都爲正值。
(2)gluOrtho2D():
它是一個特殊的正射投影函數,主要用於二維圖像到二維屏幕上的投影。它的near和far缺省值分別爲-1.0和1.0,全部二維物體的Z座標都爲0.0。所以它的裁剪面是一個左下角點爲(left,bottom)、右上角點爲(right,top)的矩形。
第四步:視口變換(即着拍照過程當中的沖洗底片)
咱們知道,沖洗底片就決定二維相片的大小,是2寸是5寸仍是10寸。它至關與OpenGL中的視口變換(Viewport Transformation),即在屏幕窗口內能夠定義一個矩形,稱爲視口(Viewport),規定屏幕上場景的範圍和尺寸,相似於照片的畫布。視景體投影后的圖形就在視口內顯示,相似於拍攝的圖像在畫布上顯示。
在計算機圖形學中,視口變換就是將通過幾何變換、投影變換和裁剪變換後的物體顯示於屏幕窗口內指定的區域內,這個區域一般爲矩形,稱爲視口。
OpenGL中視口變換的相關函數是:
這個函數定義一個視口。函數參數(x, y)是視口在屏幕窗口座標系中的左下角點座標,參數width和height分別是視口的寬度和高度。缺省時,參數值即(0, 0, winWidth, winHeight) 指的是屏幕窗口的實際尺寸大小。全部這些值都是以象素爲單位,全爲整型數。
經過上面的幾個步驟,一個三維空間裏的物體就能夠用相應的二維平面物體繪製表示了,也就能在二維的電腦屏幕上正確顯示了。總的來講,三維物體的顯示過程以下:
|