青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

一種3D游戲碰撞檢測解決方案

轉(zhuǎn)載自:http://www.cnblogs.com/cproom/archive/2007/12/15/608732.html




        碰撞檢測在3D游戲中至關(guān)重要,好的碰撞檢測要求人物在場景中可以平滑移動,遇到一定高度內(nèi)的臺階可以自動上去,而過高的臺階則把人擋住,遇到斜率較小的斜坡可以上去,斜率過大則把人擋住,在各種前進(jìn)方向被擋住的情況下都要盡可能地讓人物沿合理的方向滑動而不是被迫停下。在滿足這些要求的同時還要做到足夠精確和穩(wěn)定,防止人物在特殊情況下穿墻而掉出場景。

        碰撞檢測做得好了是應(yīng)該的,不易被人注意到,因為這符合我們?nèi)粘I钪械某WR。做得差了卻很容易讓人發(fā)現(xiàn),人物經(jīng)常被卡住不能前進(jìn)或者人物穿越了障礙。所以大部分人都覺得寫碰撞檢測代碼是件吃力不討好的事情,算法復(fù)雜、容易出bug、不容易出彩。下面還是回到正題,看看我們該如何解決這個難題。

        早期3D游戲的碰撞檢測多數(shù)基于格子或者BSP樹,基于格子的系統(tǒng)實現(xiàn)簡單但精度不夠,不屬于嚴(yán)格意義的3D碰撞檢測。基于BSP樹的碰撞檢測一度十分流行,算法基本已經(jīng)成熟定型,但它的固有缺點卻使它不太適合現(xiàn)在的游戲。BSP樹需要很長的預(yù)處理時間不適合加載時計算,BSP劃分經(jīng)常會產(chǎn)生原多邊形數(shù)三到四倍的多邊形,考慮到不用保存法線、顏色、uv等信息也要增加將近一倍的資源容量,在一個大的游戲中將模型資源的容量從200M增加到400M相信是大部分人都不愿接受的。目前對于任意復(fù)雜三角形集合(mesh)的碰撞檢測多數(shù)基于BVTreebounding volume tree,具體可以是aabb treeobb tree或者K-dop tree,這也是當(dāng)今各種物理引擎和碰撞檢測引擎流行的做法。

        上面是碰撞檢測按數(shù)據(jù)結(jié)構(gòu)不同的分類,按檢測方式又可以分為離散點的碰撞檢測和連續(xù)碰撞檢測(CCD continuous collision detection)。離散點的碰撞檢測是指定某一時刻T的兩個靜態(tài)碰撞體,看它們之間是否交迭,如果沒有交迭則返回它們最近點的距離,如果交迭則返回交迭深度,交迭方向等。連續(xù)碰撞檢測則是分別指定在T1T2兩個時刻兩個碰撞體的位置,看它們在由T1運動到T2時刻的過程中是否發(fā)生碰撞,如果碰撞則返回第一碰撞點的位置和法線。連續(xù)碰撞檢測是最為自然的碰撞檢測,可以大大方便碰撞響應(yīng)邏輯的編寫,可以很容易避免物體發(fā)生交迭或者穿越。離散點的碰撞檢測則沒有那么友好,當(dāng)檢測到碰撞時兩個物體已經(jīng)發(fā)生了交迭,如果其中有三角形網(wǎng)格對象那么已經(jīng)有許多三角形發(fā)生了交迭,如何將兩個交迭的對象分開并按合理的方式運動是一個挑戰(zhàn)。雖然連續(xù)碰撞檢測是最自然的方式,但它的實現(xiàn)非常復(fù)雜,運算開銷也很大,所以目前大部分成熟的物理引擎和碰撞檢測引擎還是采用了基于離散點的碰撞檢測,為了避免物體交迭過深或者彼此穿越,它們都要采用比較小的模擬步長。

        由于碰撞檢測引擎的復(fù)雜性和對效率的高要求,我們應(yīng)該盡量使用目前成熟的完整引擎,而不是自己去開發(fā)。經(jīng)過評估,我決定采用Opcode碰撞檢測引擎來做游戲中人物和場景的碰撞檢測。Opcode的主要功能是用aabb tree管理復(fù)雜三角形集合來和射線、球體,立方體,另一個三角形集合等進(jìn)行離散點上的碰撞檢測,如果檢測到交迭則返回所有發(fā)生交迭的三角形。Opcode的特點是高度的內(nèi)存使用優(yōu)化和極好的效率,ODE物理引擎底層就采用它來做復(fù)雜三角形mesh的碰撞檢測,Opcode的作者也是NovodeXPhysX前身)物理引擎的核心開發(fā)人員,據(jù)說NovodeX采用了Opcode的一個更優(yōu)化版本。由此可見Opcode的成熟與效率。

        確定了要使用的引擎,下面要討論的算法就和具體引擎無關(guān)了,適合于任何離散點的碰撞檢測引擎。我們用AABB包圍盒來代表場景中的人物,看看如何實現(xiàn)文章開頭所提出的效果。

         首先解釋一下檢測地面的方式,沿人物包圍盒的四條豎邊向下投四條射線,射線的終點略低于人物的腳底(也就是說射線的長度是有限的),如果與場景發(fā)生碰撞并且碰撞平面的斜率小于某一值則取得碰撞點的高度,否則視為這條射線沒有檢測到地面。將所有射線檢測到的地面高度最大值作為最后的地面高度,如果四條射線都沒有檢測到地面則認(rèn)為人物懸空。

 

vD = 當(dāng)前幀人物位移

p0 
= 人物包圍盒中心當(dāng)前位置

bOnGroundP1; 
// 人物是否站在地面

bOnGroundP3; 
// 人物是否站在地面

bOnGround; 
// 人物是否站在地面

 

p1 
= p0 + vD

在p1位置檢測地面

if( 檢測到地面 )

{

     將包圍盒下放到地面得到位置p2

     bOnGroundP1 
= true;

}


else

{

     p2 
= p1;

     bOnGroundP1 
= false;

}





測試p2點的包圍盒是否與場景交迭

if( 交迭 )

{

     取得所有交迭三角形的法線,將它們相加后取平均值,得到法線normal

     將法線與向上的向量叉乘得到切線方向tangent

     
// 計算人物沿切線滑動后的位置,注意這里用p0做計算。

     
// 如果要使滑動更平滑可以把p0向法線方向推出一些

     
// p3 = p0 + normal * 0.1f + vD.Dot(tangent);

     p3 
= p0 + vD.Dot(tangent); 

 

     在p3位置檢測地面

     
if( 檢測到地面 )

     
{

         將包圍盒下放到地面得到位置p4

          bOnGroundP3 
= true;

     }


     Else

     
{

         p4 
= p3;

          bOnGroundP3 
= false;

     }


 

     測試p4點的包圍盒是否與場景交迭

     
if( 交迭 )

     
{

         測試p1點的包圍盒是否與場景交迭

         
if( 交迭 )

         
{

              
// 無法得到合理的移動位置,人物位置保持不變

              
// 等待下一幀玩家調(diào)整前進(jìn)方向再做測試

              將p0作為人物的新位置

              bOnGround 
= true;

              
return;

         }


         
else

         
{

              將p1作為人物的新位置

              bOnGround 
= bOnGroundP1;

              
return;

         }


     }


     Else

     
{

         將p4作為人物的新位置

         bOnGround 
= bOnGroundP3;

          
return;

     }


}


else

{

     將p2作為人物的新位置

     bOnGround 
= bOnGroundP1;

     
return;

}

 

 

上面的算法基本達(dá)到了文章開頭所提到的效果,在某些復(fù)雜情況下人物移動還有些不流暢,但沒有發(fā)現(xiàn)人物有穿越障礙物的現(xiàn)象。在大部分情況下人物的新坐標(biāo)都會由p2點返回,最壞情況是人物被卡住返回p0點。在P4 3.0G的機器上可以支持120個人物在最壞情況下保持30幀的游戲幀數(shù)。

posted on 2007-12-29 12:08 楊粼波 閱讀(930) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久88综合亚洲精品ⅰ| 影音先锋亚洲一区| 一区二区电影免费观看| 亚洲欧美日韩在线不卡| 国产日产欧产精品推荐色 | 国产一区二区三区精品久久久 | 久久国产主播| 欧美sm视频| 一本色道久久综合亚洲精品婷婷| 欧美色视频一区| 欧美一级久久| 亚洲激情图片小说视频| 亚洲一级网站| 精品99一区二区| 欧美精品一区二区三区在线播放| 亚洲一区3d动漫同人无遮挡| 久久综合中文字幕| 一区二区三区欧美日韩| 国产午夜一区二区三区| 蜜桃av噜噜一区二区三区| 一区二区av在线| 久久在线精品| 亚洲一区观看| 亚洲国产aⅴ天堂久久| 国产精品国码视频| 久久只有精品| 亚洲欧美日韩一区二区在线 | 久久久久久有精品国产| 亚洲精品欧美专区| 国产欧美一区二区三区久久 | 激情综合亚洲| 欧美午夜一区二区福利视频| 久久亚洲捆绑美女| 亚洲综合成人婷婷小说| 亚洲激情第一页| 久久久精品性| 亚洲一区二区三区乱码aⅴ蜜桃女| 红桃视频成人| 国产精品亚洲不卡a| 欧美成人精品h版在线观看| 午夜精品免费在线| 亚洲最新视频在线播放| 欧美国产第一页| 久久久亚洲高清| 午夜精品婷婷| 亚洲视屏一区| 一本到12不卡视频在线dvd| 亚洲福利国产| 一区免费在线| 韩国三级在线一区| 国产日韩欧美日韩| 国产精品亚洲а∨天堂免在线| 欧美精品一区二区在线观看| 久久综合影视| 久久久久久亚洲精品中文字幕| 亚洲影院高清在线| 制服丝袜激情欧洲亚洲| 亚洲精品国产无天堂网2021| 欧美激情中文字幕一区二区| 麻豆久久婷婷| 欧美gay视频| 免费成人在线观看视频| 久热精品在线视频| 麻豆乱码国产一区二区三区| 久久久久久久999| 久久久爽爽爽美女图片| 久久人体大胆视频| 久久婷婷色综合| 狂野欧美一区| 免费观看在线综合| 欧美国产免费| 欧美激情一区二区三区在线| 亚洲高清中文字幕| 亚洲国产婷婷| 日韩午夜三级在线| 一区二区三区国产精华| 亚洲天堂网在线观看| 亚洲一区二区久久| 性欧美超级视频| 久久久www成人免费精品| 久久久免费av| 欧美二区在线看| 欧美日韩精品不卡| 国产精品欧美经典| 国内成人在线| 亚洲精品1区2区| 亚洲最新视频在线播放| 亚洲欧美在线高清| 久久精品九九| 欧美成人有码| 9l国产精品久久久久麻豆| 亚洲视频在线观看三级| 欧美亚洲在线视频| 久久手机免费观看| 欧美日韩国产精品专区| 国产精品一区在线观看| 国内揄拍国内精品久久| 亚洲精品乱码久久久久久按摩观 | 亚洲国产欧美另类丝袜| 亚洲精品视频在线观看网站| 亚洲一区二区三区在线观看视频| 香港成人在线视频| 免费亚洲电影在线| 欧美亚男人的天堂| 精品999在线播放| 中文久久精品| 久久九九免费视频| 亚洲激情综合| 欧美亚洲综合久久| 欧美激情视频一区二区三区免费 | 欧美a级理论片| 一本色道久久综合狠狠躁篇的优点 | 欧美韩日高清| 亚洲在线观看免费| 欧美高清视频在线| 国产亚洲欧美一区二区| 亚洲美女av在线播放| 久久爱www.| 亚洲免费高清| 久久综合伊人77777麻豆| 欧美午夜精品久久久久久孕妇| 伊人狠狠色j香婷婷综合| 亚洲一区二区免费视频| 欧美 日韩 国产精品免费观看| 中文欧美日韩| 欧美精品在线网站| 在线观看国产欧美| 欧美在线播放高清精品| 亚洲全部视频| 免费不卡亚洲欧美| 国产视频一区二区在线观看| 亚洲网友自拍| 亚洲高清一区二区三区| 久久精品人人| 国产欧美视频一区二区| 亚洲一区二区三区777| 亚洲成色最大综合在线| 欧美专区18| 国产亚洲精品一区二555| 亚洲免费影视第一页| 日韩视频不卡| 欧美激情视频一区二区三区免费 | 亚洲欧洲精品一区二区三区不卡| 久久久999精品免费| 国产精品一区二区在线| 亚洲欧美国产77777| 亚洲美女毛片| 欧美精品三级| 99精品国产在热久久| 亚洲第一天堂无码专区| 乱码第一页成人| 亚洲第一黄色网| 老司机午夜精品| 久久久久国产精品人| 国内精品视频一区| 久久黄金**| 亚洲欧美综合一区| 国产欧美在线观看| 欧美亚洲综合另类| 亚洲欧美国产三级| 国产精品中文在线| 久久精品国产欧美亚洲人人爽| 亚洲天堂网在线观看| 国产精品色在线| 欧美资源在线| 欧美在线一区二区三区| 黑丝一区二区| 欧美成人首页| 欧美精品在欧美一区二区少妇| 日韩一级黄色片| 一本色道久久99精品综合| 欧美性一二三区| 久久gogo国模啪啪人体图| 欧美在线视频二区| 在线欧美影院| 亚洲精品综合| 国产精品美女久久久免费 | 亚洲在线观看视频| 国产在线精品成人一区二区三区| 快播亚洲色图| 欧美成年人视频网站| 亚洲午夜一区| 性欧美1819性猛交| 亚洲国产欧美日韩另类综合| 亚洲精品久久久久久下一站 | 午夜精品视频| 久久精品国产久精国产一老狼 | 亚洲性xxxx| 性色av一区二区三区红粉影视| 亚洲福利在线观看| 亚洲精品乱码久久久久久| 欧美性开放视频| 久久手机精品视频| 欧美精品久久久久久久免费观看 | 亚洲免费视频成人| 在线欧美不卡| 中日韩视频在线观看| 国内外成人免费激情在线视频| 欧美激情网站在线观看| 国产精品美女www爽爽爽视频|