楊 薇,李文高
(保山學院 信息學院 云南 保山 678000)
生活的大自然中,我們看到的物體都是三維物體,但要將這些景物數字化傳到電腦上顯示,那么一切三維景物都是以二維平面圖像的形式顯示,在具體的顯示效果中,我們又要求物體能夠具備三維的視覺特性,因此在顯示三維物體時,其過程是復雜的。OpenGL是目前圖形開發的標準,它的性能表現異常優越,尤其在實現三維渲染、三維場景等方面有著非常逼真的效果。
要利用OpenGL來顯示三維物體,可大體分為以下幾個過程。
在顯示三維圖形之前,要對三維場景建模,并對場景中的實物建立三維景物模型。如果我們想在OpenGL中完成基本的三維圖形基礎模型建立并不困難,強大的OpenGL軟件包中包含了大量的基礎圖元,除此以外輔助庫中增加了很多描述三維圖像人函數及圖元。這些函數為我們提供了基礎圖形的模型。因此我們現在來繪制基本的三維圖形就很容易,只需要掌握基礎的三維圖形圖元函數,例如繪制球體可用glutWireSphere函數來完成,繪制圓錐體可以函數glutWireCone來完成,繪制8面體可用glutWireOctahedron函數來完成。
隨著計算機圖形學的發展各種顯示三維圖像的技術不斷涌出,利用當前的三維技術,我們可以將大自然的景物再現,在實現過程中主要利用三維形體來表示物體信息。具體的實現過程,我們通常用可視化技術來完成,設計師們可以在設計三維圖像時突破傳統思維盡情發揮自己的想象設計出更出眾的作品。機械工程師們可以利用三維技術直接設計三維機械零部件,不必在二維技術中糾結如何展現三維的特性。醫生利用三維彩超直接生存三維直觀的掃描圖像,這樣更精確的分析出病人的病灶。軍事指揮員則可以利用三維軟件生存各種復雜的三維實戰地圖,并在模擬的地圖中完成各種三維飛機、導彈、軍艦等指揮,并最終分析得出最佳作戰方案。
我們生活的大自然是一個三維的物體世界,為了能夠盡量準確逼真的將大自然還原到電腦中,我們需要一個世界空間,該世界空間就是所有物體所在的三維空間, 在該空間中定義的坐標系稱為世界坐標系,物體在三維空間中的運動及形變的過程稱為世界變換。世界坐標系是物體的全局坐標系,各個物體的模型統一在這一坐標系下,便于表達多個物體的顯示。
將模型轉換成三維世界中的物體,就需要進行模型變換。所謂 “模型變換”,指的是從模型坐標系到世界坐標系的轉換。
真實世界里所有物體都是三維的,我們要想將世界坐標系中的三維物體轉換到二維平面上,需要經過觀察變換來完成。
要獲得三維世界坐標系場景的顯示,必須先建立觀察用的坐標系。然后將對象描述轉換到觀察坐標系中來。這一過程我們通常稱為視點變換。為了描述視點變換,我們引入了一個概念即照相機,在常規拍照時,我們常常選擇好景點后開始支好三腳架,并將照相機放在三腳架上面,此時將照相機對準三維景物。通過不斷的調節視點,將景物最好的呈現在相機上,該過程叫視點變換。默認情況下,視點位置即相機所在位置為世界坐標中的原點,并且規定反Z軸為相機的初始方向,在這種情況剛好,剛好相機與物體是重疊的。
函數gluLookAt是OpenGL實用庫中提供的視點變換函數,此函數共有三個變量,每個變量表示視點的位置、相機瞄準方向的參考點以及相機的向上方向。通過調用這個函數之后,就設定好了視點的位置了。
在相機和物體都放好后,我們要不斷的調整相機焦距及相機鏡頭位置,使景物以最美最恰當的角度呈現的相機內。同樣,在OpenGL中為了讓三維物體以最真實的樣子投影在二維坐標中,就需要投影變換。利用投影降低維數的方式,我們能夠讓物體以合適的位置、方向以及大小來顯示出來。投影變換的最終目的就是定義一個視景體,將所需要的景物框在該體內,視景體外的多余景物利用相關算法裁掉。投影包括透視投影和正視投影兩種。
(1)透視投影
透視投影是一種最常用的投影方式,該方式來自于我們的生活習慣及視覺常識,在視點附近的景物大,隨著與視點的距離增加物體越來越小。該視景體猶如一個頂部和底部都被進行切割過的棱椎。在動畫設計、視覺仿真以及其它許多需要反映真實性物體時常用到透視投影。
在OpenGL中,透視投影主要通過兩個投影函數來完成,分別是glFrustum函數和gluPerspective函數。
函數glFrustum的作用是創建一個透視視景體。它的操作原理是先創建一個用與透視投影的矩陣,然后用這個矩陣乘以三維物體的各個頂點坐標組成的矩陣。這個函數的參數只定義近裁剪平面的左下角點和右上角點的三維空間坐標,即(left,bottom,-near)和(right,top,-near);最后一個參數far是遠裁剪平面的Z負值,其左下角點和右上角點空間坐標由函數根據透視投影原理自動生成。near和far表示離視點的遠近,它們總為正值。
gluPerspective是一個透視函數,其作用最終也是創建一個對稱透視視景體。在使用該函數時應注意,通過設定不同的參數,我們可以定義視野在各個平面的角度、范圍值、投影平面寬度與高度的比率、遠近裁剪面沿Z負軸到視點的距離。
(2)正射投影
該投影又稱為平行投影。正射投影的原理是創建一個矩形平行管道視景體。正射投影的最大特點是物體的大小尺寸不依賴于物體與相機的距離。因此這種投影通常用在一些物體尺寸及角度投影后沒有變化的行業,目的是讓施工或者制造時保持物體比例大小,如建筑藍圖繪制和計算機輔助設計等方面。
在OpenGL中使用正射投影主要通過 glOrtho和gluOrtho2D兩個函數來實現。
生活中當我們沖洗照片時需要指定照片的尺寸大小,這相當于OpenGL中的視口變換。視口變換就是在電腦屏幕上指定二維圖像的大小,通過變換,我們可以指定景物在屏幕中的一個矩形區域,該區域規定了位置范圍,尺寸大小。
在計算機圖形學中,視口變換就是將物體應用一系列的變換算法顯示于指定窗口的矩形區域內,這些算法包括幾何變換、投影變換和裁剪變換。在OpenGL中通常我們應用glViewport(GLint x,GLint y,GLsizei width,GLsizei height);這個函數定義一個視口,該函數我們稱之為視口函數。視口在屏幕中的初始位置由參數XY來指定,視口的寬度和高度由width和height來指定。在使用該函數時如果不指定參數,系統會給我們一個默認值,該默認值為(0,0,winWidth,winHeight)。所有這些值都是以象素為單位,全為整型數。
經過以上過程,一個三維圖形就可以完整的顯示在我們的屏幕內。
[1]蔡士杰楊若瑜.計算機圖形學第四版.電子工業出版社,2016,2.