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