PhysX 3.3 基礎(chǔ)

概述

PhysX目前是由 NVIDIA 開源的一個3D物理引擎瘟忱,由于其功能強大,目前已經(jīng)繼承在了各大商業(yè)游戲引擎中苫幢,例如 Unreal, Unity等访诱。

基本概念

PxScene

場景對象,同一個場景中的物體才有可能進行物理碰撞等韩肝,因此場景是一個場景物體的管理者触菜。

PxRigidActor

剛體對象(Rigidbody)的封裝

PxShape

幾何體的封裝, 每個 PxRigidActor 可以綁定多個 PxShape 對象哀峻,一般是通過 PxRigidActor 來創(chuàng)建 PxShape.

PxControllerManager

CharacterControllerManager涡相,用于創(chuàng)建 CharacterController。

CharactorController

上層封裝剩蟀,其實就是一個 PxRigidStatic 和 一個 PxShape 的組合體催蝗。

碰撞過濾器 ReportFilterShader

ReportFilterShader用于指定哪些 intersection pairs 需要被處理,因為這個在物理引擎底層需要被頻繁調(diào)用育特,因此性能至關(guān)重要丙号,因此提出了 FilterShader 這樣的概念,這 filter 的工作在 GPU 上也能運行缰冤,即使在 CPU 上運行也能并行犬缨。例子如下:

PxFilterFlags contactReportFilterShader(PxFilterObjectAttributes attributes0, 
    PxFilterData filterData0, 
    PxFilterObjectAttributes attributes1, 
    PxFilterData filterData1,
    PxPairFlags& pairFlags, 
    const void* constantBlock, 
    PxU32 constantBlockSize)
{

    if(PxFilterObjectIsTrigger(attributes0) || PxFilterObjectIsTrigger(attributes1))
    {
        pairFlags = PxPairFlag::eTRIGGER_DEFAULT;
        return PxFilterFlag::eDEFAULT;
    }

    pairFlags = PxPairFlag::eCONTACT_DEFAULT;

    // trigger the contact callback for pairs (A,B) where
    // the filtermask of A contains the ID of B and vice versa.
    // PX_INFO("contactReportFilterShader|%x|%x|%x|%x", filterData0.word0, filterData1.word1, filterData1.word0, filterData0.word1); 
    if((filterData0.word0 & filterData1.word1) && (filterData1.word0 & filterData0.word1))
    {
        pairFlags |= PxPairFlag::eNOTIFY_TOUCH_FOUND;
        return PxFilterFlag::eDEFAULT;
    }

    return PxFilterFlag::eDEFAULT;
}

我們需要了解 ReportFilterShader 函數(shù)的參數(shù)含義以及返回值的含義:
先看看文檔是怎么描述的:

The arguments of SampleSubmarineFilterShader() include PxFilterObjectAttributes and PxFilterData for the two objects, and a constant block of memory. Note that the pointers to the two objects are NOT passed, because those pointers refer to the computer's main memory, and that may, as we said, not be available to the shader, so the pointers would not be very useful, as dereferencing them would likely cause a crash. PxFilterObjectAttributes and PxFilterData are intended to contain all the useful information that one could quickly glean from the pointers. PxFilterObjectAttributes are 32 bits of data, that encode the type of object: For examplePxFilterObjectType::eRIGID_STATIC, ::eRIGID_DYNAMIC, or even ::ePARTICLE_SYSTEM. Additionally, it lets you find out if the object is kinematic, or a trigger.
Each PxShape and PxParticleBase object in PhysX has a member variable of type PxFilterData. This is 128 bits of user defined data that can be used to store application specific information related to collision filtering. This is the other variable that is passed to SampleSubmarineFilterShader() for each object.
There is also the constant block. This is a chunk of per-scene global information that the application can give to the shader to operate on. You will want to use this to encode rules about what to filter and what not.
Finally, SampleSubmarineFilterShader() also has a PxPairFlags parameter. This is an output, like the return value PxFilterFlags, though used slightly differently. PxFilterFlags tells the SDK if it should ignore the pair for good (eKILL), ignore the pair while it is overlapping, but ask again, when filtering related data changes for one of the objects (eSUPPRESS), or call the low performance but more flexible CPU callback if the shader cannot decide (eCALLBACK).
PxPairFlags specifies additional flags that stand for actions that the simulation should take in the future for this pair. For example,eNOTIFY_TOUCH_FOUND means notify the user when the pair really starts to touch, not just potentially.

簡單解釋一下:

  • attributes0 和 filterData0 是 intersection pair 中 第一個 PxShape 的數(shù)據(jù),前者表示 PxShape 的 Type(PxFilterObjectType::eRIGID_STATIC, ::eRIGID_DYNAMIC, or ::ePARTICLE_SYSTEM棉浸, 是否是 kinematic 或者是一個 trigger)怀薛,后者是 PxShape 的 UserData,在創(chuàng)建 PxShape 的時候可以通過 PxShape::setSimulationFilterData 函數(shù)指定迷郑;
  • attribute1 和 filterData1 是 intersection pair 中另一個 PxShape 的數(shù)據(jù)乾戏,含義類似迂苛;
  • PxFilterFlags 返回值是告訴SDK三热,如何處理這一對物體的碰撞鼓择,是放棄這一次碰撞的處理(eKILL),還是暫不處理除非這一次碰撞中filterData被改變(eSUPRESS)就漾,還是報告需要回調(diào)函數(shù)(eCALLBACK,eNOTIFY)等呐能。而pairFlags則是定義,如果需要回調(diào)函數(shù)的話抑堡,在什么情況下摆出,報告回調(diào)函數(shù),如碰撞被發(fā)現(xiàn)(eNOTIFY_TOUCH_FOUND), 碰撞結(jié)束兩個物體已分離(eNOTIFY_TOUCH_LOST)等首妖。
  • constantBlock 和 constantBlockSize (This is a chunk of per-scene global information that the application can give to the shader to operate on. You will want to use this to encode rules about what to filter and what not.)

在創(chuàng)建場景的時候需要指定一個 FilterShader 用于解決后面的碰撞檢測偎漫,這是在 PxSceneDesc 中指定的;然后在創(chuàng)建 PxShape 的時候需要指定 filterData有缆,通過 PxShape::setSimulationFilterData 函數(shù)指定象踊,其中的 word0 字段一般指定 layer,word1 字段指定和哪些 layer 之間會發(fā)生碰撞棚壁。

碰撞回調(diào) PxSimulationEventCallback

場景中所有的碰撞都需要 developer 自己來進行處理杯矩,用于實現(xiàn)一個類繼承 PxSimulationEventCallback,基類如下:

class PxSimulationEventCallback {
public:
    void onConstraintBreak(PxConstraintInfo* constraints, PxU32 count) ;
    void onWake(PxActor** actors, PxU32 count);
    void onSleep(PxActor** actors, PxU32 count) ;
    virtual void onTrigger(PxTriggerPair* pairs, PxU32 count);
   void onContact(const PxContactPairHeader& pairHeader, const PxContactPair* pairs, PxU32 nbPairs) ;
};

一般而言只需要處理 OnTrigger 和 OnContact 方法袖外。

CharacterController 碰撞回調(diào)

需要設(shè)置 PxCapsuleControllerDesc.reportCallback史隆,其中需要實現(xiàn):

void onShapeHit(const PxControllerShapeHit& hit);
void onControllerHit(const PxControllersHit& hit);

前者表示和其他 PxShape 的碰撞,后者表示和其他 CharacterController 的碰撞曼验。

一般使用流程

  1. PxCreateFoundation 創(chuàng)建 PxFoundaPxPhysicsion 對象泌射,全局唯一;
  2. PxCreatePhysics 創(chuàng)建 Physics對象鬓照,全局唯一熔酷;
  3. PxCreateCooking 創(chuàng)建 PxCooking 對象,全局唯一颖杏;
  4. PxSerialization::createSerializationRegistry 創(chuàng)建 PxSerializationRegistry 對象纯陨,全局唯一;
  5. 需要打開一個場景的時候留储,使用 Physics::CreateScene 創(chuàng)建一個場景翼抠,打開多個場景則需要創(chuàng)建多個 Scene 對象,設(shè)置好 FilterShader 和 SimulationCallback获讳;
  6. 創(chuàng)建 Static 或者 Dynamic Actor 或者 CharacterController;
  7. Tick 中獲取 Dynamin Actor 和 CharacterController的位置同步給邏輯層使用阴颖,同時在 SimulationCallback 中將碰撞信息通知邏輯層。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐膝,一起剝皮案震驚了整個濱河市量愧,隨后出現(xiàn)的幾起案子钾菊,更是在濱河造成了極大的恐慌,老刑警劉巖偎肃,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煞烫,死亡現(xiàn)場離奇詭異,居然都是意外死亡累颂,警方通過查閱死者的電腦和手機滞详,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紊馏,“玉大人料饥,你說我怎么就攤上這事≈旒啵” “怎么了岸啡?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赫编。 經(jīng)常有香客問我巡蘸,道長,這世上最難降的妖魔是什么沛慢? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任赡若,我火速辦了婚禮,結(jié)果婚禮上团甲,老公的妹妹穿的比我還像新娘逾冬。我一直安慰自己,他們只是感情好躺苦,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布身腻。 她就那樣靜靜地躺著,像睡著了一般匹厘。 火紅的嫁衣襯著肌膚如雪嘀趟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天愈诚,我揣著相機與錄音她按,去河邊找鬼。 笑死炕柔,一個胖子當著我的面吹牛酌泰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匕累,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼陵刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欢嘿?” 一聲冷哼從身側(cè)響起衰琐,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤也糊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羡宙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸剃,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年辛辨,在試婚紗的時候發(fā)現(xiàn)自己被綠了捕捂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗搞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慷妙,到底是詐尸還是另有隱情僻焚,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布膝擂,位于F島的核電站虑啤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏架馋。R本人自食惡果不足惜狞山,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叉寂。 院中可真熱鬧萍启,春花似錦、人聲如沸屏鳍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钓瞭。三九已至驳遵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間山涡,已是汗流浹背堤结。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸭丛,地道東北人竞穷。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像系吩,于是被迫代替她去往敵國和親来庭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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