朱玉君 黃媛媛 顏家康
摘 要:隨著圖形處理技術(shù)及顯卡處理能力等的日益成熟,三維游戲已經(jīng)成為游戲市場的主導(dǎo)。主要介紹基于Microsoft的一套功能豐富的底層API--DirectX的最基本的三維地形繪制過程以及三維世界中拾取的研究,為游戲?qū)W習(xí)者提供一種易于理解的方式來進(jìn)行3D技術(shù)中難點的學(xué)習(xí)。
關(guān)鍵詞:游戲 三維地形 三維拾取
中圖分類號:TP391.9 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-3973(2013)006-101-02
1 引言
隨著游戲玩家經(jīng)驗的積累和科技體驗、審美能力的提高,傳統(tǒng)的二維世界游戲已經(jīng)無法滿足人們享受娛樂的需求,游戲為了適應(yīng)市場的需要,必須變革。從Directx1.0~Directx10的發(fā)展史可以窺見游戲世界的進(jìn)化歷程:從最初Directx1.0僅能夠做的直接讀取硬件信息,開發(fā)的游戲能實現(xiàn)對二維圖像進(jìn)行加速,Directx2.0中D3D部分的雛形到Directx7.0支持T&L技術(shù),使得CPU從繁重的位置、燈光等計算中解放出來,使得沒有高速的CPU也同樣能流暢的跑起3D游戲直至Directx10統(tǒng)一了渲染架構(gòu),使得GPU更加高效,3D世界進(jìn)一步擬真化。DirectX作為當(dāng)今游戲底層API的引導(dǎo)者這一格局,也明示了3D游戲才是市場發(fā)展的趨勢這一事實。因此,游戲?qū)W習(xí)者必須對3D游戲有所涉及。了解三維游戲場景中最基本的地形繪制,有利于學(xué)習(xí)者對三維游戲有直觀的認(rèn)識。拾取算法的研究,有助于游戲?qū)W習(xí)者對3D游戲的深入了解。
2 三維地形繪制
游戲場景通常會架設(shè)在起伏的山坡,綠地,沙灘,雪地,樹林等自然環(huán)境中,這樣的場景可增加游戲的逼真度和吸引力。友好精美的游戲場景無疑會使得游戲在競爭激烈的市場中獲得第一眼優(yōu)勢。
2.1 地形高度圖的創(chuàng)建、訪問和修改
通過地理學(xué)習(xí)可知,一般用灰度圖來表示地理位置上的海拔,顏色越深的就表示海拔越高,灰度圖是高度圖的一種表示類型。因此,進(jìn)行三維地形繪制,我們使用一種最簡單的方法,通過使用圖形處理應(yīng)用程序Photoshop來進(jìn)行高度圖(指定灰度圖類型)的繪制,通過顏色的設(shè)置來表示你想要的地形起伏。高度圖繪制完成之后,將文件保存為8位raw文件,因為raw文件連續(xù)存儲了圖像中以字節(jié)為單位的每個像素的灰度值,因此,高度只能在【0,255】區(qū)間內(nèi)變化,對于普通地形,這個值足夠平滑,若這個區(qū)間不足以表達(dá)我們要的地形,可以在高度圖數(shù)據(jù)加載到程序中時對其進(jìn)行一個比例變化,重新分配一個精度更高的類型來存儲高度值。
使用地形類(Terrain)中定義的readRawFile成員函數(shù)對高度圖文件進(jìn)行讀取。使用類中提供的兩個函數(shù)getHeightEntry 和setHeightEntry函數(shù)對高度圖中的值進(jìn)行訪問和修改。
2.2 創(chuàng)建地形的幾何信息以及為每個頂點建立索引
一般灰度圖創(chuàng)建時灰度圖形與將要創(chuàng)建的地形的尺寸是相同的。高度圖繪制完畢,就開始創(chuàng)建地形的幾何圖形,即對高度圖中的每個值創(chuàng)建對應(yīng)的頂點。Terrian類中通過其構(gòu)造函數(shù)來完成創(chuàng)建過程。將要創(chuàng)建的幾何地形圖的基本信息通過構(gòu)造函數(shù)的參數(shù)列表傳遞,參數(shù)包括已創(chuàng)建的raw文件字符串文件名,每行、每列的頂點數(shù)以及每個單元間距以及比例變化值,通過這些參數(shù),還可以計算出地形的其他變量,如每行的單元數(shù),每列單元數(shù),地形幾何圖形的寬度和高度,總的頂點數(shù)以及其中三角形面片數(shù)目等。創(chuàng)建好地形的幾何圖形之后,就需要計算幾何地形中的各個頂點具體的坐標(biāo)值。可以假設(shè)已創(chuàng)建的地形幾何圖為一個方格棋盤,左上角的第一個頂點作為start,即第一個點,然后每隔每個單元間距,根據(jù)輸入的每行每列的頂點數(shù)逐行生成頂點,一直到達(dá)右下角的end即最后一個頂點為止。Terrian類使用的computerVertices成員函數(shù)就是根據(jù)上述過程進(jìn)行計算,通過計算就可以獲得每個頂點的x和z坐標(biāo)的定義,而每個頂點的y坐標(biāo)的值這要根據(jù)所加載的高度圖數(shù)據(jù)結(jié)構(gòu)中的相應(yīng)項來獲得。計算機要使用圖形中的每一個頂點,就必須為其添加索引,因此,需要為創(chuàng)建的地形圖的每一個頂點創(chuàng)建索引。為計算三角形柵格各頂點的索引,只需要從上述所說的start頂點至end,依次遍歷每一個地形幾何圖中的方格,并計算構(gòu)成每個方格的三角形面片的定點索引。對于一個第i行、第j列的方格中的兩三角形面片的頂點,通過通用公式:
△ABC ={i*每行頂點數(shù)+j,i*每行頂點數(shù)+j+1,(i+1)*每行頂點數(shù)+j}
△CBD={(i+1)*每行頂點數(shù)+j,i*每行頂點數(shù)+j+1,(i+1)*每行頂點數(shù)+j+1}
即可求得每個頂點的索引值。Terrian類中的computerIndices成員函數(shù)就是基于這樣的算法為幾何地形中的每個頂點添加的索引值。
2.3 對地形進(jìn)行紋理映射和光照處理
為了使創(chuàng)建的地形更加細(xì)致真實,需為創(chuàng)建的地形圖增加紋理和光照。Terrian類的紋理映射方式是加載一個已經(jīng)創(chuàng)建好的紋理文件,應(yīng)用其紋理數(shù)據(jù),使得最終的地形呈現(xiàn)出沙灘、草地或者雪山等有紋理文件決定的樣貌。在場景中,通過添加成員函數(shù)lightTerrian來實現(xiàn)光照。使用漫反射光照,來顯示地形明暗,使場景更加逼真。
3 三維拾取
拾取操作是指當(dāng)在屏幕上用鼠標(biāo)點擊某一個圖元時,應(yīng)用程序能返回改圖元的某些信息,拾取到圖元,也就意味著我們對拾取到的對象具有了控制權(quán)。當(dāng)鼠標(biāo)在屏幕上點擊一個物體想選中,這個點和3D世界中的物體分屬不同的空間,如何判斷顯示屏上的這個點就對應(yīng)著3D場景中的那個物體呢,拾取算法,就是完成這個判斷的。
3.1 坐標(biāo)轉(zhuǎn)換
描述好了幾何學(xué)上的3D場景和設(shè)置了虛擬照相機,我們就要把這個場景轉(zhuǎn)換成2D圖像顯示在顯示器上。在這個過程中,涉及到幾個坐標(biāo)系(空間)的轉(zhuǎn)換:自身坐標(biāo)系(建??臻g)--世界坐標(biāo)系--觀察坐標(biāo)系--投影窗口--顯示屏,分別通過世界變換、視圖變換、透視投影及視口變換實現(xiàn)轉(zhuǎn)換。經(jīng)過所有轉(zhuǎn)換,就完成了3D場景在顯示屏上可見。
3.2 拾取的實現(xiàn)
由拾取的定義可知,拾取算法的過程,其實就是坐標(biāo)系逆向轉(zhuǎn)換的過程。判斷的實質(zhì)是,從觀察坐標(biāo)系原點出發(fā),與經(jīng)轉(zhuǎn)換后的屏幕上的點,形成一條射線,若這條射線與物體三角網(wǎng)格相交,這說明拾取成功。
3.2.1 窗口的轉(zhuǎn)換
鼠標(biāo)點擊屏幕上的一個點,Windows API中的GetCursorPos函數(shù)會自動獲得該點的坐標(biāo),根據(jù)屏幕上的坐標(biāo),通過視口變換矩陣的逆矩陣得到投影窗口上的坐標(biāo)。
3.2.2 拾取射線的計算
在觀察坐標(biāo)系中,拾取射線是一條從觀察坐標(biāo)原點的發(fā)出的射線,因此,只要在確定一點就可以獲取這條射線在觀察坐標(biāo)系中的表示。我們假設(shè)這個點就是透視投影平截頭體近切面上的一點。此時,我們的這個點已經(jīng)通過變化到了投影窗口,通過GetTransform函數(shù),求得投影矩陣,根據(jù)投影坐標(biāo)=觀察坐標(biāo)*投影矩陣關(guān)系,求得該點在觀察坐標(biāo)系中坐標(biāo)。已知原點及線上一點,即可在觀察空間中求的拾取射線。
3.2.3 統(tǒng)一射線與物體的坐標(biāo)系
上述計算出的射線是在觀察坐標(biāo)系中,未完成相交,我們將射線與物體放在同一個坐標(biāo)系中,即世界坐標(biāo)系中。
3.2.4 射線與物體的相交運算
利用D3D提供的擴展函數(shù)D3DXIntersect函數(shù),即可完成相交測試。
4 結(jié)束語
3D游戲的引擎發(fā)展迅猛,為3D游戲提供了堅強的發(fā)展后盾,3D游戲也必將順應(yīng)市場需求,不斷地改進(jìn),做出更加酷炫的3D游戲。本文通過對3D地形繪制及拾取算法的簡短介紹,希望能夠?qū)ψx者了解3D游戲有所幫助。
參考文獻(xiàn):
[1] Frank D.Luna.Introduction to 3D Game Programming with DirectX 9.0[M].
[2] 透視投影變換理論推導(dǎo)[OL].http://www.scouvr.com//D3D/201102/33407_2.shtml.