杜麗美,張劍妹
(長治學(xué)院計算機(jī)系,山西長治 046011)
當(dāng)今信息技術(shù)迅猛發(fā)展,隨之產(chǎn)生的電子產(chǎn)品越來越多,這就導(dǎo)致了人們在工作和日常生活中對虛擬事物的接觸也越來越頻繁。比如在工作和學(xué)習(xí)中可能要借助虛擬場景來解決難題,生活中要借助虛擬設(shè)備來實(shí)現(xiàn)各種智能控制,娛樂方面更是離不開虛擬世界。為了更好地營造虛擬場景氛圍需要將現(xiàn)實(shí)生活中的各類物體以虛擬物體的狀態(tài)展示在各種屏幕上,以供人類使用。
現(xiàn)實(shí)生活中的物體之所以真實(shí)是因?yàn)榇蠖嗍侨S的,人類用雙眼觀察這些物體會有遠(yuǎn)處的物體小,近處的物體大的特點(diǎn),再加上自然光的照射,霧的存在等使得一個普通的物體出現(xiàn)了各種狀態(tài)。要將真實(shí)物體變?yōu)樘摂M物體,首先要解決的是虛擬物體在窗口上的定位和投影問題,其次是各種特殊效果的設(shè)置,比如光照、材質(zhì)、紋理等,最后還要解決人與虛擬物體之間的交互問題。本文就從這些方面來研究對于現(xiàn)實(shí)世界中的三維物體如何正確而有效地轉(zhuǎn)換為虛擬物體的過程。
一個物體要想展示在計算機(jī)屏幕上,首先要確定窗口的位置和大小、視口的位置和大小、視點(diǎn)的位置、投影的方式等問題[1-2]。
計算機(jī)屏幕所對的坐標(biāo)系為世界坐標(biāo)系,其X、Y和Z軸的方向如圖1所示,即垂直于屏幕向外的方向?yàn)閆軸正向。確定了坐標(biāo)系后,就要確定屏幕窗口的位置和大小,可以借助函數(shù)(1)(2)來完成,其中(1)中的x0和y0表示屏幕窗口距離計算機(jī)屏幕左上角的位置坐標(biāo),(2)中的width0和height0表示屏幕窗口自身的大小;接著確定視口的位置和大小,視口可形象地理解為顯示物體的窗口,視口與屏幕窗口的關(guān)系為:屏幕窗口中包含視口,視口僅僅是屏幕窗口的一部分,大多數(shù)情況視口與屏幕窗口大小和位置完全一樣即“重疊”,視口設(shè)置函數(shù)為(3),其中x 和y 表示視口距離屏幕窗口左下角的位置坐標(biāo),width 和height 表示視口自身的大小。計算機(jī)屏幕、屏幕窗口、視口之間的關(guān)系見圖2所示。
圖1 世界坐標(biāo)系
視點(diǎn)即對應(yīng)著真實(shí)世界中人眼睛的位置坐標(biāo),眼睛位置選取的不同可以看到物體的面就不同,視點(diǎn)設(shè)置函數(shù)為(4),其中x1、y1和z1為人眼在世界坐標(biāo)下的位置,x2、y2和z2為物體在世界坐標(biāo)下的位置,x3、y3和z3為人眼看物體的方向(其實(shí)就是方向坐標(biāo))。
圖2 屏幕、窗口、視口之間的關(guān)系
投影是物體建模最關(guān)鍵的一步,分為正射投影和透視投影。正射投影的特點(diǎn)是不管物體離視點(diǎn)有多遠(yuǎn),物體的大小都是不變的。透視投影的特點(diǎn)是離視點(diǎn)近的物體大,離視點(diǎn)遠(yuǎn)的物體小,透視投影符合我們?nèi)粘I钪杏^察某個物體的特點(diǎn),因此透視投影方式可以呈現(xiàn)出一種立體的效果,更接近真實(shí)場景。一般我們在三維建模中都使用透視投影的方式。兩種投影方式對應(yīng)的投影函數(shù)為(5)和(6),其中(5)中的參數(shù)如圖3 所示,(6)中的參數(shù)x表示視點(diǎn)與裁剪面上端與下端形成的角度,y表示裁剪面的寬高比即width/height,z和h分別表示近裁剪面和遠(yuǎn)裁剪面沿Z 軸距視點(diǎn)的距離如圖4 所示。不管是哪種投影方式,在調(diào)用投影函數(shù)之前都必須加上glLoadIdentity()和glMatrixMode()函數(shù),前者表示還原當(dāng)前矩陣為單位矩陣(也就是進(jìn)行復(fù)位操作),后者表示投影模式(參數(shù)一般為GL_PROJECTION)。
圖3 正射投影視景體
圖4 透視投影視景體
堆棧操作經(jīng)常用在模型的平移、旋轉(zhuǎn)和縮放等變換中,堆棧操作[3]函數(shù)為式(7)和(8)所示。對模型進(jìn)行各種變換其實(shí)就是使用各種變換矩陣M1,M2,…,與當(dāng)前模型所在矩陣S進(jìn)行相乘的操作,式(7)是將各種變換對應(yīng)的矩陣M1,M2,…,壓入棧中,目的是使變換矩陣與物體所在矩陣S做運(yùn)算,運(yùn)算的結(jié)果S’即為模型經(jīng)過變換之后最終的位置;式(8)是將變換后的最終矩陣S’拋出,留下最初模型對應(yīng)的矩陣S。
為了更加清晰地了解堆棧操作在圖形變換中的重要作用,以圖5 為例來進(jìn)行具體的說明,圖5中的五幅圖展示了一個長方形在進(jìn)行旋轉(zhuǎn)的過程中,使用堆棧和不使用堆棧的最終效果,其中圖5(a)為確定了窗口、視口、視點(diǎn)以及投影方式后,在屏幕中心位置畫出的初始長方形,現(xiàn)對初始長方形進(jìn)行旋轉(zhuǎn)變換,每次旋轉(zhuǎn)角度為5 度;圖5(b)為使用了堆棧操作后,對長方形進(jìn)行的第一次旋轉(zhuǎn),圖5(d)為不使用堆棧操作對長方形進(jìn)行的第一次旋轉(zhuǎn),由于是第一次旋轉(zhuǎn),所以兩幅圖的結(jié)果是一樣的。圖5(c)和圖5(e)分別是使用和不使用堆棧操作對初始長方形進(jìn)行的五次旋轉(zhuǎn)后的結(jié)果,比較兩次結(jié)果,假設(shè)變量i=0 為旋轉(zhuǎn)度數(shù),旋轉(zhuǎn)一次相當(dāng)于i+=5(這里的5 表示5 度),圖5(c)由于使用了堆棧操作,在每一次旋轉(zhuǎn)后都會將旋轉(zhuǎn)變換后的矩陣拋出,只剩下初始長方形所在的初始矩陣,因而在進(jìn)行第五次旋轉(zhuǎn)時,i的值已經(jīng)加到了25 度,25度對應(yīng)的旋轉(zhuǎn)矩陣和初始長方形所在的矩陣相乘,因此在經(jīng)過了第五次旋轉(zhuǎn)后最終的結(jié)果和圖5(a)比較僅僅旋轉(zhuǎn)了25度;圖5(e)沒有使用堆棧操作,可以理解為:第一次旋轉(zhuǎn)i的值為5表示模型轉(zhuǎn)動5度,第二次旋轉(zhuǎn)i的值變?yōu)?0表示在第一次旋轉(zhuǎn)的基礎(chǔ)上再旋轉(zhuǎn)10 度,其實(shí)模型較圖5(a)已經(jīng)旋轉(zhuǎn)了15度,…,第五次旋轉(zhuǎn)時i的值為25是在第四次旋轉(zhuǎn)的基礎(chǔ)上進(jìn)行的,因此第五次旋轉(zhuǎn)后模型較圖5(a)旋轉(zhuǎn)了75度。
圖5 使用堆棧和不使用堆棧對模型進(jìn)行旋轉(zhuǎn)效果對比
根據(jù)以上分析,當(dāng)我們對模型進(jìn)行平移、旋轉(zhuǎn)、縮放等變換時,使用堆棧操作會更加接近真實(shí)情況,為此一般情況下都需要在程序的設(shè)計中加入堆棧操作函數(shù)。
為了渲染出更加真實(shí)的場景,需要對模型進(jìn)行光照、霧化等的設(shè)置,設(shè)置不同顏色的光照可以使物體表面呈現(xiàn)出不同的顏色效果,使用霧化函數(shù)可以修飾周圍的環(huán)境,更加逼近真實(shí)場景[4]。另外,為了達(dá)到人機(jī)交互的目的,可以借助鍵盤控制函數(shù),來控制屏幕上模型的各種運(yùn)動[5-6]。這些特殊效果可以使用式(9)~(12)來完成。
通過以上分析,這里分別對兩種物體進(jìn)行了仿真模擬,當(dāng)將窗口和視口大小均設(shè)置為(200,200),視點(diǎn)位置為(0,0,10),投影方式采用透視投影方式時圖6(a)和圖7(a)為對“茶壺”和“甜甜圈”兩個物體的模擬效果,從結(jié)果中看到物體都是居中顯示的。圖6(b)和圖6(c)為借助鍵盤控制函數(shù)對茶壺進(jìn)行不同方向的旋轉(zhuǎn)效果。圖7(b)和圖7(c)為在透視投影下,對物體在Z 軸負(fù)方向作平移后的效果,從結(jié)果中可以看到物體變的越來越小,而且實(shí)驗(yàn)中加入了霧化效果,當(dāng)物體沿著Z軸負(fù)方向移動時會有霧的阻擋而顏色越來越不清晰。在圖6 和圖7 的仿真過程中,由于涉及到物體的移動問題,因此均使用了堆棧操作函數(shù)。
圖6 茶壺模型的定位及渲染效果
圖7 甜甜圈模型的定位及渲染效果
詳細(xì)介紹了物體進(jìn)行仿真建模過程中的定位問題、投影問題以及堆棧操作問題,這些問題要在物體建模初期確定下來,并且其解決的好壞決定了物體后期的仿真效果。除了這些問題以外,為了能夠重建出非常逼真的模型,還需要對物體進(jìn)行光照、材質(zhì)、紋理[7]、霧化等的設(shè)置,這些只在文中簡要地提到,還有待進(jìn)一步研究。