基于DirectX的第一人稱射擊游戲制作_第1頁
基于DirectX的第一人稱射擊游戲制作_第2頁
基于DirectX的第一人稱射擊游戲制作_第3頁
基于DirectX的第一人稱射擊游戲制作_第4頁
基于DirectX的第一人稱射擊游戲制作_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

./北京郵電大學(xué)世紀(jì)學(xué)院畢業(yè)設(shè)計<論文>題目基于DirectX的第一人稱射擊游戲制作學(xué)號000學(xué)生姓名專業(yè)名稱通信工程所在系〔院通信與信息工程指導(dǎo)教師20XX6月1日.北京郵電大學(xué)世紀(jì)學(xué)院畢業(yè)設(shè)計〔論文任務(wù)書姓名學(xué)號通信工程系〔院通信與信息工程設(shè)計〔論文題目基于DirectX的第一人稱射擊游戲制作題目分類□工程設(shè)計;■工程技術(shù)研究;□軟件工程〔如CAI課題等;□專題研究;□藝術(shù)設(shè)計;□其他題目來源□自然科學(xué)基金與部、省、市級以上科研課題;□企、事業(yè)單位委托課題;□院級課題;■自擬課題□其他指導(dǎo)教師〔指導(dǎo)教師組組長及成員姓名職稱工作單位備注李江軍講師北郵信通院指導(dǎo)老師畢業(yè)設(shè)計<論文>的內(nèi)容和要求:[注意:選題盡量與實際應(yīng)用需求相結(jié)合。要求寫明本設(shè)計〔論文所涉及的分析方法或技術(shù)手段〔如定性、定量分析的方法;要求有學(xué)生獨立的見解,設(shè)計內(nèi)容要詳細(xì)寫明具體步驟和技術(shù)指標(biāo)]。開發(fā)一個簡單的第一人稱射擊游戲:1游戲規(guī)劃,包括角色模型,菜單界面等;2創(chuàng)建和使用紋理和光照,增加對硬件光照和紋理的支持;3在程序中增加對腳本和GUI的支持;4用邊界框和邊界球為游戲加入碰撞檢測;5通過Directinput為游戲引擎加入輸入檢測功能,檢測來自鍵盤,鼠標(biāo)等設(shè)備的輸入;6使用DirectSound和DirectMucic播放聲音,創(chuàng)建3D攝像機系統(tǒng)。應(yīng)完成的工作和提交材料要求〔課題完成后應(yīng)提交成果的種類、數(shù)量、質(zhì)量等方面的要求:開題報告:3000字左右;論文的中文摘要:200-300字左右,包含關(guān)鍵詞,并譯成英文。英文摘要以250個左右實詞為宜;論文正文不少于15000字;可執(zhí)行文件及源代碼;盡量結(jié)合課題,翻譯1500漢字以上的有關(guān)技術(shù)資料或?qū)I(yè)文獻;參考文獻中,主要的文獻應(yīng)達到10篇以上,其中外文文獻在2篇以上。主要參考文獻〔參考文獻不少于4篇,參考文獻目錄按GB/T7714—2005的要求填寫:[1]左魯梅.三維圖形引擎中的關(guān)鍵技術(shù)研究[D].北京:北京理工大學(xué),2009:21~30[2]孫家廣.計算機圖形學(xué)[M].清華大學(xué)出版社.2008:50~70[3]王鴿鴿.三維引擎的研究與實現(xiàn)[D].XX:東北大學(xué).2008:20~50[4]房曉溪.游戲引擎教程[M].中國水利水電出版社,2008:30~40[5]葉至軍.VisualC++/DirectX93D游戲開發(fā)導(dǎo)引DirectX9gameprogrammingtutorials.[M].人民郵電出版社,2006:50~60[6]陳卡.DirectX93D圖形程序設(shè)計[M].上??茖W(xué)技術(shù)出版社,2003:25~55[7]AllenSherrod.DirectX游戲開發(fā)終極指南UltimategameprogrammingwithDirectX[M].清華大學(xué)出版社,2008:56~67[8]拉莫澤.3D游戲編程大師技巧[M].人民郵電出版社,2005:77~80[9]DavidM.Bourg&GlennSeemann.游戲開發(fā)中的人工智能AIforgamedevelopers[M].東南大學(xué)出版社,2006:102~130[10]Finney.K.C..3D游戲開發(fā)大全[M].清華大學(xué)出版社,2007:25~46[11]DonaldE.Knuth.TheArtofComputerProgrammingVolume1:FundamentalAlgorithms,ThirdEdition[M].計算機程序設(shè)計的藝術(shù),卷1:基本算法.北京:機械工業(yè)出版社,2008:10~17[12]FrankBuschmann,RegineMeunier,HansRohnert,PeterSommerlad,MichaelStal.Pattern-OrientedSoftwareArchitectureVolume1[J].ASystemofPatterns.面向模式的軟件體系結(jié)構(gòu),卷1:模式系統(tǒng).福亮,皚等譯.北京:機械工業(yè)出版社,2000:22~29畢業(yè)設(shè)計〔論文進度計劃〔從正式啟動時間開始,以周為單位填寫:指導(dǎo)教師簽字:日期:年月日教學(xué)單位意見審核人簽字:系〔院〔蓋章年月日學(xué)院意見審核專家簽章年月日備注1、由指導(dǎo)教師撰寫,可根據(jù)長度加頁,一式三份,教務(wù)處、系〔院各留存一份,發(fā)給學(xué)生一份,任務(wù)完成后附在論文內(nèi);2、凡審核不通過的任務(wù)書,請重新申報。北京郵電大學(xué)世紀(jì)學(xué)院畢業(yè)設(shè)計〔論文誠信聲明本人聲明所呈交的畢業(yè)設(shè)計〔論文,題目《基于DCT的數(shù)字水印技術(shù)的研究與實現(xiàn)》是本人在指導(dǎo)教師的指導(dǎo)下,獨立進行研究工作所取得的成果,除了文中特別加以標(biāo)注和致謝中所羅列的內(nèi)容以外,畢業(yè)設(shè)計〔論文中不包含其他人已經(jīng)發(fā)表或撰寫過的研究成果,也不包含為獲得北京郵電大學(xué)或其他教育機構(gòu)的學(xué)位或證書而使用過的材料。申請學(xué)位論文與資料若有不實之處,本人承擔(dān)一切相關(guān)責(zé)任。本人簽名:日期:畢業(yè)設(shè)計〔論文使用權(quán)的說明本人完全了解北京郵電大學(xué)世紀(jì)學(xué)院有關(guān)保管、使用論文的規(guī)定,其中包括:①學(xué)校有權(quán)保管、并向有關(guān)部門送交學(xué)位論文的原件與復(fù)印件;②學(xué)??梢圆捎糜坝?、縮印或其它復(fù)制手段復(fù)制并保存論文;③學(xué)??稍试S論文被查閱或借閱;④學(xué)??梢詫W(xué)術(shù)交流為目的,復(fù)制贈送和交換學(xué)位論文;⑤學(xué)??梢怨紝W(xué)位論文的全部或部分內(nèi)容。本人簽名:日期:指導(dǎo)教師簽名:日期:.題目基于DirectX的第一人稱射擊游戲制作摘要如今,3D科技得到了突飛猛進的發(fā)展,把計算機顯示的領(lǐng)域帶進了一個新的高度,其中,3D廣泛地應(yīng)用于游戲制作中。市面上受到消費者歡迎的游戲往往是利用成熟的3D技術(shù)設(shè)計開發(fā)的游戲,這種游戲能帶給消費者更多真實的感受,帶玩家進入如同真實的虛擬世界。像一些大型的3D游戲,已經(jīng)成了游戲界的傳說,比如射擊游戲使命召喚系列。出于對3D游戲的熱愛,我選擇了以DirectX軟件入手,來研究如何設(shè)計開發(fā)一款第一人稱射擊游戲。在此過程中,以下幾個技術(shù)起到了至關(guān)重要的作用:〔1游戲的總體規(guī)劃,包括角色的模型和游戲的菜單界面等?!?在游戲中加入紋理和光照,并且增加對硬件的紋理和光照的支持?!?在程序中加入腳本與GUI?!?應(yīng)用邊界框與邊界球技術(shù)在游戲中添加碰撞測試?!?利用Directinput把外界設(shè)備,例如鍵盤鼠標(biāo),加入到游戲的控制中?!?利用DirectSound與DirectMusic添加聲音,并且加入3D攝像機系統(tǒng)。關(guān)鍵詞第一人稱射擊游戲DirectX規(guī)劃紋理和光照腳本與GUI邊界框與邊界球DirectinputDirectSound與DirectMusicTitleDesignafirstpersonshootinggamebasedonDirectXAbstractInthiscontemporarysociety,3dtechnologyhasdevelopedconsiderably,leadingcomputerdisplaytechnologyadvancingtoahigherposition.Meanwhile,itisusedindesignofgames.Recently,ahostofgameswhichareprevalentinthegamemarketareappliedmature3dtechnologytoprocess.Itisanindisputablefactthatthiskindofgamecouldgivegamersmorerealsensesandformavirtualworldwhichisquitereal.Somelarge3Dgames,suchascallofduty,havebecomethelegendinthegamesfield.Becauseoftheinterestin3Dgames,IchosetoresearchhowtodesignandproduceaFPSgameviatheDirectXsoftware.Duringtheresearch,someaspectsareextremelyvital.Designthegameplan,includingrolemodelsaswellasmenuinterfaces,etc.Createandusethetextureandlighttoincreasethesupportoflightandthetexturetothehardware.IncreasethescriptandGUIintheprogram.IncreasecollisiondetectioningamesviatheboundaryboxandboundaryballAddinputdetectionfunctionforthegameenginethroughtheDirectinput,detectingtheinputfromthekeyboardandmouse.UseDirectSoundandDirectMusictoplaysoundsandcreatea3Dcamerasystem.KeywordsFPSgamesDirectXplantextureandlightscriptandGUIboundaryboxandboundaryballDirectinputDirectSoundandDirectMusic目錄1.前言11.1課題來源11.2國內(nèi)外現(xiàn)狀2游戲引擎2渲染2輸入3聲音3物理3動畫4人工智能〔AI41.2.8DirectX42.技術(shù)介紹52.1VC++開發(fā)語言52.1.1VisualC++52.1.2DirectXSDK62.23DMAX簡介72.33D游戲技術(shù)理論72.3.13D圖形的基本成像流程7世界坐標(biāo)系8攝影坐標(biāo)系92.3.4剪裁和透視投影112.43D游戲技術(shù)數(shù)學(xué)基礎(chǔ)132.4.1向量142.4.2矩陣142.4.3坐標(biāo)變換143.系統(tǒng)架構(gòu)設(shè)計203.1系統(tǒng)簡介203.2架構(gòu)設(shè)計與功能分析224.系統(tǒng)引擎設(shè)計234.1系統(tǒng)引擎架構(gòu)模型234.2DIRECTX3D數(shù)學(xué)庫23向量25矩陣26四元組264.2.4射線274.2.5平面274.2.6三角形和多邊形274.3DIRECTX3D光照27光源284.3.2反射模型294.3.3在DirectX3D中創(chuàng)建光照與材質(zhì)模型294.3.4引擎中增加對光照的支持314.4DIRECTX3D紋理32創(chuàng)建使用紋理334.4.2引擎中增加對紋理的支持344.5DIRECTX3D文本和圖形用戶界面364.5.1DirectX3D文本36創(chuàng)建和顯示圖形用戶界面374.5.3引擎中增加對文本和GUI的支持404.6DIRECTX3D特效41多采樣424.6.2霧424.6.3粒子系統(tǒng)434.6.4引擎中增加對特效的支持444.7基本腳本系統(tǒng)45屬性腳本系統(tǒng)45命令腳本系統(tǒng)494.7.3令牌流504.7.4引擎中添加對腳本系統(tǒng)的支持524.8碰撞檢測524.8.1邊界框52邊界球544.8.3引擎中添加對碰撞檢測的支持564.9輸入檢測和響應(yīng)584.9.1DirectInput的實現(xiàn)584.9.2引擎中添加對DirectInput的支持594.10模型加載614.113D攝像機系統(tǒng)625.系統(tǒng)實現(xiàn)655.1系統(tǒng)設(shè)計目標(biāo)655.2組織資源655.3加載和顯示最終場景675.4攝像機移動和碰撞檢測705.5游戲元素725.6角色設(shè)定745.7部署運行786.總結(jié)79致謝80參考文獻81.1.前言1.1課題來源總得來說,設(shè)計開發(fā)一款游戲在現(xiàn)在是一個擁有著無限潛力和激情的產(chǎn)業(yè),尤其這十幾年來,游戲產(chǎn)業(yè)正在飛速發(fā)展。開發(fā)游戲是一個高難度的工作,極具挑戰(zhàn)性,同時,它也能為那些愿意付出汗水與勞動并且喜歡挑戰(zhàn)自己的游戲開發(fā)人員許多的回報。游戲從設(shè)計到出產(chǎn)是個復(fù)雜的過程,它需要許多愿意付出汗水的人一起工作。在這部分人中,往往有負(fù)責(zé)編程的,負(fù)責(zé)寫劇本的,做音樂特效的,設(shè)計數(shù)學(xué)和物理模型的還有其他工作成員。每個成員需要做的事情都不一樣,遇到的難度和擁有的獎賞也不一樣。游戲這個行業(yè)從出現(xiàn)之后,到現(xiàn)在已經(jīng)完善的十分迅速,現(xiàn)今的游戲產(chǎn)業(yè)能夠與電影電視這樣的傳統(tǒng)行業(yè)相比肩,并且在娛樂市場中占據(jù)很大的比例。與此同時,游戲行業(yè)的科技和生產(chǎn)效率也不斷在改善,它能夠創(chuàng)造上百億美元的利益。作為游戲行業(yè)中的發(fā)展迅速的電腦游戲,在這個行業(yè)中已經(jīng)有數(shù)十年的歷史了。游戲在市場上擁有的用戶群體也很廣泛,以成年人為主要的消費群體,同時也照顧了小孩子的市場,所以其的利益是個很可觀的數(shù)字。游戲的從設(shè)計到出產(chǎn)的過程,不是像玩游戲的那種總是充滿著輕松和刺激的感覺。應(yīng)用開發(fā)交互式軟件設(shè)計游戲是一項困難并且極富挑戰(zhàn)性的工作,任何對其不重視的人都不可能會順利完成工作。但是,這個過程同樣的也充滿樂趣,只不過要求工作成員奉獻出更多的汗水和努力。有很多人因為喜歡玩游戲而選擇開發(fā)游戲,但是等他們真正開發(fā)游戲的時候,卻因為困難太多而放棄了。在這個過程中,最為艱難的東西就是去學(xué)會應(yīng)用設(shè)計一款游戲所需要的技術(shù)手段。去了解應(yīng)用一些基本的手段需要花費大量的時間與精力,不過此過程也會為設(shè)計人員打下堅牢的基礎(chǔ),再加上對游戲行業(yè)充滿激情和興趣,相信開發(fā)出精品的產(chǎn)品不是問題。在這篇論文中,我對開發(fā)一款第一人稱設(shè)計游戲進行了研究,利用DirectX軟件,從設(shè)計一款游戲的總體規(guī)劃,游戲中的紋理和光照,程序中的腳本和GUI,邊界框與邊界球技術(shù),Directinput與外界接入設(shè)備,DirectSound與DirectMusic這兩個和聲音的應(yīng)用并且附加了3D攝像機系統(tǒng)這幾個方面對游戲進行了相關(guān)的分析。1.2國內(nèi)外現(xiàn)狀游戲引擎引擎是由許多的代碼組成的,它能夠給開發(fā)游戲的成員提供一個良好的平臺?,F(xiàn)在的引擎往往隱藏了一部分底層實現(xiàn)的具體代碼。比如利用Direct3D設(shè)計的渲染引擎,它能夠?qū)κ褂盟娜穗[藏了具體的渲染引擎細(xì)節(jié)。游戲的引擎有:渲染,物理,聲音等等。游戲的引擎其實就是由很多小引擎集合而成的。其包含的東西沒有一個準(zhǔn)確的意義。拿電腦游戲來說,它的引擎肯定涵蓋了渲染和輸入,要不然就不能叫做交互式的游戲。引擎的獨立開發(fā)是個艱難的工作,在游戲的開發(fā)中,所需要的一些基本的在DirectX的API基礎(chǔ)上開發(fā)的引擎有渲染引擎,利用DirectInput的輸入引擎,利用DirectSound的聲音引擎,包括碰撞運動的物理引擎,動畫引擎還有AI引擎。其中引擎的代碼涵蓋了建立出錯日志,執(zhí)行命令,基本的肩膀能力與圖形用戶界面〔GUI系統(tǒng),GUI系統(tǒng)在設(shè)計主菜單和裝載場景的時候有用。引擎的分析開發(fā)在設(shè)計游戲中必不可少,因為在開發(fā)設(shè)計游戲引擎中,它可以操控游戲中各種各樣的元素,如,游戲引擎中的語言算法不僅僅能夠收到并且分析外界設(shè)備對其輸入的指令,也可以根據(jù)運算對視頻音頻和特效進行控制,所以無論游戲是什么形式〔2D還是3D,角色扮演,即時策略,冒險解密或者是動作射擊,引擎的設(shè)計都是必不可少的一部分。開發(fā)游戲的最早部分就是構(gòu)建一個理想的引擎框架,也能這么理解,分析設(shè)計引擎是對3D游戲的流水線進行概括的分析。在第一人稱視角游戲的引擎設(shè)計過程中,可以改變光線的照射和裁剪的順序來降低工作量或改善運行效率。渲染計算機圖形學(xué)被廣泛應(yīng)用于許多領(lǐng)域中,大量前沿的渲染手段應(yīng)用在交互式設(shè)備中,原來僅僅局限在離線設(shè)備中,這是因為當(dāng)今的硬件技術(shù)能夠分析各種各樣的圖形。并且,渲染科技的發(fā)展使其不僅僅使用在CPU上,也可以在GPU上?,F(xiàn)在,人們可以使用一種預(yù)計算手段把游戲中的圖片模型排列得更加繁瑣。這個技術(shù)現(xiàn)在可以自動高亮出不動的目標(biāo),但是對于正在變化位置的目標(biāo)來說還不夠成熟?,F(xiàn)在的硬件采用各種各樣的上色方法,對目標(biāo)上色。渲染是一款游戲引擎里最重要的系統(tǒng)。這個系統(tǒng)能夠在顯示器畫出幾何圖案,浮現(xiàn)文本,渲染GUI,展現(xiàn)硬件的光照系統(tǒng)。與此同時,它還可以把圖形附加在場景里面的幾何圖案表面。輸入在開發(fā)游戲的過程中,做好檢測輸入的工作是十分重要的。在這里,應(yīng)用DirectX中的DirectInputAPI能夠檢測多種設(shè)備的輸入,并且不會有錯誤的發(fā)生。對進行輸入的設(shè)備,就要對其進行輸入測試,比如鍵盤鼠標(biāo)等等。DirectInput上的接口能夠檢查出各種各樣的輸入設(shè)備?,F(xiàn)在市面上,鍵盤鼠標(biāo)和游戲的控制器作為主要的輸入設(shè)備。游戲的控制器包括像方向盤搖桿這些不是鼠標(biāo)也不是鍵盤的設(shè)備。完善游戲的輸入系統(tǒng)就是要對這些編寫代碼并且進行檢測,要在游戲中能夠使用這些設(shè)備。1.2.4聲音在DirectX軟件中,主要應(yīng)用DirectSound來在游戲的引擎中出來聲音。DirectSound為DirectX中的一個API,它的職責(zé)是處理所有聲音。聲音系統(tǒng)實際上是作為一個比較小的系統(tǒng)存在于一個游戲的引擎之中,它利用比較少的代碼就能夠控制所有的聲音。游戲引擎里的聲音在游戲的背景音樂與3D音效中使用,根據(jù)游戲的需要,可能涵蓋了一些戰(zhàn)斗的聲音和根據(jù)不同場景出現(xiàn)的不同聲音。聲音都是在文件之中裝載的,可以進行完整的裝載或者是以流進行播放,比如用DirectSound可以處理聲音的回放。1.2.5物理物理系統(tǒng)包括了許多的東西,主要是架構(gòu)3D游戲的現(xiàn)實和分解功能。物理是3D游戲的基礎(chǔ),所以成為了設(shè)計人員必備的基礎(chǔ)知識。在第一人稱設(shè)計游戲中,需要涵蓋重力與碰撞測試的物理學(xué)內(nèi)容。游戲中的物理學(xué)不僅僅是數(shù)學(xué),還有工作的狀況和運行方式?,F(xiàn)在許多游戲都良好的運用物理學(xué)在游戲中,比如使命召喚系列,這貌似把游戲產(chǎn)業(yè)的入門門檻拉高了。游戲中的物理學(xué)給游戲帶來了很多東西,比如改變物理性質(zhì)能夠重新設(shè)計人與環(huán)境交互的情形??梢哉f一些復(fù)雜的物理系統(tǒng)的研發(fā)工作非?;ㄙM時間和金錢,但是以這個物理系統(tǒng)設(shè)計出的游戲,無一不是經(jīng)典,也就是說可以從物理系統(tǒng)的復(fù)雜程度上來簡單區(qū)別一個游戲的好壞。1.2.6動畫計算機圖形學(xué)在動畫的繪制上應(yīng)用廣泛,如人物的模型。繪制人物的動畫模型,應(yīng)用于多種多樣的影視作品之中。但是,在電腦3D游戲中,角色的繪制是一個很難解決的事情,因為生成的角色模型必須隨著輸入設(shè)備下達的指令隨時變化,同時也要和其余的人物產(chǎn)生互動。這個時候,計算機的繪制科技就顯得尤為重要,一些成熟的技術(shù)可以應(yīng)對大型3D游戲的開發(fā),一些多層次的動畫繪制技術(shù)卻變得更加困難。繪制手段通常有:幾何圖形的設(shè)計,動態(tài)繪畫方法和人物軀干的控制。人工智能〔AIAI系統(tǒng)在游戲中是必不可少的,玩家在進行游戲的過程有,會有很多的敵人,玩家的任務(wù)是與其進行爭斗直到完成某些特定的任務(wù)。如果AI表現(xiàn)的過于疲軟,那么這個游戲?qū)ν婕业奈蜁档?所以完善AI可以增加游戲的難度,吸引玩家在游戲上投入更多的時間。在游戲里,AI操控著非玩家單位的行為,AI有很多種類和很多手段去執(zhí)行,像腳本和硬編碼行為等等。1.2.8DirectXDirectX是微軟公司生產(chǎn)的一個應(yīng)用程序接口的軟件,在設(shè)計研發(fā)交互式軟件中起了很重要的作用。它在1995年出現(xiàn),到現(xiàn)在已經(jīng)是研發(fā)多媒體系統(tǒng)軟件的金標(biāo)準(zhǔn),全部的研發(fā)成員都在應(yīng)用這個軟件進行開發(fā)設(shè)計。DirectX不僅僅應(yīng)用于游戲的研發(fā)還能夠設(shè)計一些軟件可以設(shè)計游戲中的角色,還可以設(shè)計一些關(guān)于網(wǎng)絡(luò)和圖形的軟件。APIDirectX包括DirectGraphics,DirectInput,DirectPlay,DirectMusic,DirectSound這些部分。每個部分都可以各自獨立運行,進行不同功能的運作。它們都可以被硬件加速,也就是說能夠直接與硬件進行數(shù)據(jù)交流,能夠給設(shè)計人員更好的操作條件。2.技術(shù)介紹2.1VC++開發(fā)語言如今,在開發(fā)3D游戲的過程中需要根據(jù)不同的要求來挑選相應(yīng)的開發(fā)語言。例如,在開發(fā)小型的3D游戲程序中,主流的軟件有:微軟公司的VisualC++和DirectXSDK開發(fā)包微軟公司的C#和XNAVisualC++和OpenGL在現(xiàn)在市面上許許多多的程序開發(fā)軟件中,有的在語言彈性和執(zhí)行的效率上有優(yōu)勢,有的傾向處理和運算圖形,有的傾向設(shè)計大型軟件,可以滿足設(shè)計人員的各種目的,各有各的特點。在這些軟件中VisualC++和DirectXSDK這個由微軟公司出品的組合,在開發(fā)3D游戲中有著重要的作用,現(xiàn)在市面上的游戲幾乎都有DirectX的程序,在這次的論文中,我也選擇這個組合來進行開發(fā)。2.1.1VisualC++VC++是Windows平臺上的C++編程環(huán)境,在Windows平臺上具有強大的優(yōu)勢。在3D圖形開發(fā)中更因為自己語言的特點具有無可比擬的優(yōu)勢,具體體現(xiàn)在:〔一面向?qū)ο竺嫦驅(qū)ο罂梢哉f是VC++最重要的特性。VC++語言的設(shè)計完全是面向?qū)ο蟮?。VC++支持靜態(tài)和動態(tài)風(fēng)格的代碼繼承及重用〔二底層調(diào)用VC++主要面向Windows系統(tǒng),可以方便實現(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++支持多線程,多線程功能使得在一個程序里可同時執(zhí)行多個小任務(wù)。線程,有時也稱小進程,是一個大進程里分出來的小的獨立的進程?!参迮cDirectXSDK的無縫組合VC++與DirectXSDK均為微軟公司出品,且DirectXSDK中的所有源代碼均為C++語言編寫,在接口調(diào)用上它們存在的天然的優(yōu)勢,這也說明了為什么在圖形游戲開發(fā)中它們一直是雷打不動的組合。2.1.2DirectXSDKDirectX,〔DirecteXtension,簡稱DX是由微軟公司創(chuàng)建的多媒體編程接口。由C++編程語言實現(xiàn),遵循COM。被廣泛使用于MicrosoftWindows、MicrosoftXbox和MicrosoftXbox360電子游戲開發(fā),并且只能支持這些平臺。最新版本為DirectX11,普及版本為DirectX9.0c。DirectX是多種應(yīng)用程序接口〔API的集合,它可以讓windows為平臺的游戲或多媒體程序獲得更高的執(zhí)行效率。DirectX包含有DirectGraphics<Direct3D+DirectDraw>、DirectInput、DirectPlay、DirectSound、DirectShow、DirectSetup、DirectMediaObjects等多個組件,它提供了一整套的多媒體接口方案。〔一Direct3D為大多數(shù)新視頻適配器內(nèi)置的3-D調(diào)色功能提供界面。Direct3D是一種低級的3-DAPI,它為軟件程序提供一種獨立于設(shè)備之外的方法以便與加速器硬件進行有效而強大的通信。Direct3D包含專用CPU指令集支持,從而可為新型計算機提供進一步加速支持?!捕﨑irectSound為程序和音頻適配器的混音、聲音播放和聲音捕獲功能之間提供了鏈接。DirectSound為多媒體軟件程序提供低延遲混合、硬件加速以及直接訪問聲音設(shè)備等功能。維護與現(xiàn)有設(shè)備驅(qū)動程序的兼容性時提供該功能?!踩鼶irectInput為游戲提供高級輸入功能并能處理游戲桿以及包括鼠標(biāo)、鍵盤和強力反饋游戲控制器在內(nèi)的其它相關(guān)設(shè)備的輸入?!菜腄irectPlay支持通過調(diào)制解調(diào)器、Internet或局域網(wǎng)連接游戲。DirectPlay簡化了對通信服務(wù)的訪問,并提供了一種能夠使游戲彼此通信的方法而不受協(xié)議或聯(lián)機服務(wù)的限制。DirectPlay提供了多種游說服務(wù),可簡化多媒體播放器游戲的初始化,同時還支持可靠的通信協(xié)議以確保重要游戲數(shù)據(jù)在網(wǎng)絡(luò)上不會丟失。〔五DirectShow提供了可在您的計算機與Internet服務(wù)器上進行高品質(zhì)捕獲與回放多媒體文件的功能。DirectShow支持各種音頻與視頻格式,包括"高級流式格式<ASF>"、"音頻-視頻交錯<AVI>"、"數(shù)字視頻<DV>"、"動畫專家組<MPEG>"、"MPEG音頻層3<MP3>"、"Windows媒體音頻/視頻<WMA/WMV>"以及WAV文件。DirectShow還具有視頻捕獲、DVD回放、視頻編輯與混合、硬件加速視頻解碼以及調(diào)諧廣播模擬與數(shù)字電視信號等功能。2.23DMAX簡介3D游戲系統(tǒng)中需要有大量3D模型的存在,對于3D模型的制作,3DMAX當(dāng)然是首選。3DStudioMax,常簡稱為3dsMax或MAX,是Autodesk公司開發(fā)的基于PC系統(tǒng)的三維動畫渲染和制作軟件。在應(yīng)用范圍方面,廣泛應(yīng)用于廣告、影視、工業(yè)設(shè)計、建筑設(shè)計、多媒體制作、游戲、輔助教學(xué)以及工程可視化等領(lǐng)域。擁有強大功能的3DSMAX被廣泛地應(yīng)用于電視及娛樂業(yè)中,比如片頭動畫和視頻游戲的制作,深深扎根于玩家心中的勞拉角色形象就是3DSMAX的杰作。在影視特效方面也有一定的應(yīng)用。而在國內(nèi)發(fā)展的相對比較成熟的建筑效果圖和建筑動畫制作中,3DSMAX的使用率更是占據(jù)了絕對的優(yōu)勢。根據(jù)不同行業(yè)的應(yīng)用特點對3DSMAX的掌握程度也有不同的要求,建筑方面的應(yīng)用相對來說要局限性大一些,它只要求單幀的渲染效果和環(huán)境效果,只涉及到比較簡單的動畫;片頭動畫和視頻游戲應(yīng)用中動畫占的比例很大,特別是視頻游戲?qū)巧珓赢嫷囊笠咭恍?;影視特效方面的?yīng)用則把3DSMAX的功能發(fā)揮到了極至。2.33D游戲技術(shù)理論2.3.13D圖形的基本成像流程傳統(tǒng)上3D圖形的處理方法是,將待顯示的3D物體〔如杯子表面微分為一個個小三角形面〔這些三角形面的數(shù)量越多,顯示出來圖形效果越精致、光滑。每個三角形面就成為構(gòu)成3D復(fù)雜物件的基本圖元,它有3個頂點。這樣3D物件的繪制就轉(zhuǎn)換為逼近的微小三角形面的繪制,而3D物件的圖形方位數(shù)據(jù)就可用三角形的頂點坐標(biāo)值來存儲。2.3.2世界坐標(biāo)系3D物體劃分為眾多的三角形面表示后,物體表面的圖形方位就可利用三角形面的頂點來確定。為了從數(shù)值上定量3D圖形的方位數(shù)據(jù),引入一個世界坐標(biāo)系,這樣每一個頂點均可準(zhǔn)確地用一個<x,y,z>坐標(biāo)定位出來,從而實現(xiàn)3D圖形的形數(shù)轉(zhuǎn)換。一般地,場景中的每個待顯示的3D物體都采用某個中心點作為原點來架設(shè)坐標(biāo)系,以給出每個逼近三角表頂點的坐標(biāo)值。畢竟,場景中的這些3D物體通常是各自先行創(chuàng)建出來的,例如,利用一些3D建模軟件取得的網(wǎng)格頂點數(shù)據(jù)就是基本這樣的坐標(biāo)系。這種坐標(biāo)系稱為局部坐標(biāo)系。在大多數(shù)情形下,局部坐標(biāo)系的x、y和z軸都與世界坐標(biāo)系x、y和z軸是相應(yīng)平行的。在一個預(yù)先設(shè)定的世界坐標(biāo)空間中,為每個局部坐標(biāo)系選定原點位置后,各個局部坐標(biāo)系的3D物體上的部分三角形的頂點坐標(biāo),就可通過簡單的平移計算轉(zhuǎn)換為世界坐標(biāo)系下的坐標(biāo)。這里,局部坐標(biāo)系和世界坐標(biāo)系不可以脫離開來理解,否則這個局部坐標(biāo)系的點坐標(biāo)無法準(zhǔn)確地用統(tǒng)一的坐標(biāo)系〔世界坐標(biāo)系的坐標(biāo)值來表示。三角形面的頂點<x,y,z>坐標(biāo)值已成功解決了3D物體表面的位置定位問題,要保存3D物體的顏色值等頂點信息可用VC++語言的結(jié)構(gòu)體來表示。當(dāng)頂點的顏色值確定以后,三角形面的內(nèi)部點的顏色值就可以通過某種插值方法計算出來,從而整個3D物體表面上的點的顏色值也就確定下來了。此外,考慮到光照對3D物體表面顏色的影響,通常需要根據(jù)具體的三角形面的頂點坐標(biāo)數(shù)據(jù),計算出頂點處的法向量。因為一個頂點往往是多個鄰接三角形面的公共交點,因此,頂點處的法向量通常是一個平均法向量。世界坐標(biāo)系世界坐標(biāo)系局部坐標(biāo)系2局部坐標(biāo)系1圖2.1世界坐標(biāo)系與局部坐標(biāo)系的關(guān)系圖2.2頂點的法向量把頂點的法向量和光線的方向向量作某種數(shù)學(xué)運算,就可修正該頂點光源貢獻的實際顏色值。由此,頂點的結(jié)構(gòu)體必須添加一個反映其上法向量的變量域。這一步通常需要將網(wǎng)絡(luò)化的3D物體從各自的局部坐標(biāo)系中放入同一個世界坐標(biāo)系中,并通過相應(yīng)的數(shù)學(xué)計算〔平移變換得出3D物體在世界坐標(biāo)系中的頂點坐標(biāo),并按光照模型計算出每個頂點的顏色值。從以上的討論很自然地引出如下的幾個待解決的3D數(shù)學(xué)問題:1、平移坐標(biāo)變換的坐標(biāo)計算問題。已知點在一個坐標(biāo)系下的坐標(biāo)值,計算在另一個平移坐標(biāo)系下的新坐標(biāo)。2、法向量的計算,如何根據(jù)已知的三個點坐標(biāo),計算出所在平面的法向量。3、點和向量的統(tǒng)一表示,尋找一種可以統(tǒng)一三維空間中點和向量的表示方法,使得點和向量的坐標(biāo)計算在形式上能統(tǒng)一起來,并且保證運算上的形式簡潔。2.3.3攝影坐標(biāo)系三維場景的空間范圍可以是無限的,計算機屏幕的大小卻是有限的。因而不可能,也不需要把三維場景中的物體同時在有限的屏幕上全部顯示出來。這就要求對三維場景進行必要的可視范圍的選擇。顯然這是符合人對周圍環(huán)境觀察特性的,不同角度、不同距離看同一景致,會產(chǎn)生不同的視覺圖像。于是,就有必要在世界坐標(biāo)系中引入一個觀察者來確定當(dāng)前哪些場景物體應(yīng)該被顯示出來。這個觀察者也可以理解為照相機或攝影機。觀察者可由世界坐標(biāo)系中的一個點和一個指示觀察方向的向量來決定。如圖2.3所示。觀察者及其觀察方向觀察者及其觀察方向圖2.3世界坐標(biāo)系下的觀察者位置及觀察方向從觀察者位置出主,沿著視線的觀察方向可構(gòu)造一個棱錐體的視覺區(qū)域,此時,再通過一個遠(yuǎn)平面和一個近平面進行截割,形成一個去除了錐頭的棱臺體,這個棱臺體就是觀察進的可見區(qū)域范圍。如圖2.4所示,其中遠(yuǎn)平面和近平面又稱為遠(yuǎn)視截圖和近視截圖。而棱臺體又稱為視截體。遠(yuǎn)視截面遠(yuǎn)視截面近視截面觀察者圖2.4決定觀察可風(fēng)區(qū)域的視截體垂直視角a除了遠(yuǎn)、近兩個視截面限制了可見范圍的縱深外,還需要利用視域的垂直視角a來限制在垂直方向上張開的視角區(qū)域大小。至于視域的寬度限制則不使用角度來說明,而是采用任一截平面的寬高比率Aspect來指定。為了不使透視投影后的圖像在計算機屏幕上顯示時產(chǎn)生比例失真,Aspect一般取值為屏幕的寬高比,即Aspect=顯示器屏幕寬度/顯示器屏幕高度。視截體確定以后,下一步就要對三維物體的哪些三角形面需要顯示出來或部分顯示出來,哪些三角形面由于位于視截體外而不需要進行顯示進行計算分析,這個過程稱為三維剪裁。為了方便三維剪裁的處理,首先需要對視截體的6個面〔左側(cè)面、右側(cè)面、頂面、底面、近視截面和遠(yuǎn)視截面的坐標(biāo)方程進行簡化。為此,在觀察者處建立一個所謂的攝影坐標(biāo)系,并使其z軸方向指向觀察方向,如圖2.5所示。xxyz圖2.5攝影坐標(biāo)系在攝影坐標(biāo)系下,左側(cè)面、右側(cè)面、頂面和底面由于都經(jīng)這坐標(biāo)原點,因此它們的坐標(biāo)方程都簡化為一個齊次方程〔如ax+by+c=0,而近視和遠(yuǎn)視截面的方程式更簡單,為z=n和z=f的形式,這也是選擇z軸指向觀察方向的原因。這里,自然也會提出如下4個3D數(shù)學(xué)問題:1、如何從數(shù)學(xué)上描述攝影坐標(biāo)系與世界坐標(biāo)系的關(guān)系。2、已知的世界坐標(biāo)系下的點的坐標(biāo)在攝影坐標(biāo)系下的坐標(biāo)值應(yīng)如何計算出來。3、已知在攝影坐標(biāo)系下的視截體的6個面的方程式,如何逆向計算出這些面在世界坐標(biāo)系下的方程。4、在攝影坐標(biāo)系下,如何將6個視截體的面的法向量計算出來。2.3.4剪裁和透視投影三維視截體的剪裁并不是獨立進行的,而是結(jié)合透視投影來進行的。透視投影就是將三維物體按照透視幾何的方法投影到一個平面上,從而實現(xiàn)三維圖形到二維圖形的轉(zhuǎn)化。例如,在z=1的位置上,可建立一個投影窗口,對于視截體內(nèi)的任一點P,它的透視投影對應(yīng)點P’為OP線段與投影窗口的交點,如圖6所示。遠(yuǎn)視截面遠(yuǎn)視截面近視截面觀察者O圖2.6投影窗口和透視投影投影窗口z=1xyzPP’從幾何特性看,對于同等大小的物體〔如三角形面,透視投影把更遠(yuǎn)處的物體投影得更小,即具有"近大遠(yuǎn)小"的特別,完全符合人的視覺感受。顯然,透視投影只需要對那些們于視截體內(nèi)的三角形面的頂點進行投影,這意味著投影前要對頂點是否位于視截體內(nèi)進行判斷,即進行剪裁處理,以減少不必要的計算。只有位于視截體內(nèi)未被剪裁掉的頂點才進行透視投影。為了簡化剪裁的判斷處理,實際并不采用圖2.6所示的透視投影,而是尋找一個具有透視投影性質(zhì),同時又可將視截體轉(zhuǎn)換為立方體的變換,從而使頂點是否在視截體內(nèi)的判斷,變?yōu)轫旤c的坐標(biāo)分量x、y和z是否分別介于區(qū)間[-1,1]、[-1,0]和[0,1]的判斷。滿足這種性質(zhì)的變換又稱為齊次投影剪裁變換。以二維剪裁為例〔不難推廣到三維情形,如圖2.7所示,假設(shè)剪裁區(qū)域由一個正方形來決定,圖中有3個三角形,最左側(cè)的三角形3個頂點都位于正方形內(nèi),因此這個三角形應(yīng)該被顯示出來。而最右側(cè)的三角形頂點均不在正方形內(nèi),因此被剪裁掉不顯示。中間的三角形部分位于正方形區(qū)域內(nèi)〔1個頂點在正方形內(nèi),2個頂點在外,因此通過求交取得三角形邊與正方形右邊線段交戰(zhàn),從而確定出新的三角形ABC被顯示到屏幕上。AABC圖2.7二維剪裁由于上面的剪裁區(qū)域為一個規(guī)則的矩形,因此點是否落在矩形內(nèi)是很容易判斷的。相反,如果直接以攝影空間中的視截體為剪裁區(qū)域,那么必須計算棱臺6個面的法向量,然后通過點向量與法向量的點積運算結(jié)果〔正數(shù)或負(fù)數(shù)來判斷點在棱臺內(nèi)或棱臺外。因此,將視截體棱臺轉(zhuǎn)制為立方體對于剪裁處理是十分必要的。當(dāng)便于剪裁處理的透視投影變換選定后,就可以攝影空間中三維物體的各個微分三角形面頂點坐標(biāo)進行投影變換計算,得到每個頂點的新坐標(biāo)值,其中。這樣集合可表示出頂點在平面上投影情況,而仍可反映出頂點的縱深度。為了更直觀地看待這個可將視截體轉(zhuǎn)換為立方體的透視投影的作用,可想象在攝影空間的三維物體的頂點都被投影到一個平面上〔可理解為投影窗口,它的頂點坐標(biāo)可從上同的獲得,而在每個投影頂點都關(guān)聯(lián)著一個表示原來頂點的縱深度的坐標(biāo)值。2.43D游戲技術(shù)數(shù)學(xué)基礎(chǔ)三維物體從取景到投影,需要經(jīng)過一系列的坐標(biāo),才能生成二維的圖形數(shù)據(jù)加以顯示。因此,變換后的坐標(biāo)計算就成了三維圖形淡定中的一個基本數(shù)學(xué)問題。例如,三角形面的頂點的坐標(biāo)變換計算、三角形面的法向量的變換計算以及視截體的平面方程的計算等。在三維圖形開發(fā)中,三維的點和向量實際是采用四維向量或來統(tǒng)一處理的,這樣,才可以將各種變換的式子用齊次的矩陣形式表示出來。下面除了要介紹向量和矩陣的基本數(shù)學(xué)運算外,還將具體計算坐標(biāo)系的平衡、縮放和旋轉(zhuǎn)變換的矩陣。2.4.1向量在物理學(xué)的研究中,一些既有大小,又有方向的量,如力、速度等物理量,用一條有方向的線段〔有向線段來表示。這個有向線段就是向量,又稱為矢量。雖然向量是一個與坐標(biāo)系無關(guān)的幾何量,但是可以引入坐標(biāo)系來加以研究。如果將方向相同、大小相等的向量定義為相等的向量,那么可將向量的起始點移到原點處,其箭頭所在的端點的坐標(biāo)或三維坐標(biāo)系下的將與向量一一對應(yīng),從而在坐標(biāo)系下的向量可用一組標(biāo)量坐標(biāo)值或給出,實現(xiàn)了向量由形到數(shù)的轉(zhuǎn)變。向量的坐標(biāo)表示對于游戲開發(fā)來說是必需的,在世界坐標(biāo)系下或攝影坐標(biāo)系下的三角形面的法線、光線的方向和觀察者的方向等都是通過向量的坐標(biāo)形式來準(zhǔn)確給出的。甚至還要根據(jù)真實空間〔二維或三維的特性,從已知的向量出發(fā)計算某一新向量的各個坐標(biāo)值。2.4.2矩陣在線性方程組的求解上,變元較少的方程組〔如僅有兩個未知數(shù)和的方程組的解很容易表達出來,但是推廣到較為復(fù)雜的更多變元的情形,如何推測方程組的解以及如何用的式子表達出來,引發(fā)了對行列式的提出和研究。行列式實質(zhì)上是方陣數(shù)據(jù)的一種運算,由此自然地想到,可對一般陣列數(shù)據(jù)定義代數(shù)運算,就像對向量定義運算一樣。這樣是矩陣運算的產(chǎn)生歷史。矩陣的出現(xiàn)使得方程組的求解可用矩陣的運算來演繹,求解過程更為簡潔。矩陣的另一個常見應(yīng)用就是用來表示坐標(biāo)系平移、旋轉(zhuǎn)變換后,點或向量的新舊坐標(biāo)對應(yīng)關(guān)系。這就是矩陣對3D開發(fā)的關(guān)鍵所在,因為開發(fā)中往往涉及到世界坐標(biāo)系、攝影坐標(biāo)系和投影坐標(biāo)系之間的坐標(biāo)變換計算。2.4.3坐標(biāo)變換坐標(biāo)變換可以用兩種不同觀點去理解。以幾何點的坐標(biāo)變換為例,一種觀點是保持幾何點空間位置不變,在空間中建立新的坐標(biāo)系〔例如將原來的坐標(biāo)系平行移動到新的位置,要求計算出該點在新坐標(biāo)系的坐標(biāo)。另一種觀點是保持坐標(biāo)系不變,幾何點移動到新的位置處,要求計算新位置處幾何點的坐標(biāo)。兩種觀點在不同的應(yīng)用場合各有方便之處。在世界坐標(biāo)系已知的情況下,建立攝影坐標(biāo)系,以簡化視截體的平面方程,又或利用透視投影變換將三維的圖形數(shù)據(jù)轉(zhuǎn)換為二維的圖形數(shù)據(jù),都是涉及到新、舊兩個坐標(biāo)系的轉(zhuǎn)換,此時采用坐標(biāo)系變換的第一種觀點去理解比較適合;當(dāng)3D游戲中的精靈在三維場景中移動時,則采用點移動的第二種比較適于思考。下面將結(jié)合以上兩種觀點來介紹平移、縮放和旋轉(zhuǎn)這3個最基本的變換?!惨黄揭谱儞Q考慮某一坐標(biāo)系下的任意一點,在坐標(biāo)系中任選一點,建立一個新的坐標(biāo)系,各坐標(biāo)軸正向平行于軸?,F(xiàn)在需要求出點在新坐標(biāo)系下的坐標(biāo)。如圖2.8,構(gòu)造3個向量來推導(dǎo)出點在下的坐標(biāo)。由空間幾何的向量性質(zhì)得式<2-1>: <2-1>圖2.8平移坐標(biāo)變換圖2.8平移坐標(biāo)變換O’Oxx’yy’zz’P從而,展開向量的坐標(biāo)分量取得如下的方程組<2-2>: <2-2>于是,,。由此可以看到,坐標(biāo)系可看成是坐標(biāo)系平行移動而來的,其中軸方向平移單位,軸方向平移單位,軸方向平移單位。在這種坐標(biāo)系的平移變換下,點的坐標(biāo)變換關(guān)系工是將相應(yīng)的、和坐標(biāo)值減少對應(yīng)的平移單位大小。再考慮在中選定一點,建立另一個平移坐標(biāo)系,那么點在這個下的坐標(biāo)滿足式<2-3>: <2-3>這里,,。顯然,以上變換式子還需要進一步轉(zhuǎn)換為關(guān)于和的齊次等式來表示,才可以簡化連續(xù)多個變換〔包括將要介紹的旋轉(zhuǎn)變換下的坐標(biāo)關(guān)系式??梢岳镁仃噷⒋说仁綐?gòu)造出來。為此,先將點與一個四維向量一一對應(yīng)起來,然后,可根據(jù)等式建立如下等價的齊次關(guān)系等式<2-4>。 <2-4>等式右邊的矩陣稱為平移變換矩陣,它由坐標(biāo)系平移到點的坐標(biāo)值來決定,可簡單表示為,如式<2-5>。 <2-5>三維向量和三維的點都可以用四維向量統(tǒng)一表示出來。四維向量的第4個分量又稱為齊次坐標(biāo),四維向量的空間則稱為齊次空間。以上平移坐標(biāo)變換,是計算原有坐標(biāo)系中的點和向量在新坐標(biāo)系中的坐標(biāo)。如果采用同一個坐標(biāo)系下,點或向量的平行移動觀點去理解平移變換,即一個點或向量〔隨著坐標(biāo)軸平行移動到一個新的位置,要求計算該點或向量的新坐標(biāo)值,那么相當(dāng)于求出在原坐標(biāo)系中的坐標(biāo)。因此,平移后的點或向量的坐標(biāo)值將使用如下的矩陣來計算〔相差一個負(fù)號。如式<2-6>。 <2-6>上面的矩陣就是DirectX平移變換所使用的矩陣。通常三維物體已在它的局部坐標(biāo)系中建立了各個頂點的坐標(biāo),繪制該三維物體時,需要先移入世界坐標(biāo)系中。此時,可想象該三維物體的局部坐標(biāo)系的原點與世界坐標(biāo)系的原點重合,然后通過平等移動,將三維物體移入世界坐標(biāo)系。這樣就可應(yīng)用上面的矩陣,計算三維物體網(wǎng)絡(luò)中的頂點在世界坐標(biāo)系的新坐標(biāo)?!捕糯罂s小變換計算機屏幕上的視口坐標(biāo)系與世界坐標(biāo)系等三維空間的坐標(biāo)系的度量是不同的,最終把三維圖形顯示在計算機屏幕上,需要進行坐標(biāo)放大縮小。所謂的坐標(biāo)系放大縮小變換就是指保持坐標(biāo)系的原有位置不變,僅改變坐標(biāo)軸的單位長度的大小來建立新的坐標(biāo)系。坐標(biāo)系中一點,當(dāng)坐標(biāo)系的單位長度調(diào)整以后,點在的坐標(biāo)顯然也會發(fā)生改變。當(dāng)然還可采用保持坐標(biāo)系不變的觀點去理解縮放變換,即同一個坐標(biāo)系中的點、和坐標(biāo)值分別縮放一個比例數(shù)值、和,以產(chǎn)生一個新的點,該點的坐標(biāo)可通過如下的變換矩陣計算出來,這個矩陣就是DirectX使用的縮放矩陣。如式<2-7>。 <2-7>〔三旋轉(zhuǎn)變換最后一個基本的坐標(biāo)變換為坐標(biāo)軸的旋轉(zhuǎn)變換。如圖2.9所示的旋轉(zhuǎn)可看作是平面繞軸旋轉(zhuǎn)一個角,然后將平面繞軸旋轉(zhuǎn)一個角,最后將平面繞軸旋轉(zhuǎn)一個角。也就是說,任意一個旋轉(zhuǎn)變換的矩陣等于這3個繞、和軸旋轉(zhuǎn)變換矩陣的乘積。xxx’yy’zz’圖2.9坐標(biāo)系的旋轉(zhuǎn)下面給出繞、和軸旋轉(zhuǎn)的變換矩陣、和?!餐茖?dǎo)略繞軸變換矩陣為 <2-8>繞軸變換矩陣為 <2-9>繞軸變換矩陣為 <2-10>〔四平面將三維物體表面剖分為一系列的三角形面,物體的光照亮度處理就轉(zhuǎn)化為對這些平面三角形的照明處理,從而可簡單地通過平面三角形面的法向量與光的入射方向的夾角,來確定各種入射光對平面上每一點所貢獻的亮度值。此外,隨著程序的運行,觀察角度不斷發(fā)生改變,這就需要重新判斷三維場景中哪些物體處于視截體之內(nèi),要對視截體的6個側(cè)面的法向量進行計算,以此通過點與法向量的點積運算決定點在平面的哪一側(cè)。由于三維游戲通常需要對平面方程式及平面上的法向量進行計算,因此DirectX提供了相應(yīng)的結(jié)構(gòu)體和函數(shù)來支持與平面有關(guān)的計算。3.系統(tǒng)架構(gòu)設(shè)計3.1系統(tǒng)簡介本系統(tǒng)是一個第一人稱射擊游戲的程序,是為了在學(xué)習(xí)的基礎(chǔ)上設(shè)計一個擁有一些基本功能的游戲場景,同時讓玩家可如身臨其境般操作游戲內(nèi)的人物進行各種動作,也為我自己今后在這方面的學(xué)習(xí)打下基礎(chǔ)。本系統(tǒng)完成后的截圖如下:圖3.1場景截圖1圖3.2場景截圖2圖3.3場景截圖3本系統(tǒng)要實現(xiàn)的功能模塊主要有:一、Win32程序的執(zhí)行二、光照處理三、紋理處理四、文本和圖形處理五、特效處理六、系統(tǒng)腳本的處理七、系統(tǒng)內(nèi)物體間的碰撞檢測八、輸入檢測與響應(yīng)九、3D模型的加載與場景管理十、系統(tǒng)進行的目標(biāo)實現(xiàn)3.2架構(gòu)設(shè)計與功能分析為了充分實現(xiàn)代碼的重復(fù)利用,擬將本游戲分為兩部分設(shè)計,游戲的主程序部分與游戲引擎部分。引擎部分提供實現(xiàn)第一人稱射擊游戲的各種接口供游戲主程序部分調(diào)用,同時先可以發(fā)布生成.lib文件供其它程序調(diào)用;游戲主程序部分實現(xiàn)系統(tǒng)的主界面部分,同時調(diào)用引擎接口實現(xiàn)游戲的各種設(shè)置與特效。雙方的關(guān)系如圖3.4。圖3.4系統(tǒng)關(guān)系圖4.系統(tǒng)引擎設(shè)計4.1系統(tǒng)引擎架構(gòu)模型游戲引擎主要實現(xiàn)整個游戲中光照、紋理、文本和圖形、特效、系統(tǒng)腳本、碰撞檢測、輸入檢測與響應(yīng)及3D模型的加載與場景管理等模塊的功能,同時,為了實現(xiàn)上述的功能,必須首先實現(xiàn)一個3D數(shù)學(xué)庫,提供對向量、矩陣四元組等的支持。具體的功能關(guān)系見圖4.1:圖4.1系統(tǒng)引擎各部分關(guān)系圖4.2DirectX3D數(shù)學(xué)庫3D游戲的核心就是數(shù)學(xué),數(shù)學(xué)可用于計算渲染的場景,移動游戲角色和物體,實現(xiàn)物理學(xué)的真實仿真,控制人工智能及大量人們認(rèn)為理所當(dāng)然的東西。正如上一章所介紹的數(shù)學(xué)知識,矢量、矩陣、四元組、射線、平面、多邊形和簡單的物理學(xué),都是需要關(guān)注的東西。本節(jié)的目標(biāo)是建立一個可供程序調(diào)用的數(shù)學(xué)庫,來進行各式各樣的3D運算。各部分具體的關(guān)系如圖4.2:圖4.23D數(shù)學(xué)庫內(nèi)部關(guān)系圖首先要介紹的是MathDefines.h頭文件,該文件保存了所有的define語句,這些語句是數(shù)學(xué)庫、引擎及程序都要用到的內(nèi)容。這些define語句包含了π<圓周率,圓的周長與直徑的比值>的定義、平面結(jié)果和將度轉(zhuǎn)換成弧度的宏。程序代碼如下:#ifndef_UGP_MATH_DEF_H_#define_UGP_MATH_DEF_H_#defineUGP_FRONT0#defineUGP_BACK1#defineUGP_ON_PLANE2#defineUGP_CLIPPED3#defineUGP_CULLED4#defineUGP_VISIBLE5#ifndefPI#endif//將度轉(zhuǎn)換成弧度#defineGET_RADIANS<degree><float><degree/180.0f*PI>#endif接下來是MathLibrary.h頭文件,該頭文件保存所有與數(shù)學(xué)相關(guān)的include語句。包括對矢量、矩陣、面、多邊形等實現(xiàn)文件的引用。程序代碼如下:#ifndef_UGP_MATH_LIBRARY_H_#define_UGP_MATH_LIBRARY_H_#include"Vector.h"http://向量<即矢量>相關(guān)#include"Matrix.h"http://矩陣相關(guān)#include"Quaternion.h"http://四元組相關(guān)#include"Physics.h"http://物理學(xué)相關(guān)classCRay;//射線類classCPlane;//平面類classCPolygon;//多邊形類#include"Ray.h"#include"Plane.h"#include"Polygon.h"#include"MathDefines.h"#endif向量如前所述,向量是3D游戲開發(fā)中涉及的最基本對象。3D向量保存在3D空間中指定位置的3個軸上。這些軸分別是x軸、y軸和z軸,分別代表空間中的寬度、高度和深度。這些值可對3D環(huán)境中的任意物體定位。3D向量是一個包含三個浮點數(shù)的結(jié)構(gòu)。3D數(shù)學(xué)庫中有關(guān)向量的部分在引擎GameEngine項目中文件Vector.h與Vector.cpp中定義和實現(xiàn)。在這兩個文件中除了定義了向量在VC++中結(jié)構(gòu)體的表示方法外,還包括向量長度、點積、叉積、向量歸一化的計算,以及Direct3D向量的定義和各種數(shù)學(xué)運算。為其它部分調(diào)用向量計算提供基礎(chǔ)。矩陣在計算機圖形學(xué)中,諸如矩陣這樣的對象可以控制物體的位置和旋轉(zhuǎn)。矩陣是浮點數(shù)的2D數(shù)組,可以對矢量進行平移、旋轉(zhuǎn)、縮放和變換。從根本上講,矩陣是由行和列構(gòu)成的表。矩陣有多種形式,如3×3、3×4和4×4。這里矩陣的數(shù)分別代表2D數(shù)組包含的行數(shù)和列數(shù)。例如,4×4矩陣由16個元素組成,因為4×4矩陣有4行,4列<4×4=16>。3D數(shù)學(xué)庫中有關(guān)矩陣的部分在引擎GameEngine項目中文件Matrix.h與Matrix.cpp中定義和實現(xiàn)。在這兩個文件中除了定義了矩陣的在VC++中的表示方法外,還包括4×4矩陣的乘法、轉(zhuǎn)置和旋轉(zhuǎn)計算,以及Direct3D矩陣內(nèi)置對象和函數(shù)的初始化。四元組旋轉(zhuǎn)是3D編程中最常用的操作之一。旋轉(zhuǎn)用于改變物體方向,或是繞著場景中某個軸或具體的點轉(zhuǎn)動,并且可以移動骨骼動畫中要用到的骨架點。正因為旋轉(zhuǎn)如此重要,所以提高它們的精確度、速度和效率具有很重要的意義。例如,就骨骼動畫而言,存儲效率和速度對系統(tǒng)也許是最重要的兩個要素,這是由系統(tǒng)的復(fù)雜性和存儲旋轉(zhuǎn)數(shù)據(jù)所需的內(nèi)存就決定的。曾有一段時間使用矩陣實現(xiàn)旋轉(zhuǎn),出現(xiàn)過問題。這主要是因為使用矩陣會消耗大量內(nèi)存和運算時間,甚至在某些時候會產(chǎn)生Gimblelock問題而無法準(zhǔn)確計算旋轉(zhuǎn)結(jié)果。而四元組是4D數(shù)學(xué)對象,并不是4D矢量,但能當(dāng)作4D矢量對待。它充分解決了使用矩陣轉(zhuǎn)換的缺點。用四元組計算會得到更平滑的計算結(jié)果,更準(zhǔn)確的旋轉(zhuǎn),而不會受到Gimblelock的影響。3D數(shù)學(xué)庫中有關(guān)四元組的部分在引擎GameEngine項目中文件Quaternion.h與Quaternion.cpp中定義和實現(xiàn)。在這兩個文件中除了定義了四元組在VC++中結(jié)構(gòu)體的表示方法外,還包括四元組點積、長度、乘法等的計算。4.2.4射線射線是包含原點<位置>和方向的結(jié)構(gòu)。射線主要在查看兩個平面是否發(fā)生碰撞,或相互之間可能會出現(xiàn)碰撞時做碰撞檢測使用。同樣,可以通過鼠標(biāo)使用射線來選擇對象。計算機圖形學(xué)中射線的另一種用途是實現(xiàn)一種名為射線跟蹤的渲染技術(shù)。簡單地講,射線跟蹤是在場景中發(fā)射射線,并確定哪一根射線擊中了哪一個物體。3D數(shù)學(xué)庫中有關(guān)射線的部分在引擎GameEngine項目中文件Ray.h與Ray.cpp中定義和實現(xiàn)。在這兩個文件中定義了射線在VC++中結(jié)構(gòu)體的表示方法。4.2.5平面平面是一個無限擴展的區(qū)域。是3D場景中的核心部分,如果沒有平面,將無法進行諸如幾何圖形選擇和碰撞檢測等操作。3D數(shù)學(xué)庫中有關(guān)平面的部分在引擎GameEngine項目中文件Plane.h與Plane.cpp中定義和實現(xiàn)。在這兩個文件中定義了平面在VC++中結(jié)構(gòu)體的表示方法以及計算三角形法線,判斷平面與平面、平面與射線間是否相交,點與平面的關(guān)系,點與平面的距離等計算的實現(xiàn)。同時,它們也實現(xiàn)了Direct3D平面的初始化操作。4.2.6三角形和多邊形Direct3D應(yīng)用程序中的一些圖元由諸如多邊形這樣的對象構(gòu)成。多邊形是封閉的平面圖形,邊界由一些線段組成。多邊形是一個面,由三個或更多的相連成形的點構(gòu)成。讀者可以見到,最常用的一類多邊形是三角形。三角形由三個互連在一起組成像2D金字塔形狀的不同點構(gòu)成。3D數(shù)學(xué)庫中有關(guān)三角形和多邊形的部分在引擎GameEngine項目中文件Polygon.h與Polygon.h.cpp中定義和實現(xiàn)。在這兩個文件中定義了三角形和多邊形在VC++中結(jié)構(gòu)體的表示方法。4.3DirectX3D光照光照是一門為3D場景增加真實感的技術(shù),它以某種方式通過對物體分布不同的亮光和黑暗形成陰影而實現(xiàn)真實感。如同在現(xiàn)在許多游戲中見到的一樣,光照可以將場景帶入到一個全新的真實感層次。為場景增加光照會對已渲染的場景產(chǎn)生巨大的影響。圖4.3給出了相同場景的三個不同光照的版本。左邊的場景沒有光照和陰影,中間的場景有光照而沒有陰影,右邊的場景兩者都有。圖4.3相同場景的三個不同光照版本光源光源是3D場景中發(fā)光的物體。這種所謂的光會導(dǎo)致陰影發(fā)生不同的變化,因而產(chǎn)生更具有真實感和更令人感興趣的場景。通過在場景中基于"光"信息讓物體從亮到黑逐漸發(fā)生變化,可以在圖形程序中創(chuàng)建非常真實的光照模擬。然后增加陰影,只是在看不見光源的表面上出現(xiàn)亮度變化,如黑色或是黑灰色。換句話說,有另一個表面介于光源和要增加陰影的表面之間。通常在計算機圖形學(xué)中有三類光源需要考慮,分別是點光源、聚光光源和方向性光源?!惨稽c光源點光源是一種在某個距離上向所有方向發(fā)光的光源。隨著光傳播一定的距離,它會損失一定的能量而且亮度也會逐漸降低?!捕酃夤庠淳酃夤庠丛谝欢ň嚯x上散法能量<類似于點光源>。與點光源的差別在于聚光光源是通過一個圓錐將光發(fā)射到3D場景中,而不是在各個方向都發(fā)光?!踩较蛐怨庠丛谟嬎銠C圖形學(xué)中,第三種光被稱為方向光。這些光像是從某個方向發(fā)生出來的,而沒有特定的光源<整理者:類似于太陽光>?,F(xiàn)實生活中,所有的光源都有一個產(chǎn)生光的源點,但在計算機圖形學(xué)中產(chǎn)生一種沒有發(fā)光源點的光源也是可能的。在光照計算機過程中,通過幾個數(shù)學(xué)計算就可以實現(xiàn)該光源。這些光源看上去不是很真實,但它們在渲染簡單的場景和簡單形狀的演示程序時,卻足以滿足要求。4.3.2反射模型反射模型描述了光照射到某個表面時,入射光在物體表面上的作用方式。當(dāng)一些光被反射回場景中時,一部分光能被存儲。這些表面也就是所謂的材料。材料只是一些屬性,描述了材料被照射時做出的滿應(yīng)方式。更改這些屬性將得到不同的效果。計算機圖形學(xué)中有許多不同的反射模型,但最常用的模型分別是環(huán)境光反射模型、漫反射模型和鏡面反射模型。反射模型和光屬性一起確定了3D場景中物體的外觀?!惨画h(huán)境光反射環(huán)境光反射描述的是場景中沒有方向的光,但是可以從各個地方都可以看到。因為從每個表面將光反射回來,這樣就很難辨認(rèn)光的原始位置。環(huán)境光試著模擬全局照明,這是場景中光從場景表面反射回來多次之后形成的光總量。當(dāng)光從表面上反射離開的時候,它沿著一定的方向反射。這些光線中的一部分進入到觀察者的眼睛中,這樣就可以看到周圍的環(huán)境。〔二漫反射漫反射模型描述了光線從表面上在各個方向做相同反射的方式。這意味著如果看一個只由漫反射光照的物體,那么從各個角度看上去該物體都是相同的。漫反射是視覺獨立的,只有物體移動或是光移動時,才會發(fā)生變化。當(dāng)光線照射在散射表面時,它會在多個方向反射。物體越光滑,反射光線散射得越光滑。除了物體的陰影區(qū)域外,物體從各個角度看上去都一樣?!踩R面反射鏡面反射模型模擬了從光滑發(fā)光表面如鏡子、一塊金屬或一塊發(fā)光塑料等發(fā)射光線的情況。表面的鏡面屬性就是在光線中看到的大部分物體上發(fā)亮的光。如果移動一個發(fā)光物體,就會注意到鏡面亮光區(qū)所發(fā)生的變化。這意味著鏡面反射取決于觀察物體的角度。所以漫反射光與視覺無關(guān),而鏡面反射光與視覺相關(guān)。4.3.3在DirectX3D中創(chuàng)建光照與材質(zhì)模型為了在Direct3D中創(chuàng)建光源,必須創(chuàng)建一個D3DLIGHT對象。為了方便起見,下面程序設(shè)置了光照結(jié)構(gòu)。不必設(shè)置所有的屬性值,而屬性值的設(shè)置取決于創(chuàng)建的光源類型。typedefstruct_D3DLIGHT9{D3DLIGHTTYPEType;//定義了所要創(chuàng)建的光源類型D3DCOLORVALUEDiffuse;//該光源所發(fā)出的漫射光的顏色D3DCOLORVALUESpecular;//該光源所發(fā)出的鏡面光的顏色D3DCOLORVALUEAmbient;//該光源所發(fā)出的環(huán)境光的顏色D3DVECTORPosition;//用于描述光源在世界坐標(biāo)系中位置的向量。D3DVECTORDirection;//一個描述光在世界坐標(biāo)系中傳播方向的向量。floatRange;//光線"消亡"前,所能達到的最大光程。floatFalloff;//僅用于聚光燈。定義了光強從內(nèi)錐形到外錐形的衰減方式floatAttenuation0;//該衰減變量定義了光強隨距離衰減的方式。僅用于點光源和聚光燈floatAttenuation1;//同Attenuation0floatAttenuation2;//同Attenuation0floatTheta;//僅用于聚光燈。指定了內(nèi)部錐形的圓錐角,單位為弧度floatPhi;//僅用于聚光燈。指定了外部錐形的圓錐

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論