Unuity-BEPU 3D定點物理引擎實戰(zhàn)系列1.6 BEPU物理引擎碰撞系統(tǒng)的架構(gòu)與設(shè)計

前言

前面我們講解了如何監(jiān)聽物理引擎的碰撞事件, 在物理引擎內(nèi)核中如何架構(gòu)與設(shè)計碰撞規(guī)則,使得物理Entity與周圍的物理環(huán)境產(chǎn)生碰撞時府适,如何靈活的控制物理碰撞啦粹,本節(jié)給大家詳細的講解BEPUphysicsint 物理引擎內(nèi)部是如何管理與控制碰撞規(guī)則的。本文主要講解3個部分:
對惹枝誊,這里有一個游戲開發(fā)交流小組况芒,希望大家可以點擊進來一起交流一下開發(fā)經(jīng)驗呀!

(1) 物理引擎碰撞計算的全流程詳解;

(2) 用戶控制碰撞關(guān)系的規(guī)則詳解;

(3) 與物理碰撞相關(guān)的其它一些注意事項;

物理引擎碰撞計算的全流程詳解

物理引擎的碰撞計算是物理引擎性能消耗的部分之一叶撒,物理引擎如何高效的做好物理碰撞計算與物理引擎內(nèi)核如何標準的處理碰撞檢測流程(pipeline),詳細的步驟如下:

(1) BroadPhase 快速粗略碰撞檢測绝骚。通過這個步驟,快速的計算篩選出來可能產(chǎn)生碰撞的物理Entity碰撞對(Entity Collison Pair)祠够。要實現(xiàn)這個設(shè)計目標我們可以從物體與場景入手,可以簡化物體的形狀來做碰撞檢測压汪,通過物理場景,快速的排除掉不可能發(fā)生碰撞的物體,從而替代簡單的暴力搜索O(n^2)古瓤。每個物理Entity都有自己的包圍盒,能包圍住整個物理Entity的形狀止剖,當兩個物理Entity的包圍盒有重疊的時候,物理引擎會產(chǎn)生一個潛在可能的碰撞對,如圖1.6-1

圖1.6-1

找到這個碰撞對后落君,就會把物理碰撞對加入到物理世界的碰撞列表中穿香,來進行下一步計算。

(2) NarrowPhase 精確的計算碰撞绎速,生成碰信息皮获。經(jīng)過第一步的粗略計算,找出來了可能發(fā)生碰撞的物理Entity碰撞對纹冤。接下來就是要根據(jù)物理Shape形狀與角度來精確的計算出來是否有真實的碰撞以及詳細的碰撞點位置洒宝,表面法線信息等。注意不是所有的碰撞對都會產(chǎn)生碰撞,如上圖1.6-1所示,BroadPhase階段產(chǎn)生了碰撞萌京,但是NarrowPhase階段雁歌,卻發(fā)現(xiàn)沒有產(chǎn)生碰撞。

(3) Collision Respones階段: 物理碰撞系統(tǒng)的最后一個階段就是迭代計算出碰撞對每個物理Entity運動改變的影響枫夺。因為物理引擎中不允許兩個物理Entity穿透将宪。所以碰撞后就會改變物理Entity的運動狀態(tài)。

用戶定義碰撞規(guī)則

在物理引擎Pipeline的物理碰撞計算中要篩選出物理Entity碰撞規(guī)則。碰撞規(guī)則是指進入碰撞標準流程計算中采用哪種策略较坛。用戶可以指定物體的碰撞規(guī)則,指定碰撞計算策略印蔗。用戶定義碰撞規(guī)則可由有3個地方產(chǎn)生出來, 這3個地方按照優(yōu)先級進行篩選,如果當前沒有,就進入下一個位置篩選,都沒有丑勤,就用默認的碰撞規(guī)則华嘹。3個地方的分別如下(按照優(yōu)先級來區(qū)分):

Specific特殊碰撞規(guī)則表: 物理Entity有一個Specific列表保存了一些物理的Entity實例以及與這些Entity實例的碰撞規(guī)則,如果碰撞對中的Entity實例在這個表中,就返回這個表中的碰撞規(guī)則法竞。否則就進入下一個規(guī)則產(chǎn)生階段耙厚。

Personal 私有碰撞規(guī)則: 針對單個的物理的Entity,如果物理Entity設(shè)置了這個碰撞規(guī)則,就是用這個碰撞規(guī)則岔霸。

Group 碰撞分組:每個物體都可以設(shè)置一個碰撞分組薛躬,如果沒有設(shè)置就使用默認的碰撞分組。由所在的碰撞分組來決定碰撞規(guī)則呆细。

這3個決定碰撞規(guī)則的地方的優(yōu)先級別如圖1.6-2所示:

圖1.6-2

上面提到一個概念,碰撞規(guī)則,碰撞規(guī)則是決定了物體與物體之間的碰撞該如何處理與計算型宝。BEPU物理引擎分成了幾個規(guī)則:

**CollisionRule.Normal: **允許碰撞對(Collision Pair)經(jīng)歷完整的碰撞計算,完整的碰撞計算包括了broad phase, narrow phase, collision response三個階段絮爷。

**CollisionRule.NoSolver: **允許碰撞對經(jīng)歷broad phase, narrow phase階段,但是不計算碰撞信息與對物體運動狀態(tài)的改變趴酣。

**CollisionRule.NoNarrowPhaseUpdate: **允許碰撞對經(jīng)歷broad phase 與第一階段的narrow phase。但是narrow phase的計算結(jié)果不更新到碰撞對中坑夯。

**CollisionRule.NoNarrowPhasePair: **允許碰撞對經(jīng)歷broad phase的粗略測試,不進行narrow phase 測試岖寞。

CollisionRule.NoBroadPhase: 不做任何的碰撞測試。

**CollisionRule.Defer: **延后決定柜蜈,一個比較特殊的狀態(tài)仗谆,上面說了有3個地方可以決定碰撞策略,如果某一個地方?jīng)]有碰撞策略跨释,就返回CollisionRule.Defer胸私,進入到下一個地方厌处。如果所有都沒有鳖谈,就使用默認的策略。

講解完這些基本概念以后阔涉,我們來介紹一下基于碰撞分組Group如何具體產(chǎn)生碰撞策略缆娃。這種模式是我們開發(fā)中最常用的模式,當Specific與Personal兩個地方無法決定碰撞策略的時候,物體的碰策略就是由它所在的分組來決定瑰排。物理引擎內(nèi)核中有一個CollisionGroupRules字典贯要,描述了哪些Group分組到碰撞規(guī)則的映射。當前物體所屬哪個組椭住,就可以獲得該碰撞規(guī)則崇渗。要創(chuàng)建一個用戶自定義的組,只要new 一個CollisionGroup的實例,然后將與每個其它分組的碰撞規(guī)則設(shè)置到CollisionGroupRules表中即可宅广。有時候每個物體的類型會有沖突葫掉,那么如何取舍呢?這里的碰撞策略有一個優(yōu)先級:NoBroadPhase>NoNarrowPhasePair>NoNarrowPhaseUpdate>NoSolver>Normal跟狱。

物理碰撞相關(guān)的其它事項

用戶可自定義broad phase的測試函數(shù):我們可以通過設(shè)置物理Entity的CollisionRuleCalculator 的delegate 回調(diào)函數(shù)來定制broad phase碰撞測試時候的碰撞算法俭厚。這個回調(diào)函數(shù)最終會存到BroadPhase中的CalculateCollisionRuleCallback中。

kinematic 的物理Entity采用CollisionRule.NoSolver碰撞策略驶臊,這樣可以不用改變它們的物理的運動狀態(tài)挪挤。

今天的分享就到這里了,關(guān)注我們关翎,可以獲取Unity BEPUphysint3D實戰(zhàn)源碼扛门。

Unity / 精選推薦
Unity幀同步核心技術(shù):3D定點數(shù)物理引擎架構(gòu)實戰(zhàn)
https://www.bycwedu.com/promotion_channels/1731203403

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纵寝,隨后出現(xiàn)的幾起案子尖飞,更是在濱河造成了極大的恐慌,老刑警劉巖店雅,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政基,死亡現(xiàn)場離奇詭異,居然都是意外死亡闹啦,警方通過查閱死者的電腦和手機沮明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窍奋,“玉大人荐健,你說我怎么就攤上這事×瞻溃” “怎么了江场?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窖逗。 經(jīng)常有香客問我址否,道長,這世上最難降的妖魔是什么碎紊? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任佑附,我火速辦了婚禮,結(jié)果婚禮上仗考,老公的妹妹穿的比我還像新娘音同。我一直安慰自己,他們只是感情好秃嗜,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布权均。 她就那樣靜靜地躺著顿膨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叽赊。 梳的紋絲不亂的頭發(fā)上虽惭,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音蛇尚,去河邊找鬼芽唇。 笑死,一個胖子當著我的面吹牛取劫,可吹牛的內(nèi)容都是我干的匆笤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谱邪,長吁一口氣:“原來是場噩夢啊……” “哼炮捧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惦银,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤咆课,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扯俱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體书蚪,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年迅栅,在試婚紗的時候發(fā)現(xiàn)自己被綠了殊校。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡读存,死狀恐怖为流,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情让簿,我是刑警寧澤敬察,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站尔当,受9級特大地震影響莲祸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜居凶,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一虫给、第九天 我趴在偏房一處隱蔽的房頂上張望藤抡。 院中可真熱鬧侠碧,春花似錦、人聲如沸缠黍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至替饿,卻和暖如春语泽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背视卢。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工踱卵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人据过。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓惋砂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绳锅。 傳聞我的和親對象是個殘疾皇子西饵,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容