freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

畢業(yè)論文-基于opengl的3d游戲設(shè)計(jì)-資料下載頁(yè)

2025-01-16 21:12本頁(yè)面
  

【正文】 else { velocity = CVector(, , )。 modelState = MODEL_RUN。 //模型狀態(tài):跑動(dòng) } 如果敵人與其它敵人發(fā)生碰撞,那么它將進(jìn)入 AI_UNCARING 狀態(tài),并停止移動(dòng)。如果與地形發(fā)生了碰撞,則需要獲取其當(dāng)前位置相應(yīng)的高度值,并檢測(cè)此時(shí)的 x 與 z 分量,確保其不超過(guò)邊界。如果敵人與火箭發(fā)生碰撞,那么敵人則進(jìn)入 AI_DEAD 狀態(tài)。 場(chǎng)景中還有一種敵人 sod,與 Ogro 基本相同,只是更加智能一些。當(dāng)玩家距離其有西安石油大學(xué)畢業(yè)設(shè)計(jì)(論文) 23 125 個(gè)場(chǎng)景單位時(shí),它就會(huì)進(jìn)入逃跑,如圖 44: 圖 44 sod智 能示意圖圖 3D 模型 在實(shí)際的 3D 圖形程序,構(gòu)建 3D 模型一般來(lái)說(shuō)都比較復(fù)雜。 OpenGL 雖然提供了一些已經(jīng)生成的 3D 圓柱體、球體和立方體等實(shí)體模型的輔助函數(shù),但是這些函數(shù)都無(wú)法滿足建立復(fù)雜 3D 實(shí)體的需要,因此 OpenGL 的建模功能并不是十分強(qiáng)大。想單純利用OpenGL 實(shí)例庫(kù)提供的幾何體構(gòu)建就非常困難,而且也不可能一次性在內(nèi)存中編寫繪圖語(yǔ)句,在效率上和模型逼真度上都比較低。因此我們常利用專門的建模工具(如 3D MAX、 Maya)來(lái)建立高逼真度的模型,再將模型導(dǎo)出為特定的格式,然后再將模型導(dǎo)入三維場(chǎng)景 中實(shí)現(xiàn)繪制與控制。 目前在計(jì)算機(jī)平臺(tái)上,常用的 3D 模型有 3DS、 OBJ、 MD MS3D 等多種格式。3D 模型又分為靜態(tài)模型(如 3DS、 OBJ)和動(dòng)態(tài)模型(如 MD MD MS3D) 。在動(dòng)態(tài)模型中除了保存模型的定點(diǎn)和表面數(shù)據(jù)外,還有與動(dòng)畫相關(guān)的信息,這些動(dòng)態(tài)模型渲染起來(lái)比較復(fù)雜。 下面主要介紹了游戲用到的 MD2 模型: Quake2 模型格式由著名游戲公司 ID 公司自主設(shè)計(jì),廣泛應(yīng)用于 ID 公司開發(fā)的各種三維游戲中,其文件擴(kuò)展名為 MD2。由于模型的文件格式相對(duì)比較簡(jiǎn)單,容易實(shí)現(xiàn),所以應(yīng)用很廣,是一種經(jīng)典的動(dòng)畫模型格 式,在其它一些三維圖形程序中也逐漸得到了應(yīng)用。這兩種模型都由兩部分組成,如圖 45: 西安石油大學(xué)畢業(yè)設(shè)計(jì)(論文) 24 圖 45 模型的組成 MD2 模型的紋理是隔離出來(lái)的,不包括在 MD2 文件內(nèi)部。一個(gè) MD2 模型在同一個(gè)時(shí)刻只能有一種紋理。在存儲(chǔ)結(jié)構(gòu)上, MD2 文件建模的原理是用三角形來(lái)描述復(fù)雜的物體,即所有的物體都是三角形組成的。因此要從文件中讀取各三角形的點(diǎn)的位置、紋理坐標(biāo)來(lái)顯示圖形。 MD2 文件組成分為五部分:紋理坐標(biāo)集合、組成三角形的點(diǎn)的索引集合、文件頭、三維對(duì)象組成點(diǎn)集合、三角形的紋理坐標(biāo)的索引集合。 文件信息頭部分包括 17 種數(shù)據(jù),其具體定義 如下 所示 : 文件信息頭的定義 ,下面是 MD2 的文件頭定義: // md2 header typedef struct { int ident。 //文件標(biāo)識(shí) . 必須是 IPD2 int version。 // md2 的版本 . int skinheight。 //紋理的高度 int skinwidth。 //紋理的寬度 int numSkins。 //紋理的數(shù)目 int framesize。 // 每一幀占的字節(jié)數(shù) int numXYZ。 // 三維空間中點(diǎn)的個(gè)數(shù) int numST。 // 紋理的坐標(biāo)數(shù) int numGLcmds。 // OPENGL 命令的個(gè)數(shù) int numFrames。 // 文件包含的幀數(shù) int numTris。 //三角形的的個(gè)數(shù) 頭文件 文件主體 包含 ID 號(hào),版本號(hào),和有關(guān)模型的各種數(shù)據(jù)的起始地址等 有關(guān)文件的各種數(shù)據(jù),如頂點(diǎn)數(shù)據(jù)、紋理數(shù)據(jù)、法向量數(shù)據(jù)等。 西安石油大學(xué)畢業(yè)設(shè)計(jì)(論文) 25 int offsetSkins。 // 紋理名稱的偏移量 (每個(gè) 64 字節(jié) ) int offsetST。 // 存儲(chǔ)紋理坐標(biāo)偏移量 int offsetFrames。 //存儲(chǔ)幀的地址偏移量 int offsetTris。 // 存儲(chǔ)三角形地址偏移量 int offsetGLcmds。 // 存儲(chǔ) OPENGL 命令的地址偏移量 int offsetEnd。 // 文件結(jié)尾的偏移量 } md2_t。 利用以上這些信息,就可以編制相應(yīng)算法,定位到需要的地方。 編程原理是: 在坐標(biāo)集合中,三角形的每個(gè)頂點(diǎn)都一個(gè)索引值,利用這些索引值可以得到組成三角形的頂點(diǎn)的位置,三角形的紋理坐標(biāo)獲取方法同理。在進(jìn)行三角形的繪制時(shí),要事先準(zhǔn)備好 存放紋理坐標(biāo)集合的緩存 、 存放三角形紋理在紋理集合中索引的緩存、存放點(diǎn)集合的緩存、存放三角形組成點(diǎn)在點(diǎn)集合中索引的緩存 ,準(zhǔn)備好緩存后,通過(guò)索引指向點(diǎn)集合中的紋理坐標(biāo)集合中的相應(yīng)位置,得到 數(shù)據(jù)后,在進(jìn)行三角形的繪制,進(jìn)行渲染。 如要 使 動(dòng)畫 得以 顯示,就要求每隔一定時(shí)間就對(duì)畫面進(jìn)行刷新 操作。這就需要 在程序中 先定義一個(gè) 定時(shí)器, 然后在一個(gè) 時(shí)間 間隔時(shí)進(jìn)行 頁(yè)面刷新,讀入下一幀的數(shù)據(jù) 就是頁(yè)面 刷新時(shí) 所需要做 的 操作 , 讀取后 進(jìn)行顯示,從而實(shí)現(xiàn)連續(xù)的動(dòng)畫效果。 定義合理的數(shù)據(jù)結(jié)構(gòu)和使用優(yōu)秀的算法 是 讀取 MD2 文件的關(guān)鍵 所在 。 首先要從MD2 文件中得到文件頭信息。先用二進(jìn)制方式打開一個(gè)文件 “ ” 。然后把整個(gè)文件一股腦讀到一個(gè) buffer 緩存區(qū)去。文件一開始就是頭信息,利用頭文件信息得到點(diǎn)數(shù)據(jù)到文件頭的偏移 量,定位到點(diǎn)數(shù)據(jù)開始的地方。然后定義數(shù)組。接著再根據(jù)各三角形的點(diǎn)的索引值把在 pointList[]查到三角形組成點(diǎn)的坐標(biāo),就可以畫出復(fù)雜三維場(chǎng)景了。載入 MD2 文件的重要函數(shù)為: bool CMD2Loader::ImportMD2(t3DModel *pModel, char *strFileName, char *strTexture)。讀 取文件的流程圖,如圖 46: 圖 46 md2讀 取文件的流程圖 由于文件中是關(guān)鍵幀的數(shù)據(jù),如果每隔一定時(shí)間顯示一個(gè)關(guān)鍵幀的圖像,動(dòng)畫會(huì)極不連續(xù),為此我們引入一個(gè)比例因子 ,目的在于在兩個(gè)相鄰關(guān)鍵幀之間線性插值插入若干幀,使畫面流暢。 繪制插值點(diǎn)流程,如圖 47: 打開文件 檢查文件指針 讀取文件頭 檢查版本號(hào) 讀取MD2文件 將MD2數(shù)據(jù)轉(zhuǎn)換為模型結(jié)構(gòu) 西安石油大學(xué)畢業(yè)設(shè)計(jì)(論文) 26 圖 47 繪制插值點(diǎn)流程圖 3D 音效 一款 3D游戲,除了需要有游戲模型與系統(tǒng)引擎外,音效也是其組成的一部分,尤其是 3D音效。向游戲中加入 3D音效,可以極大的增強(qiáng)游戲的真實(shí)感,使玩家沉浸其中。優(yōu)良的 3D音效,往往可以給游戲帶來(lái)意想不到的效果。 在 3D 音效應(yīng)用之前,必須要了解 3D 聲音坐標(biāo)。 3D 聲音坐標(biāo),是一個(gè)擁有 x、 y、 z軸的笛卡爾坐標(biāo)系統(tǒng),以此定義了聲源和聽者的位置、速度以及方向。這些坐標(biāo)軸是相對(duì)于視點(diǎn)或 者攝像機(jī)的,與 OpenGL 中所使用的坐標(biāo),除了 z 軸的方向相反是指向屏幕內(nèi)部不同之外,其它完全相同。 要確定聲音的位置,要輔助于人感知聲音的一些因素,如總響度、耳間強(qiáng)度差、耳間時(shí)間差、消聲等因素??傢懚龋寒?dāng)聲源逐漸遠(yuǎn)離聽者時(shí),聽者所聽到的音量會(huì)以一個(gè)固定的速率減小,被稱為衰減。耳間強(qiáng)度差:對(duì)于一個(gè)位于聽者左側(cè)的聲源,該聽者左指定紋理坐標(biāo) 檢查是否具有紋理 獲得該面中頂點(diǎn)和紋理索引 下面開始進(jìn)行幀插值 遍歷所有面 遍歷面的所有頂點(diǎn) 利用公式 : p(t) = p0 + t(p1 p0),得到插值點(diǎn) 西安石油大學(xué)畢業(yè)設(shè)計(jì)(論文) 27 耳聽到的聲音音量要比右耳所聽到的音量要大。耳間時(shí)間差:對(duì)于一個(gè)位于聽者左側(cè)的聲源,聲音到達(dá)左耳比到達(dá)右耳的聲音要早,通常為 1毫秒。消聲等因素:由于耳朵的形狀和朝向,肯定會(huì)使來(lái)自聽者前方的聲 音比后方的要強(qiáng)。 創(chuàng)建的 3D聲音效果不僅會(huì)受到聲源的位置、方向和速度耳朵影響,還會(huì)受到聽者的位置、方向和速度的影響。默認(rèn)情況下聽者是位于世界坐標(biāo)系的原點(diǎn),其方向指向世界坐標(biāo)系 z軸正向。根據(jù)對(duì)者的位置、方向和速度的改變,可以有效的控制聲音環(huán)境的參數(shù),其中包括多普勒頻移以及音量相對(duì)于距離的衰減率。 聽者的方向是由兩個(gè)以聽者頭部中央為其起點(diǎn)的矢量所定義的;向前矢量與向上矢量。向前矢量從聽者的面部向外指出,與向上矢量成直角,向上矢量則是直指聽者的頭頂方向。如果所定義的向前矢量與向上矢量的夾角不為 90176。,那么會(huì)自動(dòng)改 變向前矢量。 為了獲取一個(gè)聽者對(duì)象,必須調(diào)用 IDirectMusicAudioPath8::GetObjecyInpath()函數(shù) //從 audiopath 獲取聽者對(duì)象 if ( FAILED(dmusic3DAudioPathGetObjectInPath(DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0, GUID_NULL, 0, IID_IDirectSound3DBuffer, (void**)amp。buff))) return NULL。 在 SetAllParameters()函數(shù)定于中,我們需要為 3D 聽者設(shè)置 DSDLISTENER 數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)項(xiàng): HRESULT SetAllParameters( LPCDS3DLISTENER pclistener。 //包含 3D 聽者信息 DWORD dwApply //應(yīng)該何時(shí)進(jìn)行設(shè)置 ); DS3DLISTENER 數(shù)據(jù)結(jié)構(gòu)定義則如下: Typedef struct{ DWORD dwSize。 //以字節(jié)數(shù)表示的 DS3DLISTENER 數(shù)據(jù)結(jié)構(gòu)大小 D3DVECTOR vPosition。 //聽者的位置 D3DVECTOR vVelocity。 //聽者的速度 D3DVECTOR vOrientFront。 //聽者向前指向 D3DVECTOR vOrientTop。 //聽者的向上指向 D3DVECTOR glDistanceFactor。 //當(dāng)前的距離因子 D3DVECTOR flRolloffFactor。 .//衰減因子 D3DVECTOR flDopplerFactor。 //多普勒因子 }DS3DLISTENER, *LPDS3DLISTENER。 在得到這些后,我們只要從 IDirectSoundDListener 接口設(shè)置 DS3DLISTENER 中的數(shù)據(jù)西安石油大學(xué)畢業(yè)設(shè)計(jì)(論文) 28 項(xiàng),并將其傳遞給 SetAllParameter()函數(shù),就設(shè)置好了聽者對(duì)象的 3D 參數(shù)。 游戲場(chǎng)景隨機(jī)地形 在游戲中,游戲設(shè)計(jì)的是 一個(gè)地形隨機(jī)的場(chǎng)景,定義為 CTerrain 類,地形本身就是一組高程值所定義的,其取值范圍從 0 到 1。游戲用一個(gè)高度比例值與這些高程值相乘從而保證地形與其寬度保持合適比例。如果想要一個(gè)地形起伏比較大的地形,那么設(shè)置一個(gè)較大的高度比例值即可。具體類定義如下 class CTerrain : public CObject { private: int width。 // 地形尺寸為 width x width , width 最好為 2 的冪 float terrainMul。 //地形比例值 float heightMul。 //高度比例值 float scanDepth。 //掃描深度 float textureMul。 //地形紋理比例 float RangedRandom(float v1,float v2)。 void NormalizeTerrain(float field[],int size)。 void FilterHeightBand(float *band,int stride,int count,float filter)。 void FilterHeightField(float field[],int size,float filter)。 void MakeTerrainPlasma(fl
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)教案相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1