西游達人》(Q版)
《鐵甲風暴》(1代)
蛋糕達人》(Q版)

動漫游戲設計專業(脫產)

動漫游戲程序專業(脫產)
手機游戲程序專業(脫產)
假期動漫特訓班  (業余)
點擊和我咨詢 咨詢馬老師
點擊和我咨詢 咨詢林老師
點擊和我咨詢 咨詢馬老師
咨詢電話:0760-88618861
詳細信息查看


網游中人物的碰撞后反應控制

人物移動控制是單機和網游中比較重要的部分,但前單機游戲使用動力學以及IK動畫等已經達到了非常逼真的地步,在大型網絡游戲中這樣的物理模擬同步是很實現的,因此在目前多數網游中仍舊是采取使用一個包圍體(盒子或者膠囊)來模擬人物。一個好的移動系統是很重要的,平滑的貼墻滑動以及下滑,跳躍等會帶給玩家順暢的手感否則則會有種奇怪的感覺,本文具體介紹了一下碰撞反應,包括貼墻滑動等的具體實現細節。包括一個demo實例 。
目前物理引擎里面大多自帶獨立于剛體的人物角色控制,但是物理引擎需要特定的物理模型命名以及比較大的物理模擬開銷度。如果需要定制自己的特別功能或者需要簡化計算(同時模擬多個延遲或者玩家的反應)。就必須自己完成人物碰撞反應控制的代碼。
要完成人物發生碰撞以后的行為控制,需要碰撞檢測系統提供以下的碰撞信息,對于每一個碰撞:
1. 碰撞發生的時間
2. 碰撞的法向量
3. 碰撞點
對于基本的人物碰撞控制反應來說,以上3點是必須的,有時還需要提供和包圍體發生碰撞的具體三角形信息。

對于場景上的物體首先使用膠囊所在的包圍盒AABB或者OBB和場景中的碰撞體包圍盒作層次碰撞裁減,至于具體怎么組織可以任意,比如可以采用AABB或者OBB樹,也可以采用簡單的球樹。但碰撞進行到樹的葉子節點后開始檢測人物的AABB盒和該AABB盒所包圍的OBJECT的碰撞情況。如果發現這2個AABB(OBB)盒將會發生碰撞,那么開始使用人物的膠囊體和景物所帶的三角面片進行精確到polygon soup級別的比較。這時候仍舊可以優化,比如說我還做了一步把一個Object中的三角形面片打成BSP樹的形式存儲起來,這樣可以大大減少膠囊和三角形碰撞檢測的次數,因為這種動態檢測是十分耗時的。有關膠囊和三角形面片的比較可以參考:http://dev.gameres.com/Program/Abstract/Arithmetic/capsule.mht中的方法。 對于BSP的劃分以及AABB碰撞檢測就不用多說了~到處都可以找到文章。
對于地形而言,也是采用同樣的方法,只不過對于地形而言三角形信息不用額外存儲,只需要使用和渲染相同的三角形(對于景物來說一般不會使用渲染用的三角形而會使用更加簡化數量更少的簡化網格碰撞模型)。這里可以有很多優化的技巧,因為地形本身是規則的cell一個地形是由若干個patch(一般是16X16)組成的,而每個patch是由若干cell(一般是16X16)組成的。對于patch來說一般已經組織到了一顆QUADTREE中了因為視棱錐裁減也需要這種結構,因此碰撞檢測中的AABB-AABB階段使用這顆已經存在的QUADTREE就可以快速的完成層次碰撞檢測了。但發現某個patch中的AABB和人物的AABB發生碰撞后需要檢測每一個CELL所在的AABB和人物AABB盒的碰撞,這里可以使用點小技巧比如說首先將AABB盒投影到CELL所在的XY平面上,找出被投影覆蓋的那些CELL然后再檢測這些CELL的AABB盒是否和人物的發生碰撞。一但確定了某個CELL和人物發生碰撞那么就可以將該CELL中的三角形取出(一般為2個)依次和人物所在的膠囊進行三角形-膠囊的碰撞檢測。
這樣當碰撞檢測系統完成任務以后我們將會獲得一個碰撞信息的數組:
class CollideInFo{
public:
GFVECTOR_3D m_worldcdnorm;//碰撞法向量
GFPOINT_3D m_worldpoint;//碰撞點
float m_cdtime;//碰撞時間
};

CollideInFo collidearray[];
然后使用這個數組就可以進行碰撞后的處理了包括,沿墻滑動下滑等等。在具體說明整個人物移動控制算法之前,首先說下動態碰撞檢測和靜態碰撞檢測的區別,動態碰撞檢測是指物體A以速度V前進了T時間,在這期間第一次和物體B發生碰撞的時間。這樣的碰撞檢測必須返回第一次2個物體發生碰撞的時間。而靜態檢測是指2個不動的物體是否互相相交對于這種檢測是不需要返回時間的。動態檢測算法比靜態的復雜而且也耗用更多的時間。一個完善的碰撞系統需要解決以上2種碰撞檢測,如果你不想自己寫檢測代碼,目前比較流行的有OPCODE,SOLID庫等檢測庫 。你可以直接使用他們提供的功能,這里我采用的是自己寫檢測代碼的方法,目前只用到三角形-膠囊,AABB-AABB,OBB-OBB的碰撞檢測。 [Page]
完成了包圍體(用的是膠囊)和三角形的碰撞,膠囊和BSP,地形的碰撞檢測之后,擁有了碰撞的信息 1。碰撞時間。2。碰撞法向量。3。碰撞點。接著就可以處理人物在碰撞后的反應了。
首先人物的一次移動分2個階段,第一個是初始階段,使用靜態碰撞檢測獲得該階段的速度(具體做法在后面說)。第2階段使用該速度去做動態碰撞檢測得到碰撞信息,根據這些碰撞信息去處理碰撞后的反應。
先來看第一階段,過程對于一個膠囊我們需要獲取他周圍的臨近面片的信息,以決定這個膠囊目前所處平面的傾斜度,是否貼著不可通過的墻等等。我采用的方法是將膠囊體略為膨脹一些,然后調用靜態碰撞檢測的代碼獲取和該膨脹后的膠囊體相交的三角形面片碰撞信息如圖:
棕色的是原始的膠囊體,紅色的表示將膠囊半徑略為增加以后的膠囊體,藍色的2個地形是將膠囊膨脹以后所發生相交的2個三角形,而如果不采用膨脹的話該膠囊是不和任何三角形相交的,具體膨脹數值可以設為膠囊下落的最小高度,比如你設定膠囊離底部物體超過0.6單位屬于騰空狀態的話你就將膨脹數值設為0.6。在這個例子中我們將會檢測到2個碰撞(藍色部分)這2個碰撞法向量正好是這2個三角面的法向量(在很多情況下也可能不是這個看你的碰撞代碼中法向量是如何計算的了)。其中底部的那個是可行走平面,另外一個是不可行走平面,有了這2個碰撞平面就很簡單了,如果用戶輸入的速度和那個不可行走的平面相反(也就是撞向那個不可行走平面),那么那個不可行走平面是有效的,這樣他和底部那個可行走的平面所組成的交線就是人物的初始速度,如果用戶輸入的速度和那個不可行走的平面法向量相同,那么這個不可行走平面沒有作用人物最終的速度就是把用戶速度投影到該可行走平面上的速度。
0頂一下

具體計算是否能夠水平移動以及移動速度的算法:當給出M個不可行走平面和N個可行走平面時:
1首先將速度在N個可行走平面上分解,檢查這些分解的速度是否有效(如何判斷速度有效下面會說道)
2如果在1的時候存在一個有效的速度直接返回該速度
3沒有有效速度,這時檢查NXM個平面的交線,將速度在上面分解同時檢查是否存在有效速度
4如果存在有效速度返回該速度
5否則檢查MXM條交線的,將速度在上面分解同時檢查是否存在有效速度
6如果存在有效速度返回該速度
7否則返回0速度
那么如何判定速度是否有效呢,首先我們知道了所有碰撞的信息,給定一個速度,如果該速度和所有碰撞的法向量的夾角都是小于90度那么這就是個有效速度,(說明該分解后速度不會引起和這些碰撞面的在一次碰撞,因為該速度是將物體拉下遠離該平面的方向的)。如果只要有一個夾角大于90度那么該速度就是非有效速度,同時在移動時還要判斷該速度的傾斜角是否大于最大下滑傾斜角。注意 5是很重要的因為2個不可行走的平面所形成的交線仍舊可能是可以行走的,甚至是水平的。
以上的部分是檢查是否能夠水平移動的,如果不能水平移動那么該物體會下滑,1如果沒有檢測到碰撞平面說明物體處于騰空狀態,這時候給物體加上重力加速度,產生一個往下的速度和原來的水平速度結合起來(如果存在)。
如圖棕色是原始狀態膠囊經過上一幀移動后到達藍色的位置這時通過上訴算法可以檢測到膠囊騰空,這時他的速度為水平速度(紅色)+下滑速度(綠色)。
2如果檢測到碰撞平面但是平面以及它們的交線都是不可行走的(傾斜角大于可行走角度)那么依次將當前速度在碰撞平面分解,以及檢測每一條可能下滑的交線。得出速度后檢測是否是有效速度具體過程和前面檢查水平速度時的方法一樣,只是將速度投影到平面上的方法不一樣具體方法可以根據程序需要,我這里采用首先去掉原始速度在碰撞平面法線的分量,然后將速度分解為2個速度一個是貼著平面水平移動的速度另外一個是貼著平面下滑的速度。注意如果上一幀更新后物體處于下滑狀態那么當前速度就因該是該下滑速度,否則則是用戶輸入的速度。
如果用戶輸入的速度是跳躍也就是帶Z分量的速度那么,計算初始速度這一步需要略過直接輸入給下一階段用戶起跳的速度。

階段2計算初始速度引起的碰撞

對于多數情況來說,計算完初始速度就不會再發生碰撞了,一旦發生,那么我們依舊傳入碰撞面的那些法向量,碰撞點的信息,同樣采用前面計算初始速度時所采用的方法,計算出碰撞后的調整速度。 [Page]

整個處理過程基本上就是這樣的,其中可能還會出現一些小問題比如說誤差控制等。總結一條就是人物行走要么研著平面分解速度要么沿著2個平面的交線行走或者下滑。這個是Demo示例畫面(由于沒有人幫我做動畫。。所以demo中目前只有行走動畫,沒有起跳,下落等動畫。。)

點擊數:4673

關閉窗口


 
站點首頁 | 漫龍招聘 | 關于我們 | 聯系我們
Copyright 2008-2015 吉東動漫科技有限公司  All Rights Reserved 粵ICP備14058066號
地址:中山市東區亨尾橫街19號(團益學校門口左側)    咨詢電話:0760--88618861 / 88662656 
黑龙江11选5正好软件