




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、文檔從互聯(lián)網(wǎng)中收集,已重新修正排版,word格式支持編輯,如有幫助歡迎下載支持。HUNAN UNIVERSITY畢業(yè)設(shè)計(jì)(論文)設(shè)計(jì)論文題目:基于Direct3D的投籃游戲?qū)W生姓名: 學(xué)生學(xué)號(hào): 專業(yè)班級(jí): 學(xué)院名稱: 指導(dǎo)老師: 學(xué)院院長:何杰506 開發(fā)2班 軟件學(xué)院 申煜湘 林亞平2008年5月25日lword格式支持編借,如有幫助歡迎下載支持?;贒irect3D的投籃游戲摘要現(xiàn)在游戲已經(jīng)深入到人們的生活中,兒乎每個(gè)人都玩過至少一款游戲。隨著越來 越多的人關(guān)注游戲,當(dāng)今的游戲產(chǎn)業(yè)也成為潛力無窮的產(chǎn)業(yè)。與此同時(shí),游戲設(shè)計(jì)已經(jīng) 成為當(dāng)今許多玩家的夢(mèng)想。本設(shè)計(jì)就是基于DirectX技術(shù)的投籃
2、游戲設(shè)計(jì),采用Visual C+進(jìn)行編寫。DirectX 是Microsoft公司提供的U前比較普遍的Windows游戲設(shè)計(jì)開發(fā)工具(SDK)。它基本包 括了 2D、3D、聲音、控制、網(wǎng)絡(luò)等的基本操作函數(shù),使得程序員不必直接與硬件打交 道,大大地提高了游戲開發(fā)的簡易性和效率。本設(shè)計(jì)在Direct3D的基礎(chǔ)上,設(shè)計(jì)出了圖形渲染模塊,用戶界面模塊,物理模塊, 攝像機(jī)模塊等,并加以代碼實(shí)現(xiàn),實(shí)現(xiàn)了一個(gè)簡單的3D投籃游戲。關(guān)鍵字:游戲設(shè)計(jì),DirectX,投籃4Basketball game based on Direct3DAbstractNow games has gone deep into t
3、he people's lives, almost everyone played games With more and more people increasing interest in games, the game industry is becoming to be a developing industry. At the same time, game design has become the dream of many playersThis is a space shooting game design based on DirectX technology, u
4、sing Visual C+ in programming DirectX is a widely used game design and develop tool (SDK) which is supplied by Microsoft Corporation It basically covers the 2D, 3D, sound, control, and network, makes programmer without dealing directly with the hardware, greatly enhancing the simplicity and efficien
5、cy of the development of gameThis design is based on Direct3D, it has graphic render module, user interface module, physic module, camera module Then implement these modules by coding, so we have a simple basketball game.Keyword: Game Design. DirectX, Basketball1 緒論錯(cuò)誤!未定義書簽??谡n題背景錯(cuò)誤!未定義書簽。12國內(nèi)外研究現(xiàn)狀和發(fā)
6、展趨勢(shì)錯(cuò)誤!未定義書簽。13本文結(jié)構(gòu)錯(cuò)誤!未定義書簽。錯(cuò)誤!未定義書簽。2 技術(shù)原理2.1數(shù)學(xué)基礎(chǔ)知識(shí)錯(cuò)誤!未定義書簽。2.1.1 3D坐標(biāo)系錯(cuò)誤!未定義書簽。錯(cuò)誤!未定義書簽。錯(cuò)誤!未定義書簽。2.2 DIRECT3D基礎(chǔ)錯(cuò)誤!未定義書簽。221 Direct3D概述錯(cuò)誤!未定義書簽。222 Direct3D重要概念錯(cuò)誤!未定義書簽。223 Direct3D初始化錯(cuò)誤!未定義書簽。2.3基本3D流水線簡介錯(cuò)誤!未定義書簽。2.4 WIN32消息機(jī)制錯(cuò)誤!未定義書簽。3.系統(tǒng)設(shè)計(jì)錯(cuò)誤!未定義書簽。3功能設(shè)汁錯(cuò)誤!未定義書簽。3.2游戲邏輯的設(shè)計(jì)錯(cuò)誤!未定義書簽。3.3圖形繪制系統(tǒng)的設(shè)計(jì)錯(cuò)誤!未
7、定義書簽。3.4球體運(yùn)動(dòng)軌跡的設(shè)計(jì)錯(cuò)誤!未定義書簽。3.5游戲界面的設(shè)計(jì)錯(cuò)誤!未定義書簽。3.6得分判斷的設(shè)訃錯(cuò)誤!未定義書簽。3.6攝像機(jī)的設(shè)計(jì)錯(cuò)誤!未定義書簽。4實(shí)現(xiàn)方案錯(cuò)誤!未定義書簽。4主要功能模塊錯(cuò)誤!未定義書簽。4.2三維向量的實(shí)現(xiàn)錯(cuò)誤!未定義書簽。4.3圖形系統(tǒng)和WINDOWS消息循環(huán)的實(shí)現(xiàn)錯(cuò)誤!未定義書簽。4.4物理模塊的實(shí)現(xiàn)錯(cuò)誤!未定義書簽。4.5游戲界面的實(shí)現(xiàn)錯(cuò)誤!未定義書簽。4.6攝像機(jī)模塊的實(shí)現(xiàn)錯(cuò)誤!未定義書簽。丄7我製系統(tǒng)的實(shí)現(xiàn)錯(cuò)誤!未定義書簽。小結(jié)錯(cuò)誤!未定義書簽。5運(yùn)行效果錯(cuò)誤!未定義書簽。致謝錯(cuò)誤!未定義書簽。參考文獻(xiàn)錯(cuò)誤!未定義書簽。11課題背景我們生活在一個(gè)
8、充滿三維物體的三維世界中,為了使計(jì)算機(jī)能精確地再現(xiàn)這些物 體,我們必須能在三維空間描繪這些物體。我們乂生活在一個(gè)充滿信息的世界中,能否 盡快地理解并運(yùn)用這些信息將直接影響事業(yè)的成敗,所以我們需要用一種最直接的形式 來表示這些信息。最近兒年汁算機(jī)圖形學(xué)的發(fā)展使得三維表現(xiàn)技術(shù)得以形成,這些三維表現(xiàn)技術(shù)使我 們能夠再現(xiàn)三維世界中的物體,能夠用三維形體來表示復(fù)雜的信息,這種技術(shù)就是可視 化(Visualization)技術(shù)??梢暬夹g(shù)使人能夠在三維圖形世界中直接對(duì)具有形體的信息 進(jìn)行操作,和訃算機(jī)直接交流。這種技術(shù)已經(jīng)把人和機(jī)器的力量以一種直覺而自然的方 式加以統(tǒng)一,這種革命性的變化無疑將極大地提高人
9、們的工作效率??梢暬夹g(shù)賦予人 們一種仿真的、三維的并且具有實(shí)時(shí)交互的能力,這樣人們可以在三維圖形世界中用以 前不可想象的手段來獲取信息或發(fā)揮自己創(chuàng)造性的思維。機(jī)械丄程師可以從二維平面圖 中得以解放直接進(jìn)入三維世界,從而很快得到自己設(shè)計(jì)的三維機(jī)械零件模型。醫(yī)生可以 從病人的三維掃描圖象分析病人的病灶。軍事指揮員可以面對(duì)用三維圖形技術(shù)生成的戰(zhàn) 場(chǎng)地形,指揮具有真實(shí)感的三維飛機(jī)、軍艦、坦克向日標(biāo)開進(jìn)并分析戰(zhàn)斗方案的效果。更令人驚奇的是LI前正在發(fā)展的虛擬現(xiàn)實(shí)技術(shù),它能使人們進(jìn)入一個(gè)三維的、多媒 體的虛擬世界,人們可以游歷遠(yuǎn)古時(shí)代的城堡,也可以遨游浩翰的太空。所有這些都依賴 于計(jì)算機(jī)圖形學(xué)、計(jì)算機(jī)可
10、視化技術(shù)的發(fā)展。隨著三維技術(shù)的進(jìn)步,對(duì)于普通電腦用戶最大的感受就是電腦游戲的發(fā)展了,如今 游戲的畫面基本上全部都是3D化,在游戲市場(chǎng)的巨大利益推動(dòng)下,游戲開發(fā)商和硬件 廠商不斷推陳出新,技術(shù)的發(fā)展可以用一日千里來形容。1.2國內(nèi)外研究現(xiàn)狀和發(fā)展趨勢(shì)目前游戲開發(fā)采用的主要有OpenGL與DirectX兩種圖形庫。U前的游戲引擎都是 基于這兩種圖形庫來實(shí)現(xiàn)圖形的渲染。OpenGL是在SGI等多家世界聞名的計(jì)算機(jī)公司的倡導(dǎo)下,以SGI的GL三維圖形 庫為基礎(chǔ)制定的一個(gè)通用共事的開放式三維圖形標(biāo)準(zhǔn)。tl前,包括Microsoft. SGI. IBM、 DEC、SUN、HP等大公司都釆用了 OpenGL
11、做為三維圖形標(biāo)準(zhǔn),許多軟件廠商也紛紛 以O(shè)penGL為基礎(chǔ)開發(fā)出自己的產(chǎn)品。OpenGL U前版本為2.0,支持可編程渲染管線。DirectX是伴隨著視窗操作系統(tǒng)的推出而出現(xiàn)的,DirectX的原名為DirectX SDK(或 Game SDK ),英文原意:DirectX Software Development Kit,是微軟所開發(fā)出的一套主要 用在設(shè)計(jì)多媒體、2D、3D游戲及程序的API ,其中包含了各類與制作多媒體功能相 關(guān)的組件(Component),各個(gè)組件提供了許多處理多媒體的接口與方法。從這點(diǎn)介紹我 們可以領(lǐng)會(huì)到DirectX是為游戲而誕生,從DirectX 1.0到Direc
12、tX3.0,微軟讓它的DirectX 開始在游戲領(lǐng)域樹立起3D的標(biāo)桿,盡管當(dāng)時(shí)的3D很粗糙,但是雛形已初步形成,到 DirectX7開始,隨著OpenGL和Glide勢(shì)力日漸衰弱,DirectX的霸氣初現(xiàn),到DirectX8 發(fā)布后,DirectX已經(jīng)在3D游戲領(lǐng)域樹立起它的的權(quán)威地位,引人的Ps和Vs的出現(xiàn)令 OpenGL和Glide自嘆不如,DirecetX9.0,更是如日中天,權(quán)威地位無人能撼動(dòng)。LI前 DirectX在桌面游戲方面更受開發(fā)者的歡迎。LI前版本為10.0。13本文結(jié)構(gòu)本文分為五章,第一章為緒論。第二章為技術(shù)原理,主要簡單介紹本設(shè)計(jì)中用到的 一些基本原理。第三章為系統(tǒng)設(shè)計(jì),
13、主要講解系統(tǒng)的設(shè)計(jì)方案。笫四章為系統(tǒng)的實(shí)現(xiàn)方 案,講解系統(tǒng)的具體實(shí)現(xiàn)。第五章展示系統(tǒng)的運(yùn)行效果。2. 技術(shù)原理2.1數(shù)學(xué)基礎(chǔ)知識(shí)兒何學(xué)中,我們用有向線段表示向量,向量的兩個(gè)屬性是它的長度和它的頂點(diǎn)所指 的方向,因此,可以用向量來模擬既有大小乂有方向的物理模型。向量為在3維空間中 表示方向提供了方便.2.1.1 3D坐標(biāo)系3D坐標(biāo)系中使用最廣泛的是笛卡爾坐標(biāo)系,它基于空間中三條相互垂直的坐標(biāo) 軸:X軸、Y軸和Z軸。要定義空間中的一個(gè)點(diǎn)P,需要三個(gè)坐標(biāo):X,Y, Z寫成P(X,Y, Z)。 三個(gè)坐標(biāo)軸構(gòu)成三個(gè)平面:X-Y平面、X-Z平面和Y-Z平面。這三個(gè)平面將整個(gè)空間分成 8個(gè)子空間,在3D笛卡
14、爾坐標(biāo)系中共有8個(gè)卦限。圖2.1.1左手坐標(biāo)系3D笛卡爾坐標(biāo)系包括左手坐標(biāo)系和右手坐標(biāo)系兩種。左手坐標(biāo)系(LHS)假設(shè)X-Y 為紙張上或屏幕上的水平軸和垂直軸,正Z軸指向紙內(nèi)或屏幕內(nèi)。右手坐標(biāo)RHS)假 設(shè)X-Y為紙張上或屏幕上的水平軸和垂直軸,正Z軸指向紙外或屏幕外。1 向量相等兒何學(xué)上,有同樣方向和長度的兩個(gè)向量相等。數(shù)學(xué)上,我們說有同樣維數(shù)和分量 的向量相等。例如:如果vx, uy = vy,且uz = vz那么uy, uz) = (vx, vy, vz)o在代 碼中我們能夠用判斷兩個(gè)向量相等。同樣的,我們也能用"!二”判斷兩個(gè)向量 不相等。2. 向量的模兒何學(xué)上,向量的大小是
15、有向線段的長度。知道向量的分量,利用下面的公式我們 就能汁算出向量的大小。圖向量的模Hull表示向量u的長度。3. 標(biāo)準(zhǔn)化向量標(biāo)準(zhǔn)化向量是讓向量的大小等于1,即被叫作單位向量。我們能利用向量大小以及 各個(gè)分量把一個(gè)向量標(biāo)準(zhǔn)化,就象這樣:圖標(biāo)準(zhǔn)化向量我們這樣表示單位向量0。4. 向量相加我們能夠通過分別把兩個(gè)向量的各個(gè)分量相加得到向量之和,注意在相加之前必須 保證它們有相同的維數(shù)。圖向量相加下圖顯示的是兒何學(xué)上的向量相加。圖兒何上的向量相加5. 向量相減和加法類似,通過分別把兩個(gè)向量的各個(gè)分量相減得到向量之差。再次重聲兩個(gè)向 量必須是相同維數(shù)。圖向量相減下圖顯示的是兒何學(xué)上的向量相減。圖兒何上的
16、向量相減6. 數(shù)乘我們能用一個(gè)標(biāo)量與向量相乘,就象名字暗示的一樣,向量按比例變化。這種運(yùn)算 不會(huì)改變向量的方向,除非標(biāo)量是負(fù)數(shù),這種情況向量方向相反。圖向量數(shù)乘7. 點(diǎn)乘數(shù)學(xué)上定義點(diǎn)積是兩個(gè)向量的乘積。按下面等式計(jì)算:圖向量點(diǎn)乘上面的等式不能很明顯的體現(xiàn)兒何上的意義。利用余弦定律,我們能夠發(fā)現(xiàn)它們的 關(guān)系。u - v=lullvlcos6,表示兩個(gè)向量的點(diǎn)積是它們的模和夾角的余弦之積。因此,如果 U和V都是單位向量,那么uv就是它們夾角的余弦。一些點(diǎn)積中有用的特性:假如IJ v = 0,那么11丄v。假如uv > 0,那么兩個(gè)向量的角度0小于90度。假如uv v 0,那么兩個(gè)向量的角度0
17、大于90度。8. 叉乘第二種乘法在向量數(shù)學(xué)中叫義積。不象點(diǎn)積,結(jié)果值是一個(gè)標(biāo)量,義積的結(jié)果值是 另一個(gè)向量。通過把兩個(gè)向量U和V相乘得到另一的向量P,向量P垂直于U和V。也 就是說向量p垂直于U并且垂直于U。十字相乘就象這樣計(jì)算:圖向量義乘如果u-v = 0,那么u丄V。同樣的如果j k = 0并且j.i = O那么我們便能知道J既 垂直于k又垂直于i的。當(dāng)我們?cè)诰幊虝r(shí),通常都使用4x4矩陣來進(jìn)行矩陣變換。因?yàn)橄旅嫠懻摰木仃囎?換都是基于4x4矩陣的。1. 矩陣相乘矩陣相乘在3D汁算機(jī)圖形學(xué)中是非常重要的運(yùn)算。通過矩陣相乘,我們能變換向量 并且,將不同向量轉(zhuǎn)換到一起。為了得到矩陣之積AB,
18、A的列數(shù)必須等于B的行數(shù)。假如這個(gè)條件不滿足,就不 能相乘??紤]兩個(gè)矩陣,A和B,分別是2x3和3x3,我們看乘積AB是可以計(jì)算的,因?yàn)锳的列數(shù)等于B的行數(shù)。注意乘積BA,它們是 不能計(jì)算的,因?yàn)锽的列數(shù)不等于A的行數(shù)。由此說明:一般情況下矩陣乘法不滿足 乘法交換律(也就是,ABWBA)。我們說“一般不可交換”因?yàn)橛幸恍┚仃嚦朔ǖ膶?shí)例 還是可以的。知道了矩陣乘法的計(jì)算方法,現(xiàn)在我們就能給出精確的定義:假如A是一個(gè)加X”的 矩陣,B是一個(gè)必“的矩陣,那么它們之積AB可計(jì)算并且是一個(gè)“旳的矩陣C,C的成員 ij等于A的第i個(gè)與B的第j個(gè)相乘:圖矩陣乘法2. 矩陣平移通過與一個(gè)特定的矩陣相乘來達(dá)到矩
19、陣平移的U的。例如有向量(x,y, z, m),將其沿x軸移動(dòng)dx個(gè)單位,沿y軸移動(dòng)dy個(gè)單位,沿z軸 移動(dòng)dz個(gè)單位,只需將其與下面矩陣相乘。圖平移矩陣3. 矩陣旋轉(zhuǎn)例如向量(x,y, z, m)圉繞x軸旋轉(zhuǎn)0弧度,只需與下面矩陣相乘:圖x軸旋轉(zhuǎn)矩陣當(dāng)要圍繞y軸旋轉(zhuǎn)0弧度,只需與下面矩陣相乘圖y軸旋轉(zhuǎn)矩陣當(dāng)要用繞z軸旋轉(zhuǎn)B弧度,只需與下面矩陣相乘圖z軸旋轉(zhuǎn)矩陣4. 矩陣縮放通過矩陣相乘可以實(shí)現(xiàn)矩陣縮放例如向量(x,y,z,m),沿x軸縮放dx個(gè)單位,沿y軸縮放dy個(gè)單位,沿z軸縮放dz個(gè)單位,只需將其與下面矩陣相乘。圖縮放矩陣2.2 Direct3D 基礎(chǔ)2.2.1 Direct3D 概述D
20、irect 3D 是一種低層圖形 API( Application Programming Interface,應(yīng)用程序接 口),它 能讓我們利用3D硬件加速來渲染3D世界。我們可以把Direct3D看作是應(yīng)用程序和圖 形設(shè)備(3D硬件)之間的中介。通過利用Direct3DAPI編程,能夠屏蔽許多底層實(shí)現(xiàn)的技 術(shù)細(xì)節(jié),縮短開發(fā)周期。下圖顯示了 Direct3D,H AL(Hardware Abstraction Layer,硬件抽 象層)及硬件之間的關(guān)系。其中HAL即硬件抽象層,是一組指示設(shè)備執(zhí)行某種操作的特 殊設(shè)備代碼的集合,山設(shè)備制造商實(shí)現(xiàn),Direct3D不能直接作用于圖形設(shè)備,通過使用
21、 HAL與硬件圖形設(shè)備協(xié)同工作。如下圖所示,Direct3D應(yīng)用程序最終通過圖形卡的設(shè)備 驅(qū)動(dòng)程序訪問圖形硬件。曲于HAL存在,Direct3D將可以不需要了解某個(gè)設(shè)備的具體 硬件特性,使它能夠獨(dú)立于硬件設(shè)備。Direct3D提供了相應(yīng)的方法在運(yùn)行時(shí)檢查設(shè)備是 否能執(zhí)行某項(xiàng)操作。圖 2.2 Direct3D 層次2.2.2 Direct3D 重要概念1. 頂點(diǎn):一個(gè)場(chǎng)景是多個(gè)物體或模型的集合。一個(gè)物體可以用三角形網(wǎng)格來近似表 示,3D世界中最基本的圖元就是三角形,一個(gè)多邊形的兩邊相交的點(diǎn)叫做頂點(diǎn)。為了 描述一個(gè)三角形,我們通常指定三個(gè)點(diǎn)的位置來對(duì)應(yīng)三角形的三個(gè)頂點(diǎn),這樣我們就能 夠很明確的表示
22、出這個(gè)三角形。3D物體中的三角形經(jīng)常會(huì)有許多共用頂點(diǎn)。為了解決 復(fù)雜精細(xì)場(chǎng)景重復(fù)頂點(diǎn)占用更多的渲染帶寬,我們?cè)趧?chuàng)建一個(gè)頂點(diǎn)列表的同時(shí)也創(chuàng)建一 個(gè)索引列表。頂點(diǎn)列表包含所有不重復(fù)的頂點(diǎn),索引列表中則用頂點(diǎn)列表中定義的值來 表示每一個(gè)三角形的構(gòu)造方式。通常每個(gè)頂點(diǎn)都包含如下信息:x,y,z坐標(biāo)值、顏色值、 用于計(jì)算燈光的法線和紋理坐標(biāo)(u, V)。2. 表面:是一個(gè)像素點(diǎn)陣,主要用來存儲(chǔ)2D圖形數(shù)據(jù)。表面數(shù)據(jù)就像一個(gè)矩陣,像 素?cái)?shù)據(jù)實(shí)際上是存儲(chǔ)在線性數(shù)組里面。Direct3D里面的IDirect3DSurface9接口用來描述 表面,這個(gè)接口提供一些方法來直接操作表面數(shù)據(jù)。3. 多重采樣(Mult
23、iSampling) :|11于使用像素來表示圖像,在顯示時(shí)會(huì)出現(xiàn)鋸齒狀。 MultiSampling就是使圖像變得平滑的技術(shù)。它的最普通的用法就是全屏抗鋸齒。 D3DMULTISAMPLE_TYPE枚舉類型能使我們制定全屏抗鋸齒的質(zhì)量等級(jí)。4. 交換鏈和頁面交換:Direct3D通常建立2-3個(gè)頁面組成一個(gè)集合,即為交換鏈,通 常山IDirect3DSwapChain接口來表示。交換鏈和頁面交換技巧被用在使兩幀動(dòng)畫之間過 渡更加平滑。通常山Direct3D自己去管理。5. 深度緩沖:深度緩沖是一個(gè)表面,但它不是用來存儲(chǔ)圖像數(shù)據(jù)而是用來記錄像素的 深度信息。深度緩沖為每一個(gè)像素訃算深度值,并進(jìn)
24、行深度測(cè)試。通過深度測(cè)試我們可 以知道哪個(gè)像素離攝像機(jī)近從而把它畫出來。這樣就可以只繪制最幕近攝像機(jī)的像素, 被遮住的像素就不會(huì)被畫出來。6. 頂點(diǎn)處理:頂點(diǎn)是3D圖形學(xué)的基礎(chǔ),它能夠通過兩種不同的方法來處理,一種是: 軟件頂點(diǎn)處理(Software Vertex Processing),:種是:硬件頂點(diǎn)處理(Hardware Vertex Processing)o前者總是被支持而且永久可用,后者要顯卡硬件支持頂點(diǎn)處理才可用。使 用硬件頂點(diǎn)處理總是首選,因?yàn)樗溶浖绞礁欤也徽加肅PU資源。如果一塊 顯卡支持硬件頂點(diǎn)處理的話,也就是說它支持硬件兒何變換和光照計(jì)算。7. 設(shè)備能力:Dire
25、ct3D支持的每一種特性都對(duì)應(yīng)于D3DCAPS9結(jié)構(gòu)的一個(gè)數(shù)據(jù)成員, 初始化一個(gè)D3DCAPS9實(shí)例應(yīng)該以你的設(shè)備實(shí)際支持的特性為基礎(chǔ)。因此,在我們的 應(yīng)用程序里,我們能夠通過檢測(cè)D3DCAPS9結(jié)構(gòu)中相對(duì)應(yīng)的某一成員來檢測(cè)設(shè)備是否 支持這一特性。2.2.3 Direct3D 初始化初始化步驟:1. 獲得IDirect3D9接口指針。2. 檢查設(shè)備的技術(shù)特性,確定顯卡是否支持碩件頂點(diǎn)處理。3. 初始化一個(gè)D3DPRESENT_PARAMETER結(jié)構(gòu)實(shí)例,這個(gè)結(jié)構(gòu)包含了許多數(shù)據(jù)成 員,它允許我們指定將要?jiǎng)?chuàng)建IDirect3DDevice9接口的特性。4. 創(chuàng)建一個(gè)基于已經(jīng)初始化好了的D3DPRE
26、SENT_PARAMETER結(jié)構(gòu)的 IDirect3DDevice9 對(duì)象。2. 3基本3D流水線簡介大家都知道,一個(gè)3D場(chǎng)景中,我們見到的任何光輝燦爛的物體,都是由一個(gè)一個(gè) 面片組成的。而裝載面片位置信息的就是其各個(gè)定點(diǎn)的三維坐標(biāo)。這是用來在模型中存 儲(chǔ)的,而要把物體顯示在屏幕上,還需要將它們轉(zhuǎn)換成顯示器上的二維坐標(biāo)。這就需要 對(duì)每個(gè)點(diǎn)實(shí)施一套3 to 2的轉(zhuǎn)換公式,在Direct3D中叫做“兒何流水線” (Geometry Pipeline) oDirect3D 中的 Geometry Pipeline 如下圖所示:圖2.3.1 3D流水線每渲染一幀,我們都要用到這條流水線把所有定點(diǎn)的坐標(biāo)
27、轉(zhuǎn)化成當(dāng)前要顯示的位置。 不過放心,D3D不會(huì)改變你原有的頂點(diǎn)坐標(biāo),變換出的頂點(diǎn)數(shù)據(jù)會(huì)存放在新的地方用來 渲染。想一想物體,也就是面片,也就是頂點(diǎn)要顯示在屏幕上,其位置取決于什么呢? 首先它一定取決于該點(diǎn)在場(chǎng)景中的位置,然后還在于你從什么角度看,更詳細(xì)一點(diǎn)就是 我的眼睛在哪兒,我注視著哪兒,以及我的視野寬窄等等。對(duì)于每個(gè)獨(dú)立被引入程序的mesh物體,它們的坐標(biāo)系、坐標(biāo)原點(diǎn)理論上都應(yīng)該是不 同的,其頂點(diǎn)也都是用局部坐標(biāo)表示的。那么要做統(tǒng)一的變換,首先應(yīng)將它們引入到同 一個(gè)坐標(biāo)系下,也就是我們稱之為“世界坐標(biāo)系”的坐標(biāo)。這個(gè)變換也因此得名世界變換 (World Transform)。對(duì)物體所需要做
28、的移動(dòng)、旋轉(zhuǎn)等工作也是要在此時(shí)完成的。經(jīng)過了以上一些操作后,每個(gè)頂點(diǎn)(也就是每個(gè)物體)在整個(gè)場(chǎng)景中的位置就如你 所愿確定下來了。要把它們映射到屏幕上,還要確定觀察者(你可以叫他玩家、攝影機(jī) 都無所謂)的位置和視角。我們是要把所有的點(diǎn)變換到新建立的以觀察者為基準(zhǔn)的坐標(biāo) 系下。這個(gè)步驟就是“視圖變換”(View Transform)。實(shí)際上和后面要說的射影變換相 比,這兩種變換并沒有什么本質(zhì)區(qū)別。有時(shí)候?yàn)榱诵剩梢园咽澜缱儞Q與視圖變換合 并為一個(gè)世界視圖變換。這不就是說你一開始就選擇觀察者的位置為世界坐標(biāo)系的 原點(diǎn),并按照視角來確定坐標(biāo)軸么?后面一步是"射影變換”(Projection
29、 Transform) o實(shí)際上,我們要做的所有坐標(biāo)轉(zhuǎn)換 歸根結(jié)蒂是要把三維的點(diǎn)投影到二維的屏幕上,如圖所示圖2.3.2射影變換經(jīng)過上述兩次坐標(biāo)轉(zhuǎn)換后,我們已經(jīng)讓屏幕平行于坐標(biāo)軸平面了,也就是說,經(jīng)過 一些比例范圉的調(diào)整,理論上我們能從點(diǎn)的三維坐標(biāo)中的某兩個(gè)直接得到期待已久的屏 幕坐標(biāo)。但是別急,此時(shí)得到的坐標(biāo)繪出的圖就像我們小時(shí)候畫的那些畫一樣沒有 立體感。比如上圖那個(gè)矩形,因?yàn)榻筮h(yuǎn)小,在我們的視野中應(yīng)該看起來像個(gè)梯形。但 是如果我們不做任何處理就直接把它的頂點(diǎn)(已經(jīng)過前兩重變換)投影到顯示器上(假 設(shè)平行于圖中的XY平面)這樣還是一個(gè)方方正正的矩形。想象一下,投影實(shí)際上就是把空間中的所有
30、點(diǎn)都?jí)罕?,扁到某一個(gè)平面上。這樣出 來的圖形自然不會(huì)有透視效果。(之所以有近大遠(yuǎn)小是因?yàn)槿搜鄣耐雇哥R成像,其像高 是物距的減函數(shù)。這里不多說了)你可能想到讓每個(gè)點(diǎn)像這樣斜著投影,但是仔細(xì)想想, 如何斜著投影呢?等你想明口了再回答這樣做真的方便么?于是另一種辦法就是把整 個(gè)空間范圍變成一個(gè)棱臺(tái)(里面的點(diǎn)隨之進(jìn)行放縮)。圖2.3.3投影效果相對(duì)來說把較遠(yuǎn)端縮小會(huì)造成數(shù)據(jù)的不準(zhǔn)確,因此采用放大較近端。對(duì)每個(gè)點(diǎn),我 們進(jìn)行最后一步變換就是根據(jù)其遠(yuǎn)近程度進(jìn)行一下放縮。D3D把剪切也納入此流水線中,盡管它沒對(duì)頂點(diǎn)作任何變換,只是剔出那些不用的 點(diǎn)。以上就是D3D中的兒何流水線。幸運(yùn)的是,我們并不需要自己去
31、寫代碼來完成這些轉(zhuǎn) 換。實(shí)際上我們只需要設(shè)計(jì)好參數(shù),調(diào)用相應(yīng)的D3D函數(shù)設(shè)置上面提到的各種決定因 素,它會(huì)在渲染畫面的時(shí)候把侮個(gè)頂點(diǎn)自動(dòng)轉(zhuǎn)化成所需的屏幕坐標(biāo)的。正因?yàn)檫@一套流 水線操作的通用性和規(guī)范性,各種3D渲染引擎都將它封裝了,而當(dāng)代很多先進(jìn)的顯卡 都將其固化到硬件線路上,這樣大大提高了渲染速度。下面我們來看看一些具體的實(shí)施。在計(jì)算機(jī)圖形學(xué)中,坐標(biāo)的變換通常是通過與一個(gè)矩 陣(Matrix)相乘來實(shí)現(xiàn)的?;咀儞Q包括平移、縮放、旋轉(zhuǎn)都用此方法完成,其他任 何的變換,包括不同坐標(biāo)系之間的互化,也都是通過這三種基本轉(zhuǎn)換完成的。因此說, Matrix無處不在,在我們的周圍,就在這間屋子里。你能在
32、窗戶往外看到它,在電視里 看到它。具體到三維坐標(biāo)系中,定義某點(diǎn)的坐標(biāo)為(X,Y,Z)則用(X,Y,乙W)乘以一個(gè)相應(yīng) 的4X4矩陣就可以得到新的坐標(biāo)(XYZW),這里的W自有用處,一般是1。還有一 點(diǎn)很重要,一個(gè)矩陣就代表著一重變換,而兒個(gè)矩陣的乘積就代表著多重變換的合變換。那么在這條流水線中,按規(guī)范我們至少需要三個(gè)矩陣來實(shí)現(xiàn)以上三步變換,也就是世界 矩陣(World Matrix)、視矩陣(View Matrix)以及射影矩陣(Projection Matirx)o世界矩陣有時(shí)候需要我們自己填寫,根據(jù)我們的各種變換需要來填寫一個(gè)D3DXMATRIX結(jié)構(gòu)體(其成員就是各行各列的數(shù)值),之后通過
33、調(diào)用IDirect3DDevice9:SetTransform( D3DTRANSFORMSTATETYPE State,CONSTD3DMATRIX *pMatrix )設(shè)置世界矩陣為你填好的那個(gè)。參數(shù)意義如下:D3DTRANSFORMSTATETYPE State代表你要設(shè)置的變換類型。D3DTS_WORLD,D3DTS_VIEW, D3DTS_PROJECTION 分 別表示要射知識(shí)界、視圖、射影三種變換CONST D3DMATRIX *pMatrix指向一個(gè)矩陣結(jié)構(gòu)的指針,就是你所要用到的矩陣。后面的兩個(gè)矩陣也要通過此函數(shù)設(shè)置。D3D中,三個(gè)變換矩陣是要存放在固定位置的, 每次執(zhí)行流水
34、線,D3D就依次從這三個(gè)位置讀取矩陣信息,并乘以所有的點(diǎn),得到新的 點(diǎn)的坐標(biāo),這個(gè)過程是不用我們操心的。我們調(diào)用SetTransform()就是要把填充好的矩 陣放進(jìn)這三個(gè)位置中的某一個(gè),第一個(gè)參數(shù)表示了哪一個(gè)。在設(shè)置視矩陣時(shí),我們先要很清楚地(在腦子里或紙上)建立好“視坐標(biāo)系”。這個(gè)坐標(biāo) 系以觀察著為原點(diǎn),沿著視線方向(觀察著注視點(diǎn)方向)為縱深方向(也就是Z軸 方向)。僅有兩個(gè)點(diǎn)還不足以確定一個(gè)三維坐標(biāo)系,我們還需要一個(gè)參考點(diǎn),能與另兩 個(gè)點(diǎn)構(gòu)成某一個(gè)坐標(biāo)平面。這樣的坐標(biāo)系構(gòu)件起來后,就可以根據(jù)兩個(gè)坐標(biāo)系的變換填 充視矩陣了。D3D提供了函數(shù)D3DXMATRIX *D3DXMatrixLoo
35、kAtLH(D3DXMATRIX *pOut,CONST D3DXVECTOR3 *pEye,CONST D3DXVECTOR3 *pAt,CONST D3DXVECTOR3 *pUp);或D3DXMATRIX *D3DXMatrixLookAtLH(參數(shù)同),區(qū)別僅在于前者用于左手系而 后者用于右手系。該函數(shù)自動(dòng)填充一個(gè)矩陣,參數(shù)依次是將要填充的矩陣以及上面說到 的三個(gè)點(diǎn),這里三個(gè)點(diǎn)構(gòu)成視坐標(biāo)系的YoZ平面。別忘了調(diào)用SetTransform()把這個(gè)矩 陣交給D3D。經(jīng)過上一步被統(tǒng)一了坐標(biāo)的各個(gè)頂點(diǎn)將被這個(gè)矩陣轉(zhuǎn)到視坐標(biāo)中。第三步要將點(diǎn)乘上一個(gè)射影矩陣,這個(gè)矩陣將越近的點(diǎn)放得越大。填充這個(gè)
36、矩陣我們用 函數(shù)D3DXMATRIX *D3DXMatrixPerspectiveFovLH(D3DXMATRIX *pOut,FLOAT fovY,FLOAT Aspect,FLOAT zn,FLOAT zf);或 D3DXMATRIX *D3DXMatrixPerspectiveFovLH,區(qū)別同上面一樣。第一個(gè)參數(shù)仍然 是輸出矩陣。第二個(gè)描述了在Y軸上的視角,弧度制表示,可以想象,視角越大,近端 被抻拉的比例就越大。下一個(gè)參數(shù)是視圖區(qū)的長寬比。后面兩個(gè)參數(shù)就是最近視平面和 最遠(yuǎn)視平面的位置,用它們的Z坐標(biāo)(Z坐標(biāo)的值在射影變換前后是不變的)表示。這 兩個(gè)平面的意義將在下一步說到。最后說一
37、下這條流水線的倒數(shù)第一步剪切。剪切就是把理論上根本不該看到的點(diǎn)從 渲染元中剔除掉(這里不包括因遮擋關(guān)系產(chǎn)生的圖形的剪切以及隱面消除),用過 DirectDraw的朋友很容易想到屏幕范圍以外的就是這樣的點(diǎn)。在3D世界里,還存在一 個(gè)最近視平面和一個(gè)最遠(yuǎn)視平面,它們共同組成了一個(gè)視圖截錐(Viewing Frustum)。 對(duì)于這個(gè)東西,微軟有個(gè)很好的說法:就好像你在一間黑屋子里向外看,窗戶的四個(gè)邊 圈定了視圖范禺,并且窗戶所在平面之前的物體是看不見的(黑屋子里的東西是看不見 的),窗戶所在的平面就是最近視平面;而且我們并不能看到無限遠(yuǎn),總要有個(gè)最遠(yuǎn)視 平面。這六個(gè)平面視可以根據(jù)需要設(shè)定的,它們組
38、成了視截錐下圖中的藍(lán)色范圍。圖2.3.4視圖截錐可以想象,剛才進(jìn)行的射影變換也可以說是把視圖截錐這個(gè)棱臺(tái)擠壓成長方體的過程。 讀者還能發(fā)現(xiàn),上述D3DXMatrixPerspectiveFovLH( )fl<J參數(shù)實(shí)際上是描述視截錐的。你 會(huì)覺得這個(gè)藍(lán)色的東西很有用,它與射影變換以及剪切都有著異常緊密的聯(lián)系。2.4 Win32消息機(jī)制而Windows的驅(qū)動(dòng)方式是事件驅(qū)動(dòng),就是不山事件的順序來控制,而是山事件的發(fā) 生來控制,所有的事件是無序的,所為一個(gè)程序員,在你編寫程序時(shí),你并不知道用戶 先按哪個(gè)按紐,也不知道程序先觸發(fā)哪個(gè)消息。你的任務(wù)就是對(duì)正在開發(fā)的應(yīng)用程序要 發(fā)出或要接收的消息進(jìn)行
39、排序和管理。事件驅(qū)動(dòng)程序設(shè)訃是密切圍繞消息的產(chǎn)生與處理 而展開的,一條消息是關(guān)于發(fā)生的事件的消息。C語言編程至少有一個(gè)主程序,其名字是main()o Windows程序則至少兩個(gè)主程序, 一個(gè)是WinMain()另一個(gè)是窗口過程函數(shù)WndProc(),Windows應(yīng)用程序的編程就圍繞這 兩個(gè)部份進(jìn)行的。其中WinMain函數(shù)為應(yīng)用程序的入口點(diǎn),它的名字一定要是WinMaino在Windows中,應(yīng)用程序通過要求Windows完成指定操作,而承擔(dān)這項(xiàng)通信任務(wù)的 API函數(shù)就是Windows的相應(yīng)窗口函數(shù)WndProco在dos里,程序能直接控制事件的發(fā) 生順序,結(jié)果等。而在Windows里,應(yīng)
40、用程序不直接調(diào)用任何窗口函數(shù),而是等待 Windows調(diào)用窗口函數(shù),請(qǐng)求完成任務(wù)或返回信息。為保證Windows調(diào)用這個(gè)窗口函 數(shù),這個(gè)函數(shù)必須先向Windows登記,然后在Windows實(shí)施相應(yīng)操作時(shí)回調(diào),所以窗 口函數(shù)乂稱為回調(diào)函數(shù)。WndProc是一個(gè)主回調(diào)函數(shù),Windows至少有一個(gè)回調(diào)函數(shù)。Win32程序都包含以下兒個(gè)部分:(一)建立,注冊(cè)窗口類(二)創(chuàng)建窗口(三)顯示和更新窗口 (四)創(chuàng)建消息循環(huán).(五)終止應(yīng)用程序.(六)窗口過程.(七)處理消息.353. 系統(tǒng)設(shè)計(jì)3.1功能設(shè)計(jì)系統(tǒng)為3D投籃游戲,通過鍵盤輸入來判斷球體是否投入籃筐,投入籃筐則得分加 -o游戲中有三個(gè)位置來進(jìn)行
41、投籃,在每個(gè)位置投籃次數(shù)達(dá)到一定數(shù)時(shí)則切換一下位置, 投籃機(jī)會(huì)用完后則顯示總得分,同時(shí)游戲結(jié)束。3. 2游戲邏輯的設(shè)計(jì)一個(gè)典型的3D游戲主程序的偽代碼如下:int main()Direct3D初始化;初始化游戲中所需要的設(shè)備;處理所有的消息;while (1)處理用戶的輸入;更新物體的位置;渲染處理;)其中更新物體位置信息的偽代碼如下:UpdateObjects()for(每一個(gè)物體)保存物體的當(dāng)前位置;根據(jù)控制輸入或者已有邏輯計(jì)算新的位置;if(新位置不可用或者發(fā)生碰撞)將新位置設(shè)置當(dāng)前位置)本系統(tǒng)設(shè)計(jì)在Win32消息循環(huán)中實(shí)現(xiàn)游戲的邏輯。本系統(tǒng)的邏輯流程如圖:3. 3圖形繪制系統(tǒng)的設(shè)計(jì)假如
42、你想通過手工指定頂點(diǎn)來創(chuàng)建你自己的3D物體,你能,不用懷疑,不過這是非 ??菰锓ξ兜氖虑?。為了減輕建造3D物體數(shù)據(jù)的匸作,專門的應(yīng)用程序已經(jīng)被開發(fā)出 來了,我們把它們叫做3D建模工具。它們?cè)试S我們?cè)谝粋€(gè)虛擬的擁有豐富工具的交互 環(huán)境下建造復(fù)雜的真實(shí)的mesh,在這建造這些模型都是非常容易的。例如在游戲開發(fā) 中常用到的有3DSMaxightWave 3D,以及Maya。這些工具,當(dāng)然能夠輸出創(chuàng)建好的mesh數(shù)據(jù)到文件中。因此,我們也能夠?qū)懸粋€(gè)文件 來提取在我們的3D應(yīng)用程序中要用到的mesh數(shù)據(jù)。這的確是一種可行的解決辦法。 不過,還存在一個(gè)更方便的解決方案。它是一種叫做X文件的特殊mesh文件
43、格式(擴(kuò) 展名為.X)。很多3D建模軟件都能輸出這種格式,當(dāng)然這里存在一個(gè)將其他流行的mesh 文件轉(zhuǎn)換為X文件的過程。是什么使X文件這么便利呢?因?yàn)樗荄irectX定義的格式, 并且D3DX庫很容易地支持X文件。D3DX庫提供了讀和寫X文件的函數(shù)。因此,如 果我們使用這種格式就避免了還要自己寫程序文件來讀/寫模型文件了游戲也采用X文件來進(jìn)行場(chǎng)景的繪制,由于籃球場(chǎng)場(chǎng)景是一個(gè)復(fù)雜的兒何體,我 們可以采用3D建模軟件3ds Max來進(jìn)行場(chǎng)景的建模,然后使用插件將模型從3ds Max 中導(dǎo)出為X文件。我們使用名為PandaDXExport的3ds Max插件將模型導(dǎo)出。如下圖所示:圖3.2 X文件
44、的導(dǎo)出導(dǎo)出后的模型包含了網(wǎng)格,材質(zhì)和貼圖等信息,我們要在程序中使用模型,就需要 把模型文件所包含的信息按文件格式載入內(nèi)存,在將其在程序中渲染出來。Direct3D庫提供了很多支持X文件的函數(shù),所以使用Direct3D可以很方便地使用X 文件。我們可以設(shè)計(jì)一個(gè)專門的模塊來對(duì)X文件進(jìn)行操作,根據(jù)分析可以得到模塊的兒個(gè) 功能:1) X文件的加載2) X文件的保存3) X文件的繪制我們需要在模塊內(nèi)實(shí)現(xiàn)一個(gè)用于保存X文件的結(jié)構(gòu)體數(shù)組,模塊將載入的X文件 信息保存在結(jié)構(gòu)體數(shù)組中,然后可以通過數(shù)組的下標(biāo)來對(duì)載入的模型進(jìn)行選擇繪制。球體的繪制設(shè)計(jì)也采用Direct3D庫函數(shù)來進(jìn)行實(shí)現(xiàn)。在函數(shù)中我們能定義球體的
45、半 徑,面數(shù)等屬性。但是使用庫函數(shù)并不為我們生成球體的貼圖坐標(biāo),我們必須采用手動(dòng)的方式為球體的每點(diǎn)設(shè)置貼圖坐標(biāo),才能正確地將貼圖應(yīng)用于球體模型。3. 4球體運(yùn)動(dòng)軌跡的設(shè)計(jì)球體在運(yùn)動(dòng)中每一幀都必須汁算當(dāng)前的位置。然后再在訃算出的位置上進(jìn)行球體的繪制,來體現(xiàn)球體的運(yùn)動(dòng)。由于球體運(yùn)動(dòng)軌跡為一條拋物線,所以可以利用拋物線公式來進(jìn)行球體運(yùn)動(dòng)位置的計(jì)算。公式為:y = vO * sin a * t - 1/2 * g * t * t公示中X為物體在水平方向的位移,y為物體在垂直方向的位移,vO為物體的初速度, a為初速度與水平線之間的夾角,g為重力加速度,t為物體的運(yùn)動(dòng)時(shí)間。在程序中使用此公式,把球體運(yùn)動(dòng)
46、時(shí)間傳入公式中即可得到每一幀中球體的位置。3. 5游戲界面的設(shè)計(jì)界面是用戶與系統(tǒng)進(jìn)行交互的渠道,好的UI系統(tǒng)能得到更好的用戶體驗(yàn)。本系統(tǒng) 的界面包含輸入部分的界面和顯示提示信息的界面。輸入界面用來響應(yīng)用戶的輸入,它接收用戶的輸入,再將輸入提交到系統(tǒng)中。然后系統(tǒng)能根據(jù)用戶的輸入來所需的操作。顯示提示信息界面可以提示用戶每次輸入完成后是否得分和在游戲結(jié)束后顯示用 戶的總得分。系統(tǒng)設(shè)計(jì)使用的輸入界面如下圖:圖3.4輸入界面圖右方小球在左圖十字架中先左右運(yùn)動(dòng),獲得用戶輸入后,然后再上下運(yùn)動(dòng),再次獲得用戶輸入后小球運(yùn)動(dòng)結(jié)束,本次輸入也結(jié)束。36得分判斷的設(shè)計(jì)每一次用戶輸入結(jié)束后,系統(tǒng)都需要進(jìn)行判斷本次輸
47、入是否得分,再根據(jù)是否得分 進(jìn)行相關(guān)的操作。游戲中得分的判斷是根據(jù)用戶輸入時(shí),小球在十字架中的當(dāng)前運(yùn)動(dòng)位置來決定的。 如下圖:圖3.5得分的判斷用戶在小球左右運(yùn)動(dòng)和上下運(yùn)動(dòng)時(shí)各輸入一次,如果兩次輸入時(shí),小球的位置都處 在口線所標(biāo)注的圓圈內(nèi)的話,則判斷得分,否則判斷失敗。3. 6攝像機(jī)的設(shè)計(jì)攝像機(jī)是用戶在游戲中的眼睛,攝像機(jī)看到的東西就為用戶在游戲中所看到的東 西。我們可以使用D3DXMatrixLookAtLH函數(shù)來計(jì)算視圖空間變換矩陣。這個(gè)函數(shù)對(duì) 于在固定位置布置和對(duì)準(zhǔn)攝像機(jī)是非常好用的,不過它的用戶接口對(duì)于要響應(yīng)用戶輸入 來實(shí)現(xiàn)攝像機(jī)移動(dòng)就不那么好用了。這就激發(fā)我們用我們自己的方法來解決。
48、我們需要 設(shè)計(jì)一個(gè)Camera模快,它使我們能夠比D3DXMatrixLookAtLH函數(shù)更好地操作攝像機(jī)。我們定義一個(gè)相對(duì)于世界坐標(biāo)系的位置和攝像機(jī)的方向,這里使用四個(gè)攝像機(jī)向 量:right vector , up vector, look vector 以及 position vector,如圖 12所示。這些向量 用來為攝像機(jī)定義一個(gè)坐標(biāo)系來描述在世界坐標(biāo)中的對(duì)應(yīng)關(guān)系。因?yàn)閞ight , up和look 向量定義了攝像機(jī)在世界中的方向,我們有時(shí)把它們?nèi)齻€(gè)向量一起稱為方向向量(orientation vectors)。方向向量必須被標(biāo)準(zhǔn)化。假如彼此互相垂直且都是單位長度, 那么我們就稱它
49、們是正交標(biāo)準(zhǔn)化向量。我們做這些限制是因?yàn)榈纫粫?huì)兒我們要將方向向 量插入到一個(gè)行矩陣中。因?yàn)樾邢蛄渴钦粯?biāo)準(zhǔn)化的,所以該矩陣也就是直交矩陣。回 憶一下,直交矩陣有一個(gè)特性就是它的逆矩陣等于它的轉(zhuǎn)置矩陣。圖3.6攝像機(jī)的向量描述有了這四個(gè)向量來描述攝像機(jī),我們的攝像機(jī)就能夠按照下面六種方式變化了:1. 圍繞right向量旋轉(zhuǎn)(pitch傾斜)2. 圍繞up向量旋轉(zhuǎn)(yaw偏航)3. 圍繞look向量旋轉(zhuǎn)(roll滾轉(zhuǎn))4. 沿著right向量平移(strafe)5. 沿著up向量飛行(fly)6. 沿著look向量移動(dòng)(move)通過這六種操作,我們能夠沿著三個(gè)軸移動(dòng)以及饒著三個(gè)軸旋轉(zhuǎn),這給了我們
50、一個(gè) 六度的自由。4實(shí)現(xiàn)方案4.1主要功能模塊系統(tǒng)實(shí)現(xiàn)的主要模塊如下圖所示:圖4.1系統(tǒng)主要類圖4. 2三維向量的實(shí)現(xiàn)在三維坐標(biāo)系每個(gè)點(diǎn)的表示都要用一個(gè)三維向量來表示,分別表示點(diǎn)在X, y, z軸方向 上的分量。本設(shè)計(jì)中對(duì)向量進(jìn)行了實(shí)現(xiàn)。實(shí)現(xiàn)代碼如下:class Vector3private:float x,y,z;x,y,z軸方向上的分量public:Vector3()Vector3(float _x,float _y,float _z):x(_x),y(_y),z(_z) 構(gòu)造函數(shù)Vector3(Vector3& rhs)/copy構(gòu)造函數(shù)x = rhs.x;y = rhs.y;z
51、 = rhs.z;const Vector3 operator + (const Vector3& rhs) 加號(hào)操作符重載Vector3 r;r.x = x 4- rhs.x;r.y = y + rhs.y;r.z = z + rhs.z;return r;const Vector3 operator - (const Vector3& rhs) 減號(hào)操作符重載Vector3 r;r.x = x - rhs.x;r.y = y - rhs.y;r.z = z - rhs.z;return r;const float operator * (const Vector3&
52、 rhs) /乘法操作符至載,與 7 向量相乘return (float)(x * rhs.x + y * rhs.y + z * rhs.z);const Vector3 operator * (const float rhs) 數(shù)乘,乘法操作符重載Vector3 r;r.x = (float)(x * rhs);r.y = (float)(y * rhs);r.z = (float)(z * rhs);return r;Vector3& operator = (const Vector3& rhs) 等號(hào)操作符重載if(this = &rhs) return氣his
53、;當(dāng)右參為自己時(shí),返回自己x = rhs.x;y = rhs.y;z = rhs.z;return 水this;bool operator = (const Vector3& rhs)/ 二二操作符重載return ( x = rhs.x && y = rhs.y && z = rhs.z );1;4. 3圖形系統(tǒng)和W i ndows消息循環(huán)的實(shí)現(xiàn)本部分的具體在兩個(gè)類中實(shí)現(xiàn),D3DApplication類和GameApp類。D3DApplication 為基類,GameApp繼承于D3DApplication。D3DApplication類中的Init函
54、數(shù)實(shí)現(xiàn)了 Direct3D 的初始化和窗口的初始化工作。Setup和RenderOneF rame函數(shù)為虛函數(shù),可以在子類中 重新定義它們的具體實(shí)現(xiàn)。Setup中可以函數(shù)可以讓子類自己定義些初始化過程, RenderOneFrame為每一幀的渲染函數(shù),在每一次循環(huán)中被調(diào)用。D3DApplication類為系 統(tǒng)實(shí)現(xiàn)了一個(gè)基本的運(yùn)行框架。D3DApplication中還包含了 一個(gè)D3DCamera類,D3DCamera的初始化也在Init函數(shù)中 實(shí)現(xiàn)。D3DCamera中實(shí)現(xiàn)了攝像漫游的功能。D3DApplication中Ru n函數(shù)實(shí)現(xiàn)的是系統(tǒng)的消息循環(huán),當(dāng)窗口有Windows'
55、174;息時(shí)則處 理windows消息,當(dāng)無消息處理時(shí),則進(jìn)行場(chǎng)景繪制,攝像機(jī)更新等操作。void Isabel:D3DApplication:Run()float time = 50/3;渲染間隔時(shí)間if(!this->Setup()return;MSG msg;:ZeroMemory(&msg, sizeof(MSG);DWORD oldtime = timeGetTime(); /獲得當(dāng)前時(shí)間while(msg.message != WM_QUIT) /肖窗口消息不為退出消息時(shí),一直循環(huán)if(:PeekMessage(&msg, 0. 0. 0, PM_REMOVE
56、):TranslateMessage(&m sg);:DispatchMessage (&m sg);else DWORD newtime = timeGetTime();if(newtime - oldtime >= time)到達(dá)渲染間隔時(shí)間時(shí),進(jìn)行渲染oldtime = newtime;camera->updateCamera(0.036); 更新攝像機(jī)this->RenderOneFrame(0.036); 渲染物體)4. 4物理模塊的實(shí)現(xiàn)物理模塊為Ball類和PhysicSystem類,Ball中保存著球體的當(dāng)前位置和當(dāng)前速度等 屬性。PhysicS
57、ystem中可以對(duì)球體的速度和位置進(jìn)行運(yùn)算更新,CalculateBallPos函數(shù)中 運(yùn)用了拋物線公式來進(jìn)行球體軌跡的汁算,這個(gè)函數(shù)還可以根據(jù)用戶輸入是否得分來計(jì) 算球體軌跡,得分為一種運(yùn)動(dòng)軌跡,不得分為另一種運(yùn)動(dòng)軌跡。拋物線公式的具體實(shí)現(xiàn)代碼為:橫向位移forward_pos = speed * acos(angle) * ball_move_time;豎直位移up_pos = (speed * asin(angle) * ball_move_time) - (4.9 * ball_move_time * ball_move_time );4.5游戲界面的實(shí)現(xiàn)界面部分山UlSystem類來具體實(shí)現(xiàn),UlSystem采用Direct3D中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 西藥批發(fā)企業(yè)運(yùn)營優(yōu)化與效率改進(jìn)考核試卷
- 資產(chǎn)管理中的資產(chǎn)聯(lián)動(dòng)性分析考核試卷
- 盾構(gòu)機(jī)施工中的隧道工程生命周期管理考核試卷
- 胸痛護(hù)理臨床規(guī)范與流程
- 繪本館與兒童教育機(jī)構(gòu)合作項(xiàng)目協(xié)議
- 網(wǎng)絡(luò)零售債務(wù)解決與風(fēng)險(xiǎn)控制協(xié)議
- 生物醫(yī)藥研發(fā)首席科學(xué)家聘用與成果轉(zhuǎn)化實(shí)施協(xié)議
- 工業(yè)廢氣排放在線監(jiān)測(cè)與綜合運(yùn)維管理協(xié)議
- 環(huán)保型建筑材料研發(fā)與市場(chǎng)推廣合同
- 電商平臺(tái)市場(chǎng)趨勢(shì)分析工具委托開發(fā)協(xié)議
- 《流感中醫(yī)治療》課件
- 2025河南省水利第一工程局集團(tuán)有限公司招聘49人筆試參考題庫附帶答案詳解
- 2025四川西南發(fā)展控股集團(tuán)有限公司招聘工作人員65人筆試參考題庫附帶答案詳解
- 醫(yī)院培訓(xùn)課件:《走進(jìn)康復(fù)》
- 《智能電網(wǎng)計(jì)量裝置》課件
- 2025年河南省鄭州市外國語中學(xué)高考生物三模試卷含解析
- (三模)溫州市2025屆高三第三次適應(yīng)性考試英語試卷(含答案)
- 美團(tuán)代運(yùn)營合同協(xié)議模板
- 同型半胱氨酸試題及答案
- 湖北省武漢市2025屆高中畢業(yè)生四月調(diào)研考試數(shù)學(xué)試卷及答案(武漢四調(diào))
- 故宮的資料簡介(標(biāo)準(zhǔn)版)
評(píng)論
0/150
提交評(píng)論