【文章內(nèi)容簡(jiǎn)介】
出的游戲,無一不是經(jīng)典,也就是說可以從物理系統(tǒng)的復(fù)雜程度上來簡(jiǎn)單區(qū)別一個(gè)游戲的好壞。計(jì)算機(jī)圖形學(xué)在動(dòng)畫的繪制上應(yīng)用廣泛,如人物的模型。繪制人物的動(dòng)畫模型,應(yīng)用于多種多樣的影視作品之中。但是,在電腦 3D 游戲中,角色的繪制是一個(gè)很難解決的事情,因?yàn)樯傻慕巧P捅仨氹S著輸入設(shè)備下達(dá)的指令隨時(shí)變化,同時(shí)也要和其余的人物產(chǎn)生互動(dòng)。這個(gè)時(shí)候,計(jì)算機(jī)的繪制科技就顯得尤為重要,一些成熟的技術(shù)可以應(yīng)對(duì)大型 3D 游戲的開發(fā),一些多層次的動(dòng)畫繪制技術(shù)卻變得更加困難。繪制手段通常有:幾何圖形的設(shè)計(jì),動(dòng)態(tài)繪畫方法和人物軀干的控制。(AI)AI 系統(tǒng)在游戲中是必不可少的,玩家在進(jìn)行游戲的過程有,會(huì)有很多的敵人,玩家的任務(wù)是與其進(jìn)行爭(zhēng)斗直到完成某些特定的任務(wù)。如果 AI 表現(xiàn)的過于疲軟,那么這個(gè)游戲?qū)ν婕业奈蜁?huì)降低,所以完善 AI 可以增加游戲的難度,吸引玩家在游戲上投入更多的時(shí)間。在游戲里,AI 操控著非玩家單位的行為, AI 有很多種類和很多手段去執(zhí)行,像腳本和硬編碼行為等等。 DirectXDirectX 是微軟公司生產(chǎn)的一個(gè)應(yīng)用程序接口的軟件,在設(shè)計(jì)研發(fā)交互式軟件中起了很重要的作用。它在 1995 年出現(xiàn),到現(xiàn)在已經(jīng)是研發(fā)多媒體系統(tǒng)軟件的金標(biāo)準(zhǔn),全部的研發(fā)成員都在應(yīng)用這個(gè)軟件進(jìn)行開發(fā)設(shè)計(jì)。DirectX 不僅僅應(yīng)用于游戲的研發(fā)還能夠設(shè)計(jì)一些軟件可以設(shè)計(jì)游戲中的角色,還可以設(shè)計(jì)一些關(guān)于網(wǎng)絡(luò)和圖形的軟件。API DirectX 包括 DirectGraphics,DirectInput,DirectPlay ,DirectMusic ,DirectSound 這些部分。每個(gè)部分都可以各自獨(dú)立運(yùn)行,進(jìn)行不同功能的運(yùn)作。它們都可以被硬件加速,也就是說能夠直接與硬件進(jìn)行數(shù)據(jù)交流,能夠給設(shè)計(jì)人員更好的操作條件。2.技術(shù)介紹 VC++開發(fā)語言如今,在開發(fā) 3D 游戲的過程中需要根據(jù)不同的要求來挑選相應(yīng)的開發(fā)語言。例如,在開發(fā)小型的 3D 游戲程序中,主流的軟件有:? 微軟公司的 Visual C++和 DirectX SDK 開發(fā)包? 微軟公司的 C和 XNA? Visual C++和 OpenGL在現(xiàn)在市面上許許多多的程序開發(fā)軟件中,有的在語言彈性和執(zhí)行的效率上有優(yōu)勢(shì),有的傾向處理和運(yùn)算圖形,有的傾向設(shè)計(jì)大型軟件,可以滿足設(shè)計(jì)人員的各種目的,各有各的特點(diǎn)。在這些軟件中 Visual C++和 DirectX SDK 這個(gè)由微軟公司出品的組合,在開發(fā) 3D 游戲中有著重要的作用,現(xiàn)在市面上的游戲幾乎都有DirectX 的程序,在這次的論文中,我也選擇這個(gè)組合來進(jìn)行開發(fā)。 Visual C++VC++是 Windows 平臺(tái)上的 C++編程環(huán)境,在 Windows 平臺(tái)上具有強(qiáng)大的優(yōu)勢(shì)。在 3D 圖形開發(fā)中更因?yàn)樽约赫Z言的特點(diǎn)具有無可比擬的優(yōu)勢(shì),具體體現(xiàn)在:(一)面向?qū)ο竺嫦驅(qū)ο罂梢哉f是 VC++最重要的特性。VC++語言的設(shè)計(jì)完全是面向?qū)ο蟮摹C++支持靜態(tài)和動(dòng)態(tài)風(fēng)格的代碼繼承及重用(二)底層調(diào)用VC++主要面向 Windows 系統(tǒng),可以方便實(shí)現(xiàn)一些底層的應(yīng)用。在 VC++中直接調(diào)用硬件等底層接口非常方便。在 3D 圖形開發(fā)中,直接調(diào)用顯卡而不是通過復(fù)雜的接口可以更高效的顯示圖形。(三)執(zhí)行效率高VC++的編譯和鏈接器具有非常高效的執(zhí)行效率,與同為微軟公司出品的 C語言相比,VC++的執(zhí)行效率比之要高出數(shù)倍以上。雖然 VC++不像 C一樣支持垃圾回收功能大大降低了開發(fā)效率,但這在 3D 游戲圖形程序開發(fā)中卻能使開發(fā)人員更好的處理內(nèi)存與指針,大大提高了執(zhí)行效率。(四)多線程 VC++支持多線程,多線程功能使得在一個(gè)程序里可同時(shí)執(zhí)行多個(gè)小任務(wù)。線程,有時(shí)也稱小進(jìn)程,是一個(gè)大進(jìn)程里分出來的小的獨(dú)立的進(jìn)程。(五)與 DirectX SDK 的無縫組合VC++與 DirectX SDK 均為微軟公司出品,且 DirectX SDK 中的所有源代碼均為C++語言編寫,在接口調(diào)用上它們存在的天然的優(yōu)勢(shì),這也說明了為什么在圖形游戲開發(fā)中它們一直是雷打不動(dòng)的組合。 DirectX SDKDirectX, (Direct eXtension,簡(jiǎn)稱 DX)是由微軟公司創(chuàng)建的多媒體編程接口。由 C++編程語言實(shí)現(xiàn),遵循 COM。被廣泛使用于 Microsoft Windows、Microsoft Xbox 和 Microsoft Xbox 360 電子游戲開發(fā),并且只能支持這些平臺(tái)。最新版本為DirectX 11,普及版本為 DirectX 。DirectX 是多種應(yīng)用程序接口(API)的集合,它可以讓 windows 為平臺(tái)的游戲或多媒體程序獲得更高的執(zhí)行效率。DirectX 包含有 Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects 等多個(gè)組件,它提供了一整套的多媒體接口方案。(一)Direct3D為大多數(shù)新視頻適配器內(nèi)置的 3D 調(diào)色功能提供界面。 Direct3D 是一種低級(jí)的 3D API,它為軟件程序提供一種獨(dú)立于設(shè)備之外的方法以便與加速器硬件進(jìn)行有效而強(qiáng)大的通信。Direct3D 包含專用 CPU 指令集支持,從而可為新型計(jì)算機(jī)提供進(jìn)一步加速支持。 (二)DirectSound為程序和音頻適配器的混音、聲音播放和聲音捕獲功能之間提供了鏈接。DirectSound 為多媒體軟件程序提供低延遲混合、硬件加速以及直接訪問聲音設(shè)備等功能。維護(hù)與現(xiàn)有設(shè)備驅(qū)動(dòng)程序的兼容性時(shí)提供該功能。 (三)DirectInput為游戲提供高級(jí)輸入功能并能處理游戲桿以及包括鼠標(biāo)、鍵盤和強(qiáng)力反饋游戲控制器在內(nèi)的其它相關(guān)設(shè)備的輸入。(四)DirectPlay支持通過調(diào)制解調(diào)器、Inter 或局域網(wǎng)連接游戲。DirectPlay 簡(jiǎn)化了對(duì)通信服務(wù)的訪問,并提供了一種能夠使游戲彼此通信的方法而不受協(xié)議或聯(lián)機(jī)服務(wù)的限制。DirectPlay 提供了多種游說服務(wù),可簡(jiǎn)化多媒體播放器游戲的初始化,同時(shí)還支持可靠的通信協(xié)議以確保重要游戲數(shù)據(jù)在網(wǎng)絡(luò)上不會(huì)丟失。(五)DirectShow提供了可在您的計(jì)算機(jī)與 Inter 服務(wù)器上進(jìn)行高品質(zhì)捕獲與回放多媒體文件的功能。DirectShow 支持各種音頻與視頻格式,包括“高級(jí)流式格式 (ASF)”、“音頻視頻交錯(cuò) (AVI)”、 “數(shù)字視頻 (DV)”、 “動(dòng)畫專家組 (MPEG)”、 “MPEG 音頻層 3 (MP3)”、 “Windows 媒體音頻/視頻 (WMA/WMV)”以及 WAV 文件。DirectShow 還具有視頻捕獲、DVD 回放、視頻編輯與混合、硬件加速視頻解碼以及調(diào)諧廣播模擬與數(shù)字電視信號(hào)等功能。 3DMAX簡(jiǎn)介3D 游戲系統(tǒng)中需要有大量 3D 模型的存在,對(duì)于 3D 模型的制作,3DMAX 當(dāng)然是首選。3D Studio Max,常簡(jiǎn)稱為 3ds Max 或 MAX,是 Autodesk 公司開發(fā)的基于 PC 系統(tǒng)的三維動(dòng)畫渲染和制作軟件。在應(yīng)用范圍方面,廣泛應(yīng)用于廣告、影視、工業(yè)設(shè)計(jì)、建筑設(shè)計(jì)、多媒體制作、游戲、輔助教學(xué)以及工程可視化等領(lǐng)域。擁有強(qiáng)大功能的 3DS MAX 被廣泛地應(yīng)用于電視及娛樂業(yè)中,比如片頭動(dòng)畫和視頻游戲的制作,深深扎根于玩家心中的勞拉角色形象就是 3DS MAX 的杰作。在影視特效方面也有一定的應(yīng)用。而在國(guó)內(nèi)發(fā)展的相對(duì)比較成熟的建筑效果圖和建筑動(dòng)畫制作中,3DS MAX 的使用率更是占據(jù)了絕對(duì)的優(yōu)勢(shì)。根據(jù)不同行業(yè)的應(yīng)用特點(diǎn)對(duì) 3DS MAX 的掌握程度也有不同的要求,建筑方面的應(yīng)用相對(duì)來說要局限性大一些,它只要求單幀的渲染效果和環(huán)境效果,只涉及到比較簡(jiǎn)單的動(dòng)畫;片頭動(dòng)畫和視頻游戲應(yīng)用中動(dòng)畫占的比例很大,特別是視頻游戲?qū)巧珓?dòng)畫的要求要高一些;影視特效方面的應(yīng)用則把 3DS MAX 的功能發(fā)揮到了極至。 3D游戲技術(shù)理論 3D圖形的基本成像流程傳統(tǒng)上 3D 圖形的處理方法是,將待顯示的 3D 物體(如杯子)表面微分為一個(gè)個(gè)小三角形面(這些三角形面的數(shù)量越多,顯示出來圖形效果越精致、光滑) 。每個(gè)三角形面就成為構(gòu)成 3D 復(fù)雜物件的基本圖元,它有 3 個(gè)頂點(diǎn)。這樣 3D 物件的繪制就轉(zhuǎn)換為逼近的微小三角形面的繪制,而 3D 物件的圖形方位數(shù)據(jù)就可用三角形的頂點(diǎn)坐標(biāo)值來存儲(chǔ)。3D 物體劃分為眾多的三角形面表示后,物體表面的圖形方位就可利用三角形面的頂點(diǎn)來確定。為了從數(shù)值上定量 3D 圖形的方位數(shù)據(jù),引入一個(gè)世界坐標(biāo)系,這樣每一個(gè)頂點(diǎn)均可準(zhǔn)確地用一個(gè)(x,y,z)坐標(biāo)定位出來,從而實(shí)現(xiàn) 3D 圖形的形數(shù)轉(zhuǎn)換。一般地,場(chǎng)景中的每個(gè)待顯示的 3D 物體都采用某個(gè)中心點(diǎn)作為原點(diǎn)來架設(shè)坐標(biāo)系,以給出每個(gè)逼近三角表頂點(diǎn)的坐標(biāo)值。畢竟,場(chǎng)景中的這些 3D 物體通常是各自先行創(chuàng)建出來的,例如,利用一些 3D 建模軟件取得的網(wǎng)格頂點(diǎn)數(shù)據(jù)就是基本這樣的坐標(biāo)系。這種坐標(biāo)系稱為局部坐標(biāo)系。在大多數(shù)情形下,局部坐標(biāo)系的 x、y 和 z 軸都與世界坐標(biāo)系 x、y 和 z 軸是相應(yīng)平行的。在一個(gè)預(yù)先設(shè)定的世界坐標(biāo)空間中,為每個(gè)局部坐標(biāo)系選定原點(diǎn)位置后,各個(gè)局部坐標(biāo)系的 3D 物體上的部分三角形的頂點(diǎn)坐標(biāo),就可通過簡(jiǎn)單的平移計(jì)算轉(zhuǎn)換為世界坐標(biāo)系下的坐標(biāo)。這里,局部坐標(biāo)系和世界坐標(biāo)系不可以脫離開來理解,否則這個(gè)局部坐標(biāo)系的點(diǎn)坐標(biāo)無法準(zhǔn)確地用統(tǒng)一的坐標(biāo)系(世界坐標(biāo)系)的坐標(biāo)值來表示。三角形面的頂點(diǎn)(x,y,z)坐標(biāo)值已成功解決了 3D 物體表面的位置定位問題,要保存 3D 物體的顏色值等頂點(diǎn)信息可用 VC++語言的結(jié)構(gòu)體來表示。當(dāng)頂點(diǎn)的顏色值確定以后,三角形面的內(nèi)部點(diǎn)的顏色值就可以通過某種插值方法計(jì)算出來,從而整個(gè) 3D 物體表面上的點(diǎn)的顏色值也就確定下來了。此外,考慮到光照對(duì) 3D 物體表面顏色的影響,通常需要根據(jù)具體的三角形面的頂點(diǎn)坐標(biāo)數(shù)據(jù),計(jì)算出頂點(diǎn)處的法向量。因?yàn)橐粋€(gè)頂點(diǎn)往往是多個(gè)鄰接三角形面的公共交點(diǎn),因此,頂點(diǎn)處的法向量通常是一個(gè)平均法向量。世界坐標(biāo)系局部坐標(biāo)系 2局部坐標(biāo)系 1圖 世界坐標(biāo)系與局部坐標(biāo)系的關(guān)系 圖 頂點(diǎn)的法向量把頂點(diǎn)的法向量和光線的方向向量作某種數(shù)學(xué)運(yùn)算,就可修正該頂點(diǎn)光源貢獻(xiàn)的實(shí)際顏色值。由此,頂點(diǎn)的結(jié)構(gòu)體必須添加一個(gè)反映其上法向量的變量域。這一步通常需要將網(wǎng)絡(luò)化的 3D 物體從各自的局部坐標(biāo)系中放入同一個(gè)世界坐標(biāo)系中,并通過相應(yīng)的數(shù)學(xué)計(jì)算(平移變換)得出 3D 物體在世界坐標(biāo)系中的頂點(diǎn)坐標(biāo),并按光照模型計(jì)算出每個(gè)頂點(diǎn)的顏色值。從以上的討論很自然地引出如下的幾個(gè)待解決的 3D 數(shù)學(xué)問題:平移坐標(biāo)變換的坐標(biāo)計(jì)算問題。已知點(diǎn)在一個(gè)坐標(biāo)系下的坐標(biāo)值,計(jì)算在另一個(gè)平移坐標(biāo)系下的新坐標(biāo)。法向量的計(jì)算,如何根據(jù)已知的三個(gè)點(diǎn)坐標(biāo),計(jì)算出所在平面的法向量。點(diǎn)和向量的統(tǒng)一表示,尋找一種可以統(tǒng)一三維空間中點(diǎn)和向量的表示方法,使得點(diǎn)和向量的坐標(biāo)計(jì)算在形式上能統(tǒng)一起來,并且保證運(yùn)算上的形式簡(jiǎn)潔。三維場(chǎng)景的空間范圍可以是無限的,計(jì)算機(jī)屏幕的大小卻是有限的。因而不可能,也不需要把三維場(chǎng)景中的物體同時(shí)在有限的屏幕上全部顯示出來。這就要求對(duì)三維場(chǎng)景進(jìn)行必要的可視范圍的選擇。顯然這是符合人對(duì)周圍環(huán)境觀察特性的,不同角度、不同距離看同一景致,會(huì)產(chǎn)生不同的視覺圖像。于是,就有必要在世界坐標(biāo)系中引入一個(gè)觀察者來確定當(dāng)前哪些場(chǎng)景物體應(yīng)該被顯示出來。這個(gè)觀察者也可以理解為照相機(jī)或攝影機(jī)。觀察者可由世界坐標(biāo)系中的一個(gè)點(diǎn)和一個(gè)指示觀察方向的向量來決定。如圖 所示。從觀察者位置出主,沿著視線的觀察方向可構(gòu)造一個(gè)棱錐體的視覺區(qū)域,此時(shí),再通過一個(gè)遠(yuǎn)平面和一個(gè)近平面進(jìn)行截割,形成一個(gè)去除了錐頭的棱臺(tái)體,這個(gè)棱臺(tái)體就是觀察進(jìn)的可見區(qū)域范圍。如圖 所示,其中遠(yuǎn)平面和近平面又稱為遠(yuǎn)視截圖和近視截圖。而棱臺(tái)體又稱為視截體。遠(yuǎn)視截面近視截面觀察者圖 決定觀察可風(fēng)區(qū)域的視截體垂直視角 a除了遠(yuǎn)、近兩個(gè)視截面限制了可見范圍的縱深外,還需要利用視域的垂直視角a 來限制在垂直方向上張開的視角區(qū)域大小。至于視域的寬度限制則不使用角度來說明,而是采用任一截平面的寬高比率 Aspect 來指定。為了不使透視投影后的圖像在計(jì)算機(jī)屏幕上顯示時(shí)產(chǎn)生比例失真,Aspect 一般取值為屏幕的寬高比,即Aspect=顯示器屏幕寬度/顯示器屏幕高度。視截體確定以后,下一步就要對(duì)三維物體的哪些三角形面需要顯示出來或部分顯示出來,哪些三角形面由于位于視截體外而不需要進(jìn)行顯示進(jìn)行計(jì)算分析,這個(gè)過程稱為三維剪裁。觀察者及其觀察方向圖 世界坐標(biāo)系下的觀察者位置及觀察方向?yàn)榱朔奖闳S剪裁的處理,首先需要對(duì)視截體的 6 個(gè)面(左側(cè)面、右側(cè)面、頂面、底面、近視截面和遠(yuǎn)視截面)的坐標(biāo)方程進(jìn)行簡(jiǎn)化。為此,在觀察者處建立一個(gè)所謂的攝影坐標(biāo)系,并使其 z 軸方向指向觀察方向,如圖 所示。xyz圖 攝影坐標(biāo)系在攝影坐標(biāo)系下,左側(cè)面、右側(cè)面、頂面和底面由于都經(jīng)這坐標(biāo)原點(diǎn),因此它們的坐標(biāo)方程都簡(jiǎn)化為一個(gè)齊次方程(如 ax+by+c=0) ,而近視和遠(yuǎn)視截面的方程式更簡(jiǎn)單,為 z=n 和 z=f 的形式,這也是選擇 z 軸指向觀察方向的原因。這里,自然也會(huì)提出如下 4 個(gè) 3D 數(shù)學(xué)問題:如何從數(shù)學(xué)上描述攝影坐標(biāo)系與世界坐標(biāo)系的關(guān)系。已知的世界坐標(biāo)系下的點(diǎn)的坐標(biāo)在攝影坐標(biāo)系下的坐標(biāo)值應(yīng)如何計(jì)算出來。已知在攝影坐標(biāo)系下的視截體的 6 個(gè)面的方程式,如何逆向計(jì)算出這些面在世界坐標(biāo)系下的方程。在攝影坐標(biāo)系下,如