版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、文檔從互聯(lián)網(wǎng)中收集,已重新修正排版,word格式支持編輯,如有幫助歡迎下載支持。HUNAN UNIVERSITY畢業(yè)設計(論文)設計論文題目:基于Direct3D的投籃游戲?qū)W生姓名: 學生學號: 專業(yè)班級: 學院名稱: 指導老師: 學院院長:何杰506 開發(fā)2班 軟件學院 申煜湘 林亞平2008年5月25日lword格式支持編借,如有幫助歡迎下載支持?;贒irect3D的投籃游戲摘要現(xiàn)在游戲已經(jīng)深入到人們的生活中,兒乎每個人都玩過至少一款游戲。隨著越來 越多的人關注游戲,當今的游戲產(chǎn)業(yè)也成為潛力無窮的產(chǎn)業(yè)。與此同時,游戲設計已經(jīng) 成為當今許多玩家的夢想。本設計就是基于DirectX技術的投籃
2、游戲設計,采用Visual C+進行編寫。DirectX 是Microsoft公司提供的U前比較普遍的Windows游戲設計開發(fā)工具(SDK)。它基本包 括了 2D、3D、聲音、控制、網(wǎng)絡等的基本操作函數(shù),使得程序員不必直接與硬件打交 道,大大地提高了游戲開發(fā)的簡易性和效率。本設計在Direct3D的基礎上,設計出了圖形渲染模塊,用戶界面模塊,物理模塊, 攝像機模塊等,并加以代碼實現(xiàn),實現(xiàn)了一個簡單的3D投籃游戲。關鍵字:游戲設計,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 緒論錯誤!未定義書簽??谡n題背景錯誤!未定義書簽。12國內(nèi)外研究現(xiàn)狀和發(fā)
6、展趨勢錯誤!未定義書簽。13本文結(jié)構(gòu)錯誤!未定義書簽。錯誤!未定義書簽。2 技術原理2.1數(shù)學基礎知識錯誤!未定義書簽。2.1.1 3D坐標系錯誤!未定義書簽。錯誤!未定義書簽。錯誤!未定義書簽。2.2 DIRECT3D基礎錯誤!未定義書簽。221 Direct3D概述錯誤!未定義書簽。222 Direct3D重要概念錯誤!未定義書簽。223 Direct3D初始化錯誤!未定義書簽。2.3基本3D流水線簡介錯誤!未定義書簽。2.4 WIN32消息機制錯誤!未定義書簽。3.系統(tǒng)設計錯誤!未定義書簽。3功能設汁錯誤!未定義書簽。3.2游戲邏輯的設計錯誤!未定義書簽。3.3圖形繪制系統(tǒng)的設計錯誤!未
7、定義書簽。3.4球體運動軌跡的設計錯誤!未定義書簽。3.5游戲界面的設計錯誤!未定義書簽。3.6得分判斷的設訃錯誤!未定義書簽。3.6攝像機的設計錯誤!未定義書簽。4實現(xiàn)方案錯誤!未定義書簽。4主要功能模塊錯誤!未定義書簽。4.2三維向量的實現(xiàn)錯誤!未定義書簽。4.3圖形系統(tǒng)和WINDOWS消息循環(huán)的實現(xiàn)錯誤!未定義書簽。4.4物理模塊的實現(xiàn)錯誤!未定義書簽。4.5游戲界面的實現(xiàn)錯誤!未定義書簽。4.6攝像機模塊的實現(xiàn)錯誤!未定義書簽。丄7我製系統(tǒng)的實現(xiàn)錯誤!未定義書簽。小結(jié)錯誤!未定義書簽。5運行效果錯誤!未定義書簽。致謝錯誤!未定義書簽。參考文獻錯誤!未定義書簽。11課題背景我們生活在一個
8、充滿三維物體的三維世界中,為了使計算機能精確地再現(xiàn)這些物 體,我們必須能在三維空間描繪這些物體。我們乂生活在一個充滿信息的世界中,能否 盡快地理解并運用這些信息將直接影響事業(yè)的成敗,所以我們需要用一種最直接的形式 來表示這些信息。最近兒年汁算機圖形學的發(fā)展使得三維表現(xiàn)技術得以形成,這些三維表現(xiàn)技術使我 們能夠再現(xiàn)三維世界中的物體,能夠用三維形體來表示復雜的信息,這種技術就是可視 化(Visualization)技術。可視化技術使人能夠在三維圖形世界中直接對具有形體的信息 進行操作,和訃算機直接交流。這種技術已經(jīng)把人和機器的力量以一種直覺而自然的方 式加以統(tǒng)一,這種革命性的變化無疑將極大地提高人
9、們的工作效率??梢暬夹g賦予人 們一種仿真的、三維的并且具有實時交互的能力,這樣人們可以在三維圖形世界中用以 前不可想象的手段來獲取信息或發(fā)揮自己創(chuàng)造性的思維。機械丄程師可以從二維平面圖 中得以解放直接進入三維世界,從而很快得到自己設計的三維機械零件模型。醫(yī)生可以 從病人的三維掃描圖象分析病人的病灶。軍事指揮員可以面對用三維圖形技術生成的戰(zhàn) 場地形,指揮具有真實感的三維飛機、軍艦、坦克向日標開進并分析戰(zhàn)斗方案的效果。更令人驚奇的是LI前正在發(fā)展的虛擬現(xiàn)實技術,它能使人們進入一個三維的、多媒 體的虛擬世界,人們可以游歷遠古時代的城堡,也可以遨游浩翰的太空。所有這些都依賴 于計算機圖形學、計算機可
10、視化技術的發(fā)展。隨著三維技術的進步,對于普通電腦用戶最大的感受就是電腦游戲的發(fā)展了,如今 游戲的畫面基本上全部都是3D化,在游戲市場的巨大利益推動下,游戲開發(fā)商和硬件 廠商不斷推陳出新,技術的發(fā)展可以用一日千里來形容。1.2國內(nèi)外研究現(xiàn)狀和發(fā)展趨勢目前游戲開發(fā)采用的主要有OpenGL與DirectX兩種圖形庫。U前的游戲引擎都是 基于這兩種圖形庫來實現(xiàn)圖形的渲染。OpenGL是在SGI等多家世界聞名的計算機公司的倡導下,以SGI的GL三維圖形 庫為基礎制定的一個通用共事的開放式三維圖形標準。tl前,包括Microsoft. SGI. IBM、 DEC、SUN、HP等大公司都釆用了 OpenGL
11、做為三維圖形標準,許多軟件廠商也紛紛 以OpenGL為基礎開發(fā)出自己的產(chǎn)品。OpenGL U前版本為2.0,支持可編程渲染管線。DirectX是伴隨著視窗操作系統(tǒng)的推出而出現(xiàn)的,DirectX的原名為DirectX SDK(或 Game SDK ),英文原意:DirectX Software Development Kit,是微軟所開發(fā)出的一套主要 用在設計多媒體、2D、3D游戲及程序的API ,其中包含了各類與制作多媒體功能相 關的組件(Component),各個組件提供了許多處理多媒體的接口與方法。從這點介紹我 們可以領會到DirectX是為游戲而誕生,從DirectX 1.0到Direc
12、tX3.0,微軟讓它的DirectX 開始在游戲領域樹立起3D的標桿,盡管當時的3D很粗糙,但是雛形已初步形成,到 DirectX7開始,隨著OpenGL和Glide勢力日漸衰弱,DirectX的霸氣初現(xiàn),到DirectX8 發(fā)布后,DirectX已經(jīng)在3D游戲領域樹立起它的的權(quán)威地位,引人的Ps和Vs的出現(xiàn)令 OpenGL和Glide自嘆不如,DirecetX9.0,更是如日中天,權(quán)威地位無人能撼動。LI前 DirectX在桌面游戲方面更受開發(fā)者的歡迎。LI前版本為10.0。13本文結(jié)構(gòu)本文分為五章,第一章為緒論。第二章為技術原理,主要簡單介紹本設計中用到的 一些基本原理。第三章為系統(tǒng)設計,
13、主要講解系統(tǒng)的設計方案。笫四章為系統(tǒng)的實現(xiàn)方 案,講解系統(tǒng)的具體實現(xiàn)。第五章展示系統(tǒng)的運行效果。2. 技術原理2.1數(shù)學基礎知識兒何學中,我們用有向線段表示向量,向量的兩個屬性是它的長度和它的頂點所指 的方向,因此,可以用向量來模擬既有大小乂有方向的物理模型。向量為在3維空間中 表示方向提供了方便.2.1.1 3D坐標系3D坐標系中使用最廣泛的是笛卡爾坐標系,它基于空間中三條相互垂直的坐標 軸:X軸、Y軸和Z軸。要定義空間中的一個點P,需要三個坐標:X,Y, Z寫成P(X,Y, Z)。 三個坐標軸構(gòu)成三個平面:X-Y平面、X-Z平面和Y-Z平面。這三個平面將整個空間分成 8個子空間,在3D笛卡
14、爾坐標系中共有8個卦限。圖2.1.1左手坐標系3D笛卡爾坐標系包括左手坐標系和右手坐標系兩種。左手坐標系(LHS)假設X-Y 為紙張上或屏幕上的水平軸和垂直軸,正Z軸指向紙內(nèi)或屏幕內(nèi)。右手坐標RHS)假 設X-Y為紙張上或屏幕上的水平軸和垂直軸,正Z軸指向紙外或屏幕外。1 向量相等兒何學上,有同樣方向和長度的兩個向量相等。數(shù)學上,我們說有同樣維數(shù)和分量 的向量相等。例如:如果vx, uy = vy,且uz = vz那么uy, uz) = (vx, vy, vz)o在代 碼中我們能夠用判斷兩個向量相等。同樣的,我們也能用"!二”判斷兩個向量 不相等。2. 向量的模兒何學上,向量的大小是
15、有向線段的長度。知道向量的分量,利用下面的公式我們 就能汁算出向量的大小。圖向量的模Hull表示向量u的長度。3. 標準化向量標準化向量是讓向量的大小等于1,即被叫作單位向量。我們能利用向量大小以及 各個分量把一個向量標準化,就象這樣:圖標準化向量我們這樣表示單位向量0。4. 向量相加我們能夠通過分別把兩個向量的各個分量相加得到向量之和,注意在相加之前必須 保證它們有相同的維數(shù)。圖向量相加下圖顯示的是兒何學上的向量相加。圖兒何上的向量相加5. 向量相減和加法類似,通過分別把兩個向量的各個分量相減得到向量之差。再次重聲兩個向 量必須是相同維數(shù)。圖向量相減下圖顯示的是兒何學上的向量相減。圖兒何上的
16、向量相減6. 數(shù)乘我們能用一個標量與向量相乘,就象名字暗示的一樣,向量按比例變化。這種運算 不會改變向量的方向,除非標量是負數(shù),這種情況向量方向相反。圖向量數(shù)乘7. 點乘數(shù)學上定義點積是兩個向量的乘積。按下面等式計算:圖向量點乘上面的等式不能很明顯的體現(xiàn)兒何上的意義。利用余弦定律,我們能夠發(fā)現(xiàn)它們的 關系。u - v=lullvlcos6,表示兩個向量的點積是它們的模和夾角的余弦之積。因此,如果 U和V都是單位向量,那么uv就是它們夾角的余弦。一些點積中有用的特性:假如IJ v = 0,那么11丄v。假如uv > 0,那么兩個向量的角度0小于90度。假如uv v 0,那么兩個向量的角度0
17、大于90度。8. 叉乘第二種乘法在向量數(shù)學中叫義積。不象點積,結(jié)果值是一個標量,義積的結(jié)果值是 另一個向量。通過把兩個向量U和V相乘得到另一的向量P,向量P垂直于U和V。也 就是說向量p垂直于U并且垂直于U。十字相乘就象這樣計算:圖向量義乘如果u-v = 0,那么u丄V。同樣的如果j k = 0并且j.i = O那么我們便能知道J既 垂直于k又垂直于i的。當我們在編程時,通常都使用4x4矩陣來進行矩陣變換。因為下面所討論的矩陣變 換都是基于4x4矩陣的。1. 矩陣相乘矩陣相乘在3D汁算機圖形學中是非常重要的運算。通過矩陣相乘,我們能變換向量 并且,將不同向量轉(zhuǎn)換到一起。為了得到矩陣之積AB,
18、A的列數(shù)必須等于B的行數(shù)。假如這個條件不滿足,就不 能相乘。考慮兩個矩陣,A和B,分別是2x3和3x3,我們看乘積AB是可以計算的,因為A的列數(shù)等于B的行數(shù)。注意乘積BA,它們是 不能計算的,因為B的列數(shù)不等于A的行數(shù)。由此說明:一般情況下矩陣乘法不滿足 乘法交換律(也就是,ABWBA)。我們說“一般不可交換”因為有一些矩陣乘法的實例 還是可以的。知道了矩陣乘法的計算方法,現(xiàn)在我們就能給出精確的定義:假如A是一個加X”的 矩陣,B是一個必“的矩陣,那么它們之積AB可計算并且是一個“旳的矩陣C,C的成員 ij等于A的第i個與B的第j個相乘:圖矩陣乘法2. 矩陣平移通過與一個特定的矩陣相乘來達到矩
19、陣平移的U的。例如有向量(x,y, z, m),將其沿x軸移動dx個單位,沿y軸移動dy個單位,沿z軸 移動dz個單位,只需將其與下面矩陣相乘。圖平移矩陣3. 矩陣旋轉(zhuǎn)例如向量(x,y, z, m)圉繞x軸旋轉(zhuǎn)0弧度,只需與下面矩陣相乘:圖x軸旋轉(zhuǎn)矩陣當要圍繞y軸旋轉(zhuǎn)0弧度,只需與下面矩陣相乘圖y軸旋轉(zhuǎn)矩陣當要用繞z軸旋轉(zhuǎn)B弧度,只需與下面矩陣相乘圖z軸旋轉(zhuǎn)矩陣4. 矩陣縮放通過矩陣相乘可以實現(xiàn)矩陣縮放例如向量(x,y,z,m),沿x軸縮放dx個單位,沿y軸縮放dy個單位,沿z軸縮放dz個單位,只需將其與下面矩陣相乘。圖縮放矩陣2.2 Direct3D 基礎2.2.1 Direct3D 概述D
20、irect 3D 是一種低層圖形 API( Application Programming Interface,應用程序接 口),它 能讓我們利用3D硬件加速來渲染3D世界。我們可以把Direct3D看作是應用程序和圖 形設備(3D硬件)之間的中介。通過利用Direct3DAPI編程,能夠屏蔽許多底層實現(xiàn)的技 術細節(jié),縮短開發(fā)周期。下圖顯示了 Direct3D,H AL(Hardware Abstraction Layer,硬件抽 象層)及硬件之間的關系。其中HAL即硬件抽象層,是一組指示設備執(zhí)行某種操作的特 殊設備代碼的集合,山設備制造商實現(xiàn),Direct3D不能直接作用于圖形設備,通過使用
21、 HAL與硬件圖形設備協(xié)同工作。如下圖所示,Direct3D應用程序最終通過圖形卡的設備 驅(qū)動程序訪問圖形硬件。曲于HAL存在,Direct3D將可以不需要了解某個設備的具體 硬件特性,使它能夠獨立于硬件設備。Direct3D提供了相應的方法在運行時檢查設備是 否能執(zhí)行某項操作。圖 2.2 Direct3D 層次2.2.2 Direct3D 重要概念1. 頂點:一個場景是多個物體或模型的集合。一個物體可以用三角形網(wǎng)格來近似表 示,3D世界中最基本的圖元就是三角形,一個多邊形的兩邊相交的點叫做頂點。為了 描述一個三角形,我們通常指定三個點的位置來對應三角形的三個頂點,這樣我們就能 夠很明確的表示
22、出這個三角形。3D物體中的三角形經(jīng)常會有許多共用頂點。為了解決 復雜精細場景重復頂點占用更多的渲染帶寬,我們在創(chuàng)建一個頂點列表的同時也創(chuàng)建一 個索引列表。頂點列表包含所有不重復的頂點,索引列表中則用頂點列表中定義的值來 表示每一個三角形的構(gòu)造方式。通常每個頂點都包含如下信息:x,y,z坐標值、顏色值、 用于計算燈光的法線和紋理坐標(u, V)。2. 表面:是一個像素點陣,主要用來存儲2D圖形數(shù)據(jù)。表面數(shù)據(jù)就像一個矩陣,像 素數(shù)據(jù)實際上是存儲在線性數(shù)組里面。Direct3D里面的IDirect3DSurface9接口用來描述 表面,這個接口提供一些方法來直接操作表面數(shù)據(jù)。3. 多重采樣(Mult
23、iSampling) :|11于使用像素來表示圖像,在顯示時會出現(xiàn)鋸齒狀。 MultiSampling就是使圖像變得平滑的技術。它的最普通的用法就是全屏抗鋸齒。 D3DMULTISAMPLE_TYPE枚舉類型能使我們制定全屏抗鋸齒的質(zhì)量等級。4. 交換鏈和頁面交換:Direct3D通常建立2-3個頁面組成一個集合,即為交換鏈,通 常山IDirect3DSwapChain接口來表示。交換鏈和頁面交換技巧被用在使兩幀動畫之間過 渡更加平滑。通常山Direct3D自己去管理。5. 深度緩沖:深度緩沖是一個表面,但它不是用來存儲圖像數(shù)據(jù)而是用來記錄像素的 深度信息。深度緩沖為每一個像素訃算深度值,并進
24、行深度測試。通過深度測試我們可 以知道哪個像素離攝像機近從而把它畫出來。這樣就可以只繪制最幕近攝像機的像素, 被遮住的像素就不會被畫出來。6. 頂點處理:頂點是3D圖形學的基礎,它能夠通過兩種不同的方法來處理,一種是: 軟件頂點處理(Software Vertex Processing),:種是:硬件頂點處理(Hardware Vertex Processing)o前者總是被支持而且永久可用,后者要顯卡硬件支持頂點處理才可用。使 用硬件頂點處理總是首選,因為它比軟件方式更快,而且不占用CPU資源。如果一塊 顯卡支持硬件頂點處理的話,也就是說它支持硬件兒何變換和光照計算。7. 設備能力:Dire
25、ct3D支持的每一種特性都對應于D3DCAPS9結(jié)構(gòu)的一個數(shù)據(jù)成員, 初始化一個D3DCAPS9實例應該以你的設備實際支持的特性為基礎。因此,在我們的 應用程序里,我們能夠通過檢測D3DCAPS9結(jié)構(gòu)中相對應的某一成員來檢測設備是否 支持這一特性。2.2.3 Direct3D 初始化初始化步驟:1. 獲得IDirect3D9接口指針。2. 檢查設備的技術特性,確定顯卡是否支持碩件頂點處理。3. 初始化一個D3DPRESENT_PARAMETER結(jié)構(gòu)實例,這個結(jié)構(gòu)包含了許多數(shù)據(jù)成 員,它允許我們指定將要創(chuàng)建IDirect3DDevice9接口的特性。4. 創(chuàng)建一個基于已經(jīng)初始化好了的D3DPRE
26、SENT_PARAMETER結(jié)構(gòu)的 IDirect3DDevice9 對象。2. 3基本3D流水線簡介大家都知道,一個3D場景中,我們見到的任何光輝燦爛的物體,都是由一個一個 面片組成的。而裝載面片位置信息的就是其各個定點的三維坐標。這是用來在模型中存 儲的,而要把物體顯示在屏幕上,還需要將它們轉(zhuǎn)換成顯示器上的二維坐標。這就需要 對每個點實施一套3 to 2的轉(zhuǎn)換公式,在Direct3D中叫做“兒何流水線” (Geometry Pipeline) oDirect3D 中的 Geometry Pipeline 如下圖所示:圖2.3.1 3D流水線每渲染一幀,我們都要用到這條流水線把所有定點的坐標
27、轉(zhuǎn)化成當前要顯示的位置。 不過放心,D3D不會改變你原有的頂點坐標,變換出的頂點數(shù)據(jù)會存放在新的地方用來 渲染。想一想物體,也就是面片,也就是頂點要顯示在屏幕上,其位置取決于什么呢? 首先它一定取決于該點在場景中的位置,然后還在于你從什么角度看,更詳細一點就是 我的眼睛在哪兒,我注視著哪兒,以及我的視野寬窄等等。對于每個獨立被引入程序的mesh物體,它們的坐標系、坐標原點理論上都應該是不 同的,其頂點也都是用局部坐標表示的。那么要做統(tǒng)一的變換,首先應將它們引入到同 一個坐標系下,也就是我們稱之為“世界坐標系”的坐標。這個變換也因此得名世界變換 (World Transform)。對物體所需要做
28、的移動、旋轉(zhuǎn)等工作也是要在此時完成的。經(jīng)過了以上一些操作后,每個頂點(也就是每個物體)在整個場景中的位置就如你 所愿確定下來了。要把它們映射到屏幕上,還要確定觀察者(你可以叫他玩家、攝影機 都無所謂)的位置和視角。我們是要把所有的點變換到新建立的以觀察者為基準的坐標 系下。這個步驟就是“視圖變換”(View Transform)。實際上和后面要說的射影變換相 比,這兩種變換并沒有什么本質(zhì)區(qū)別。有時候為了效率,可以把世界變換與視圖變換合 并為一個世界視圖變換。這不就是說你一開始就選擇觀察者的位置為世界坐標系的 原點,并按照視角來確定坐標軸么?后面一步是"射影變換”(Projection
29、 Transform) o實際上,我們要做的所有坐標轉(zhuǎn)換 歸根結(jié)蒂是要把三維的點投影到二維的屏幕上,如圖所示圖2.3.2射影變換經(jīng)過上述兩次坐標轉(zhuǎn)換后,我們已經(jīng)讓屏幕平行于坐標軸平面了,也就是說,經(jīng)過 一些比例范圉的調(diào)整,理論上我們能從點的三維坐標中的某兩個直接得到期待已久的屏 幕坐標。但是別急,此時得到的坐標繪出的圖就像我們小時候畫的那些畫一樣沒有 立體感。比如上圖那個矩形,因為近大遠小,在我們的視野中應該看起來像個梯形。但 是如果我們不做任何處理就直接把它的頂點(已經(jīng)過前兩重變換)投影到顯示器上(假 設平行于圖中的XY平面)這樣還是一個方方正正的矩形。想象一下,投影實際上就是把空間中的所有
30、點都壓扁,扁到某一個平面上。這樣出 來的圖形自然不會有透視效果。(之所以有近大遠小是因為人眼的凸透鏡成像,其像高 是物距的減函數(shù)。這里不多說了)你可能想到讓每個點像這樣斜著投影,但是仔細想想, 如何斜著投影呢?等你想明口了再回答這樣做真的方便么?于是另一種辦法就是把整 個空間范圍變成一個棱臺(里面的點隨之進行放縮)。圖2.3.3投影效果相對來說把較遠端縮小會造成數(shù)據(jù)的不準確,因此采用放大較近端。對每個點,我 們進行最后一步變換就是根據(jù)其遠近程度進行一下放縮。D3D把剪切也納入此流水線中,盡管它沒對頂點作任何變換,只是剔出那些不用的 點。以上就是D3D中的兒何流水線。幸運的是,我們并不需要自己去
31、寫代碼來完成這些轉(zhuǎn) 換。實際上我們只需要設計好參數(shù),調(diào)用相應的D3D函數(shù)設置上面提到的各種決定因 素,它會在渲染畫面的時候把侮個頂點自動轉(zhuǎn)化成所需的屏幕坐標的。正因為這一套流 水線操作的通用性和規(guī)范性,各種3D渲染引擎都將它封裝了,而當代很多先進的顯卡 都將其固化到硬件線路上,這樣大大提高了渲染速度。下面我們來看看一些具體的實施。在計算機圖形學中,坐標的變換通常是通過與一個矩 陣(Matrix)相乘來實現(xiàn)的?;咀儞Q包括平移、縮放、旋轉(zhuǎn)都用此方法完成,其他任 何的變換,包括不同坐標系之間的互化,也都是通過這三種基本轉(zhuǎn)換完成的。因此說, Matrix無處不在,在我們的周圍,就在這間屋子里。你能在
32、窗戶往外看到它,在電視里 看到它。具體到三維坐標系中,定義某點的坐標為(X,Y,Z)則用(X,Y,乙W)乘以一個相應 的4X4矩陣就可以得到新的坐標(XYZW),這里的W自有用處,一般是1。還有一 點很重要,一個矩陣就代表著一重變換,而兒個矩陣的乘積就代表著多重變換的合變換。那么在這條流水線中,按規(guī)范我們至少需要三個矩陣來實現(xiàn)以上三步變換,也就是世界 矩陣(World Matrix)、視矩陣(View Matrix)以及射影矩陣(Projection Matirx)o世界矩陣有時候需要我們自己填寫,根據(jù)我們的各種變換需要來填寫一個D3DXMATRIX結(jié)構(gòu)體(其成員就是各行各列的數(shù)值),之后通過
33、調(diào)用IDirect3DDevice9:SetTransform( D3DTRANSFORMSTATETYPE State,CONSTD3DMATRIX *pMatrix )設置世界矩陣為你填好的那個。參數(shù)意義如下:D3DTRANSFORMSTATETYPE State代表你要設置的變換類型。D3DTS_WORLD,D3DTS_VIEW, D3DTS_PROJECTION 分 別表示要射知識界、視圖、射影三種變換CONST D3DMATRIX *pMatrix指向一個矩陣結(jié)構(gòu)的指針,就是你所要用到的矩陣。后面的兩個矩陣也要通過此函數(shù)設置。D3D中,三個變換矩陣是要存放在固定位置的, 每次執(zhí)行流水
34、線,D3D就依次從這三個位置讀取矩陣信息,并乘以所有的點,得到新的 點的坐標,這個過程是不用我們操心的。我們調(diào)用SetTransform()就是要把填充好的矩 陣放進這三個位置中的某一個,第一個參數(shù)表示了哪一個。在設置視矩陣時,我們先要很清楚地(在腦子里或紙上)建立好“視坐標系”。這個坐標 系以觀察著為原點,沿著視線方向(觀察著注視點方向)為縱深方向(也就是Z軸 方向)。僅有兩個點還不足以確定一個三維坐標系,我們還需要一個參考點,能與另兩 個點構(gòu)成某一個坐標平面。這樣的坐標系構(gòu)件起來后,就可以根據(jù)兩個坐標系的變換填 充視矩陣了。D3D提供了函數(shù)D3DXMATRIX *D3DXMatrixLoo
35、kAtLH(D3DXMATRIX *pOut,CONST D3DXVECTOR3 *pEye,CONST D3DXVECTOR3 *pAt,CONST D3DXVECTOR3 *pUp);或D3DXMATRIX *D3DXMatrixLookAtLH(參數(shù)同),區(qū)別僅在于前者用于左手系而 后者用于右手系。該函數(shù)自動填充一個矩陣,參數(shù)依次是將要填充的矩陣以及上面說到 的三個點,這里三個點構(gòu)成視坐標系的YoZ平面。別忘了調(diào)用SetTransform()把這個矩 陣交給D3D。經(jīng)過上一步被統(tǒng)一了坐標的各個頂點將被這個矩陣轉(zhuǎn)到視坐標中。第三步要將點乘上一個射影矩陣,這個矩陣將越近的點放得越大。填充這個
36、矩陣我們用 函數(shù)D3DXMATRIX *D3DXMatrixPerspectiveFovLH(D3DXMATRIX *pOut,FLOAT fovY,FLOAT Aspect,FLOAT zn,FLOAT zf);或 D3DXMATRIX *D3DXMatrixPerspectiveFovLH,區(qū)別同上面一樣。第一個參數(shù)仍然 是輸出矩陣。第二個描述了在Y軸上的視角,弧度制表示,可以想象,視角越大,近端 被抻拉的比例就越大。下一個參數(shù)是視圖區(qū)的長寬比。后面兩個參數(shù)就是最近視平面和 最遠視平面的位置,用它們的Z坐標(Z坐標的值在射影變換前后是不變的)表示。這 兩個平面的意義將在下一步說到。最后說一
37、下這條流水線的倒數(shù)第一步剪切。剪切就是把理論上根本不該看到的點從 渲染元中剔除掉(這里不包括因遮擋關系產(chǎn)生的圖形的剪切以及隱面消除),用過 DirectDraw的朋友很容易想到屏幕范圍以外的就是這樣的點。在3D世界里,還存在一 個最近視平面和一個最遠視平面,它們共同組成了一個視圖截錐(Viewing Frustum)。 對于這個東西,微軟有個很好的說法:就好像你在一間黑屋子里向外看,窗戶的四個邊 圈定了視圖范禺,并且窗戶所在平面之前的物體是看不見的(黑屋子里的東西是看不見 的),窗戶所在的平面就是最近視平面;而且我們并不能看到無限遠,總要有個最遠視 平面。這六個平面視可以根據(jù)需要設定的,它們組
38、成了視截錐下圖中的藍色范圍。圖2.3.4視圖截錐可以想象,剛才進行的射影變換也可以說是把視圖截錐這個棱臺擠壓成長方體的過程。 讀者還能發(fā)現(xiàn),上述D3DXMatrixPerspectiveFovLH( )fl<J參數(shù)實際上是描述視截錐的。你 會覺得這個藍色的東西很有用,它與射影變換以及剪切都有著異常緊密的聯(lián)系。2.4 Win32消息機制而Windows的驅(qū)動方式是事件驅(qū)動,就是不山事件的順序來控制,而是山事件的發(fā) 生來控制,所有的事件是無序的,所為一個程序員,在你編寫程序時,你并不知道用戶 先按哪個按紐,也不知道程序先觸發(fā)哪個消息。你的任務就是對正在開發(fā)的應用程序要 發(fā)出或要接收的消息進行
39、排序和管理。事件驅(qū)動程序設訃是密切圍繞消息的產(chǎn)生與處理 而展開的,一條消息是關于發(fā)生的事件的消息。C語言編程至少有一個主程序,其名字是main()o Windows程序則至少兩個主程序, 一個是WinMain()另一個是窗口過程函數(shù)WndProc(),Windows應用程序的編程就圍繞這 兩個部份進行的。其中WinMain函數(shù)為應用程序的入口點,它的名字一定要是WinMaino在Windows中,應用程序通過要求Windows完成指定操作,而承擔這項通信任務的 API函數(shù)就是Windows的相應窗口函數(shù)WndProco在dos里,程序能直接控制事件的發(fā) 生順序,結(jié)果等。而在Windows里,應
40、用程序不直接調(diào)用任何窗口函數(shù),而是等待 Windows調(diào)用窗口函數(shù),請求完成任務或返回信息。為保證Windows調(diào)用這個窗口函 數(shù),這個函數(shù)必須先向Windows登記,然后在Windows實施相應操作時回調(diào),所以窗 口函數(shù)乂稱為回調(diào)函數(shù)。WndProc是一個主回調(diào)函數(shù),Windows至少有一個回調(diào)函數(shù)。Win32程序都包含以下兒個部分:(一)建立,注冊窗口類(二)創(chuàng)建窗口(三)顯示和更新窗口 (四)創(chuàng)建消息循環(huán).(五)終止應用程序.(六)窗口過程.(七)處理消息.353. 系統(tǒng)設計3.1功能設計系統(tǒng)為3D投籃游戲,通過鍵盤輸入來判斷球體是否投入籃筐,投入籃筐則得分加 -o游戲中有三個位置來進行
41、投籃,在每個位置投籃次數(shù)達到一定數(shù)時則切換一下位置, 投籃機會用完后則顯示總得分,同時游戲結(jié)束。3. 2游戲邏輯的設計一個典型的3D游戲主程序的偽代碼如下:int main()Direct3D初始化;初始化游戲中所需要的設備;處理所有的消息;while (1)處理用戶的輸入;更新物體的位置;渲染處理;)其中更新物體位置信息的偽代碼如下:UpdateObjects()for(每一個物體)保存物體的當前位置;根據(jù)控制輸入或者已有邏輯計算新的位置;if(新位置不可用或者發(fā)生碰撞)將新位置設置當前位置)本系統(tǒng)設計在Win32消息循環(huán)中實現(xiàn)游戲的邏輯。本系統(tǒng)的邏輯流程如圖:3. 3圖形繪制系統(tǒng)的設計假如
42、你想通過手工指定頂點來創(chuàng)建你自己的3D物體,你能,不用懷疑,不過這是非 ??菰锓ξ兜氖虑?。為了減輕建造3D物體數(shù)據(jù)的匸作,專門的應用程序已經(jīng)被開發(fā)出 來了,我們把它們叫做3D建模工具。它們允許我們在一個虛擬的擁有豐富工具的交互 環(huán)境下建造復雜的真實的mesh,在這建造這些模型都是非常容易的。例如在游戲開發(fā) 中常用到的有3DSMaxightWave 3D,以及Maya。這些工具,當然能夠輸出創(chuàng)建好的mesh數(shù)據(jù)到文件中。因此,我們也能夠?qū)懸粋€文件 來提取在我們的3D應用程序中要用到的mesh數(shù)據(jù)。這的確是一種可行的解決辦法。 不過,還存在一個更方便的解決方案。它是一種叫做X文件的特殊mesh文件
43、格式(擴 展名為.X)。很多3D建模軟件都能輸出這種格式,當然這里存在一個將其他流行的mesh 文件轉(zhuǎn)換為X文件的過程。是什么使X文件這么便利呢?因為它是DirectX定義的格式, 并且D3DX庫很容易地支持X文件。D3DX庫提供了讀和寫X文件的函數(shù)。因此,如 果我們使用這種格式就避免了還要自己寫程序文件來讀/寫模型文件了游戲也采用X文件來進行場景的繪制,由于籃球場場景是一個復雜的兒何體,我 們可以采用3D建模軟件3ds Max來進行場景的建模,然后使用插件將模型從3ds Max 中導出為X文件。我們使用名為PandaDXExport的3ds Max插件將模型導出。如下圖所示:圖3.2 X文件
44、的導出導出后的模型包含了網(wǎng)格,材質(zhì)和貼圖等信息,我們要在程序中使用模型,就需要 把模型文件所包含的信息按文件格式載入內(nèi)存,在將其在程序中渲染出來。Direct3D庫提供了很多支持X文件的函數(shù),所以使用Direct3D可以很方便地使用X 文件。我們可以設計一個專門的模塊來對X文件進行操作,根據(jù)分析可以得到模塊的兒個 功能:1) X文件的加載2) X文件的保存3) X文件的繪制我們需要在模塊內(nèi)實現(xiàn)一個用于保存X文件的結(jié)構(gòu)體數(shù)組,模塊將載入的X文件 信息保存在結(jié)構(gòu)體數(shù)組中,然后可以通過數(shù)組的下標來對載入的模型進行選擇繪制。球體的繪制設計也采用Direct3D庫函數(shù)來進行實現(xiàn)。在函數(shù)中我們能定義球體的
45、半 徑,面數(shù)等屬性。但是使用庫函數(shù)并不為我們生成球體的貼圖坐標,我們必須采用手動的方式為球體的每點設置貼圖坐標,才能正確地將貼圖應用于球體模型。3. 4球體運動軌跡的設計球體在運動中每一幀都必須汁算當前的位置。然后再在訃算出的位置上進行球體的繪制,來體現(xiàn)球體的運動。由于球體運動軌跡為一條拋物線,所以可以利用拋物線公式來進行球體運動位置的計算。公式為:y = vO * sin a * t - 1/2 * g * t * t公示中X為物體在水平方向的位移,y為物體在垂直方向的位移,vO為物體的初速度, a為初速度與水平線之間的夾角,g為重力加速度,t為物體的運動時間。在程序中使用此公式,把球體運動
46、時間傳入公式中即可得到每一幀中球體的位置。3. 5游戲界面的設計界面是用戶與系統(tǒng)進行交互的渠道,好的UI系統(tǒng)能得到更好的用戶體驗。本系統(tǒng) 的界面包含輸入部分的界面和顯示提示信息的界面。輸入界面用來響應用戶的輸入,它接收用戶的輸入,再將輸入提交到系統(tǒng)中。然后系統(tǒng)能根據(jù)用戶的輸入來所需的操作。顯示提示信息界面可以提示用戶每次輸入完成后是否得分和在游戲結(jié)束后顯示用 戶的總得分。系統(tǒng)設計使用的輸入界面如下圖:圖3.4輸入界面圖右方小球在左圖十字架中先左右運動,獲得用戶輸入后,然后再上下運動,再次獲得用戶輸入后小球運動結(jié)束,本次輸入也結(jié)束。36得分判斷的設計每一次用戶輸入結(jié)束后,系統(tǒng)都需要進行判斷本次輸
47、入是否得分,再根據(jù)是否得分 進行相關的操作。游戲中得分的判斷是根據(jù)用戶輸入時,小球在十字架中的當前運動位置來決定的。 如下圖:圖3.5得分的判斷用戶在小球左右運動和上下運動時各輸入一次,如果兩次輸入時,小球的位置都處 在口線所標注的圓圈內(nèi)的話,則判斷得分,否則判斷失敗。3. 6攝像機的設計攝像機是用戶在游戲中的眼睛,攝像機看到的東西就為用戶在游戲中所看到的東 西。我們可以使用D3DXMatrixLookAtLH函數(shù)來計算視圖空間變換矩陣。這個函數(shù)對 于在固定位置布置和對準攝像機是非常好用的,不過它的用戶接口對于要響應用戶輸入 來實現(xiàn)攝像機移動就不那么好用了。這就激發(fā)我們用我們自己的方法來解決。
48、我們需要 設計一個Camera???,它使我們能夠比D3DXMatrixLookAtLH函數(shù)更好地操作攝像機。我們定義一個相對于世界坐標系的位置和攝像機的方向,這里使用四個攝像機向 量:right vector , up vector, look vector 以及 position vector,如圖 12所示。這些向量 用來為攝像機定義一個坐標系來描述在世界坐標中的對應關系。因為right , up和look 向量定義了攝像機在世界中的方向,我們有時把它們?nèi)齻€向量一起稱為方向向量(orientation vectors)。方向向量必須被標準化。假如彼此互相垂直且都是單位長度, 那么我們就稱它
49、們是正交標準化向量。我們做這些限制是因為等一會兒我們要將方向向 量插入到一個行矩陣中。因為行向量是正交標準化的,所以該矩陣也就是直交矩陣?;?憶一下,直交矩陣有一個特性就是它的逆矩陣等于它的轉(zhuǎn)置矩陣。圖3.6攝像機的向量描述有了這四個向量來描述攝像機,我們的攝像機就能夠按照下面六種方式變化了: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向量移動(move)通過這六種操作,我們能夠沿著三個軸移動以及饒著三個軸旋轉(zhuǎn),這給了我們
50、一個 六度的自由。4實現(xiàn)方案4.1主要功能模塊系統(tǒng)實現(xiàn)的主要模塊如下圖所示:圖4.1系統(tǒng)主要類圖4. 2三維向量的實現(xiàn)在三維坐標系每個點的表示都要用一個三維向量來表示,分別表示點在X, y, z軸方向 上的分量。本設計中對向量進行了實現(xiàn)。實現(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) 加號操作符重載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) 減號操作符重載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) 等號操作符重載if(this = &rhs) return氣his
53、;當右參為自己時,返回自己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)的實現(xiàn)本部分的具體在兩個類中實現(xiàn),D3DApplication類和GameApp類。D3DApplication 為基類,GameApp繼承于D3DApplication。D3DApplication類中的Init函
54、數(shù)實現(xiàn)了 Direct3D 的初始化和窗口的初始化工作。Setup和RenderOneF rame函數(shù)為虛函數(shù),可以在子類中 重新定義它們的具體實現(xiàn)。Setup中可以函數(shù)可以讓子類自己定義些初始化過程, RenderOneFrame為每一幀的渲染函數(shù),在每一次循環(huán)中被調(diào)用。D3DApplication類為系 統(tǒng)實現(xiàn)了一個基本的運行框架。D3DApplication中還包含了 一個D3DCamera類,D3DCamera的初始化也在Init函數(shù)中 實現(xiàn)。D3DCamera中實現(xiàn)了攝像漫游的功能。D3DApplication中Ru n函數(shù)實現(xiàn)的是系統(tǒng)的消息循環(huán),當窗口有Windows'
55、174;息時則處 理windows消息,當無消息處理時,則進行場景繪制,攝像機更新等操作。void Isabel:D3DApplication:Run()float time = 50/3;渲染間隔時間if(!this->Setup()return;MSG msg;:ZeroMemory(&msg, sizeof(MSG);DWORD oldtime = timeGetTime(); /獲得當前時間while(msg.message != WM_QUIT) /肖窗口消息不為退出消息時,一直循環(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)到達渲染間隔時間時,進行渲染oldtime = newtime;camera->updateCamera(0.036); 更新攝像機this->RenderOneFrame(0.036); 渲染物體)4. 4物理模塊的實現(xiàn)物理模塊為Ball類和PhysicSystem類,Ball中保存著球體的當前位置和當前速度等 屬性。PhysicS
57、ystem中可以對球體的速度和位置進行運算更新,CalculateBallPos函數(shù)中 運用了拋物線公式來進行球體軌跡的汁算,這個函數(shù)還可以根據(jù)用戶輸入是否得分來計 算球體軌跡,得分為一種運動軌跡,不得分為另一種運動軌跡。拋物線公式的具體實現(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游戲界面的實現(xiàn)界面部分山UlSystem類來具體實現(xiàn),UlSystem采用Direct3D中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年元器件測試儀器合作協(xié)議書
- 2025年硫精砂合作協(xié)議書
- 2025年農(nóng)業(yè)科學研究與試驗發(fā)展服務合作協(xié)議書
- 2025年二次加工材相關板材合作協(xié)議書
- 2024-2025學年四川省成都市崇州市四年級(上)期末數(shù)學試卷
- 2025年中國建設銀行企業(yè)網(wǎng)上銀行國際結(jié)算協(xié)議(2篇)
- 2025年親屬的股權(quán)轉(zhuǎn)讓協(xié)議范文(2篇)
- 2025年二手車帶牌轉(zhuǎn)讓協(xié)議模板(2篇)
- 2025年個人自建房購房合同標準版本(2篇)
- 2025年五年級1班第一學期班主任工作總結(jié)模版(2篇)
- 國際貨物運輸委托代理合同(中英文對照)全套
- 全面新編部編版四年級下冊語文教材解讀分析
- 江蘇農(nóng)牧科技職業(yè)學院單招《職業(yè)技能測試》參考試題庫(含答案)
- 三年級上冊脫式計算100題及答案
- VDA6.3 2023過程審核教材
- 烹飪實訓室安全隱患分析報告
- 《金屬加工的基礎》課件
- 運輸行業(yè)春節(jié)安全生產(chǎn)培訓 文明駕駛保平安
- 體驗式沙盤-收獲季節(jié)
- 老年護理陪護培訓課件
- 2019年420聯(lián)考《申論》真題(山西卷)試卷(鄉(xiāng)鎮(zhèn)卷)及答案
評論
0/150
提交評論