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

正文內(nèi)容

基于opengl的3d游戲設(shè)計畢業(yè)論文(已改無錯字)

2023-04-10 10:03:51 本頁面
  

【正文】 y, z)都需要滿足公式 : ( 41) 式 41 AABB內(nèi)的任一點 V(x, y, z)滿足條件 公式中 Xmax 指模型中各個點在 x軸方向的最大值、 Xmin 指模型中各個點在 x 軸方向的最小值; Ymax 指模型中各個點在 Y 軸方向的最大值, Ymin 指模型中各個點在 Y 軸方向的最小值; Zmax 指模型中各個點在 z 軸方向的最大值, Zmin 指模型中各個點在 z軸方向的最小值。要計算包圍盒的中心點,需要得到兩個重要的點 Pmin=[ Xmin, Ymin,Zmin], Pmax=[Xmax, Ymax, Zmax],得到兩點后可以計算中心點。 中心點 m和長、寬、高 a, b, c 分別為,如式 42 ( 42) 式 42 中心點 m 和長、寬、高 a, b, c 包圍球算法 在進(jìn)行碰撞檢測時,包圍球是 3D 幾何體的最小外接球。包圍球算法也比較簡單,很容易就能實現(xiàn),但包圍球的緊密性相對來說也比較差。包圍球在旋轉(zhuǎn)上不同于 AABB,它不需要跟隨 3D 模型的旋轉(zhuǎn)而旋轉(zhuǎn)。 包圍球的球心和半徑的計算是得到包圍球的重點。其球心的計算方法與 AABB 的計算方法相同。包圍球的半 徑是長、寬、高的最大值。在 AABB 算法的基礎(chǔ)上,包圍球的球心及半徑的計算滿足公式 : ( 43) 式 43 球心 m 和半徑 R 18 沿任意方向包圍盒 OBB(Onented Bounding Box)算法 在 AABB、包圍球、 OBB 算法中, OBB是包含這個 3D 物體并且相對于坐標(biāo)軸方向任意的平行六面碰撞體,它是最接近 3D幾何體的平行六面體。 OBB 包圍盒方向的任意性是它區(qū)別與其他兩個包圍盒的最大特點。這個特點使得 OBB 可以根據(jù)碰撞對象外形的不同來盡可能得包圍對象。在包圍的對象進(jìn)行旋轉(zhuǎn)操作時,只需要對 OBB的基底進(jìn)行一樣的旋轉(zhuǎn),這使得運算不會變得非常復(fù)雜,并且場景的運行速度也不會受到影響,算法效率有一定影響。 尋找最適合的方向,以及確定這個方向上 OBB 包圍盒的最小尺寸,是構(gòu)造 OBB 包圍盒的關(guān)鍵。 OBB 包圍盒需要計算包圍盒的尺寸、方向以及中心位置。尺寸是計算位置和方向得到的,中心位置是用均值和協(xié)方差矩陣來計算的。由于組成要進(jìn)行碰撞檢測的物體是多個三角形面,所以這里設(shè)三角形中第 i 個三角形面的定點矢量為為 n, qi和 ri,組成包圍盒包圍對象的三角形面數(shù)為 n。那么協(xié)方差矩陣元素 Cjk 的計算如公式 式 44 包 圍盒的中心位置 m 那么 OBB 的中心位置 m計算如公式 : 式 45 協(xié)方差矩陣元素 Cjk 其中,公式 qi=q— m,ri=ri— m 和 pi=pi— m都是 3*1 向量。 利用上述公式得出矩陣的特征向量,并將其進(jìn)行單位化,由于矩陣 C 的特征向量具有相互垂直的特點,所以矩陣 C 是 OBB 的方向軸。要得到包圍盒的尺寸,需要把包圍對象在頂點方向進(jìn)行投影操作,找出方向上的投影區(qū)間,計算出投影區(qū)間的尺寸,該尺寸就是包圍盒的尺寸。 包圍盒的簡單性與其包裹幾何體的緊密性是一對矛盾 ,包圍盒越簡單它對幾何體的包裹緊密性就越差。 BSP 算法 BSP Trees 英文全稱為 Binary Space Partioning trees,二維空間分割樹,簡稱為二叉樹。 BSP樹原理很簡單:它將場景中所有的三角形面組織存儲于一顆二叉樹內(nèi),每個平面均將空間分為前后兩個空間,這兩個空間又被其它面分成更小的空間??直到最后,按照前面的算法,確定每個房間相對于攝像機的遮檔順序。這是一個非常標(biāo)準(zhǔn)的二分法, 19 僅按照 “ 前 ” 和 “ 后 ” 兩個邏輯上的概念來劃分空間。如圖 42所示: 圖 42 BSP原理簡要解析圖 空間 ABC 由 A、 B、 C三個獨立 的空間組成,首先,分割平面 1將空間分成了平面正向的 A空間和平面負(fù)向的 BC空間, BC空間被 2緊接著分割為平面 2 正向的 C 空間和負(fù)向 B空間。如果一個人處于 C房間內(nèi),那么如何判斷空間的遮擋順序呢?從根結(jié)點開始,由于處于平面 1的 “ 后面 ” ,所以, BC空間應(yīng)該先于 A 空間,然后,由于人處于分割平面 2的 “ 前 ” 面,所以, C 空間應(yīng)該先于 B空間。這樣,整個空間離人由近到遠(yuǎn)的順序就可以確定了: CBA。僅需要通過兩次平面的前后判斷就可以確定空間的先后順序,算法威力可見一斑。 粒子爆炸 在游戲中,火箭是玩家射向敵人的拋射體 ,當(dāng)玩家點擊鼠標(biāo)左鍵時,就會發(fā)射。程序中用 CRocket 類來表示火箭,這個類用來載入火箭的 MD2 模型,繪制并進(jìn)行相關(guān)物理計算。 public: float pitch。 float distanceTravel。 // 火箭已經(jīng)飛行的距離 CVector forward。 // 火箭的向前矢量 bool isExplosion。 // 火箭爆炸,則為 true CTexture *explosionTex。// 爆炸紋理 CExplosion *explosion。// 爆炸粒子效果 只要 火箭命中一個物體,它則產(chǎn)生爆炸。 CExplosion 對象則是用來生成爆炸效果的。當(dāng)火箭與其他物體發(fā)生碰撞時,布爾變量 isExplosion 就會被設(shè)置為 true。 CExplosion 類 20 將 CRocket 類中所指定的 explosionTex 作為紋理來繪制爆炸效果。 云霧效果 游戲中,如果整個場景都在玩家的視野中,那么游戲?qū)⒆兂煞浅:唵?,這里為了給游戲增加難度而采用了云霧效果。所謂云霧效果,就是為了給玩家視野可見度,視野之外的物體將會被云霧遮擋,玩家只有行進(jìn)才能開拓新的視野,當(dāng)然已經(jīng)可見的物體,在超出視野 范圍會再次被云霧遮蓋。 OpenGL 內(nèi)置的云霧是依靠每個像素與云霧的顏色相混合而實現(xiàn)的,其混合因子的設(shè)置則是根據(jù)其視點的距離、霧的密度以及當(dāng)前所選的云霧的模式。為了開啟云霧效果,我們首先要啟用它??刂圃旗F的相關(guān)狀態(tài)的函數(shù)為 glFog() glFogi(GLenum Pname, GLfloat Param)。 glFogfv(GLenum Pname, GLfloat Param)。 glFogf(GLenum Pname, GLfloat *Params)。 glFogf(GLenum Pname, GLfloat *Params)。 這些函數(shù)中, param代表單一的一個參數(shù),而 params 則代表一個或多個參數(shù)組。這些參數(shù)的含義根據(jù) pname 參數(shù)的值而定,參數(shù)如表 41: 表 41 glFog()參數(shù)說明 參數(shù) 說明 GL_FOG_MODE 可以為 GL_LINEAR, GL_EXP 或 GL_EXP2,其用于指定三個霧方程中的哪一個來計算混合因子 GL_FOG_DENSITY 單一的值,指定用于三個霧方程的霧的密度,必須為正 GL_FOG_START 單一的值,指定用于三個霧方程的起始范圍值 GL_FOG_END 單一的值,指定用于三個霧方程的終止范圍值 GL_FOG_INDEX 使用 8bit 顏色時,指定霧的顏色索引值 GL_FOG_COLOR 指定霧的顏色,是一個數(shù)組 盡管 OpenGL 霧很容易使用,并且在大多數(shù)情況下效果也非常不錯,但是并不完美。最大的缺點是為了每個霧的頂點所進(jìn)行的霧顏色的計算,此計算是根據(jù)頂點與垂直于視線的平面之間 z 距離進(jìn)行的。如果在玩家視野邊緣處存在一些物體,雖然他們距離視點很遠(yuǎn),但是其 z 距離很小,那么,本應(yīng)被霧包圍的物體就變得非常清楚。為了解決這樣的問題,需要采取體積霧的方法。 將霧作為球、粒子或者霧紋理,在繪制其他物體時,先計算觀察此物體需要透過多少體積的霧,從而相應(yīng)地調(diào)整此物體的光照和顏色,以達(dá)到云霧的效果。 21 簡易 AI 作為一款單機游戲, AI(人工智能)是必不可少的。對于本次設(shè)計的游戲來說,如果敵人一直站著不動,等玩家去消滅,游戲就顯得很單薄。為此,特別設(shè)計了簡單的 AI系統(tǒng),來增加游戲的可玩性。 在本次游戲中,設(shè)計了兩種敵人,一種普通類型敵人,另一種跑動速度稍快,而且相對智能的 AI。敵人 AI實際上是根據(jù)狀態(tài)值(也就是狀態(tài)機)來確定敵人在游戲中的行為的。敵人的狀態(tài)是 AIState_t 類來定義的: enum AIState_t { AI_UNCARING, // 敵人不會恐懼也不會關(guān)心玩家 AI_SCARED, // 敵人會恐懼并且逃避 AI_DEAD //敵人死亡 }。 在游戲中,敵人恐懼玩家,那么敵人就會逃離玩家當(dāng)前位置。如果敵人不在乎玩家,那么它則會自由地亂跑,或者保持空閑狀態(tài)。 Ogro 是一種移動緩慢的怪物,在其逃離玩家的時候閑的不是特別聰明。當(dāng)處于AI_UNCARING 狀態(tài)時,它有很大幾率是無所事事的。當(dāng)處于 AI_SCARED 狀態(tài)時,如果玩家距離它有 100 個 場景單位距離,它將以 45176。角度范圍逃跑。如圖 43: 圖 43 ogro智能示意圖 敵人 ogro 狀態(tài)是由 COgroEnemy::OnProcessAI()完成的。 CVector diff = playerposition position。 // 計算與玩家之間距離 if (aiState != AI_DEAD) //敵人必須在活著的前提下 { istFromPlayer = sqrt(* + * + *)。// 如果玩家靠的夠 22 進(jìn),敵人則會恐懼 if (distFromPlayer ) //距離小于 100 aiState = AI_SCARED。 //敵人會恐懼 else aiState = AI_UNCARING。 //大于 100 不會恐懼 } 敵人 ogro 恐懼時的逃跑是由 COgroEnemy::OnPrepare()完成的 Float dirToPlayer。 // 敵人到玩家矢量的角度 CVector diff。 // 敵人到玩家的矢量 = player。 //求取敵人到玩家的矢量 = player。 //求取敵人到玩家的矢量 ()。 在得到了敵人與玩家間的距離之后,根據(jù)數(shù)值判斷就要賦予敵人智能,判斷其應(yīng)該處于一個什么樣的狀態(tài) 。 case AI_SCARED: //敵人恐懼狀態(tài) direction = (dirToPlayer 90) + ((rand()%90)45)。 // 設(shè)置敵人方向 modelState = MODEL_RUN。 velocity = CVector(, , )。 break。 case AI_UNCARING: //敵人不恐懼狀態(tài) direction = float(rand() % 360)。 //面朝任意方向行走 if ((rand() % 4) != 0) //75%s 時間為閑置狀態(tài) { modelState = MODEL_IDLE。 //模型狀態(tài) velocity = CVector(, , )。 } else { velocity = CVector(, , )。 modelState = MODEL_RUN。 //模型狀態(tài):跑動 } 如果敵人與其它敵人發(fā)生碰撞,那么它將進(jìn)入 AI_UNCARING 狀態(tài),并停止移動。如果與地形發(fā)生了碰撞,則需要獲取其當(dāng)前位置相應(yīng)的高度值,并檢測此時的 x 與 z 分量,確保其不超過邊界。如果敵人與火箭發(fā)生碰撞,那么敵人則進(jìn)入 AI_DEAD 狀態(tài)。 場景中還有一種敵人 sod,與 Ogro 基本相同,只是更加智能一些。當(dāng)玩家距離其有 23 125 個場景單 位時,它就會進(jìn)入逃跑,如圖 44: 圖 44 sod智能示意圖圖 3D 模型 在實際的 3D 圖形程序,構(gòu)建 3D 模型一般來說都比較復(fù)雜。 OpenGL 雖然提供了一些已經(jīng)生成的 3D 圓柱體、球體和立方體等實體模型的輔助函數(shù),但是這些函數(shù)都無法滿足建立復(fù)雜 3D 實體的需要,因此 OpenGL 的建模功能并不是十分強大。想單純利用OpenGL 實例庫提供的幾何體構(gòu)建就非常困難,而且也不可能一次性在內(nèi)存中編寫繪圖語句,在效率上和模型逼真度上都比較低。因此我們常利用專門的建模工具(如 3D MAX、 Maya)來建立高逼真度 的模型,再將模型導(dǎo)出為特定的格式,然后再將模型導(dǎo)入三維場景中實現(xiàn)繪制與控制。 目前在計算機平臺上,常用的 3D 模型有 3DS、 OBJ、 MD MS3D 等多種格式。3D 模型又分為靜態(tài)模型(如 3DS、 OBJ)和動態(tài)模型(
點擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1