1. 程式人生 > >cocos2dx物理引擎和碰撞檢測(五)框架Fixtures

cocos2dx物理引擎和碰撞檢測(五)框架Fixtures

框架Fixture是動態模組中的一個重要的概念,它和形狀Shape將來都是要附加到物體Body上。在一開始介紹Box2D引擎時,就曾說過物理引擎可以被看作是兩部分:碰撞檢測和物理模擬。形狀Shape是用來進行碰撞檢測的,那麼框架Fixture就是用來進行物理模擬的。在介紹框架之前,先來了解一下動態模組的組成部分。

動態模組(Dynamics Module)

動態模組是我們將要介紹的最後一個模組。它也是Box2D引擎張最為複雜的一個。在遊戲製作中,開發者使用最多的也是這個模組之中的。動態模組建立在通用和碰撞模組的基礎之上。它包含的內容有:框架(Fixtures)、物體(Bodies)、接觸(Contacts)、關節(Joints)、世界(world)、監聽器(Listener)。

這些內容彼此相互依賴,很難再不提及其他類的情況下單獨描述一個類,在明確了動態模組組成後,下面首先介紹第一個框架類。

框架(Fixtures)

在上節講了形狀Shape,那麼大家想下,形狀雖然明確了物體的外形,但是並不知道物體的存在,形狀只是用來進行碰撞檢測,物理模擬誰來負責呢以及如何讓物體和形狀聯絡在一起呢?Box2D引擎提供了類b2Fixture,這個類用來將形狀附加到物體上進行物理模擬,同時具備了一些物理屬性。下面列出框架Fixture的屬性:密度(density)、摩擦(friction)、恢復(restitution)、碰撞篩選標記(collision filtering flags)、感應器標記(sensor flag)。

密度(density)

密度這個沒什麼好說的,只要學過物理知識的人,都應該知道霧都是用來計算物體的質量的。同樣形狀尺寸的物體,在其密度提升一倍的情況下,其質量也會提升一倍。

摩擦(Friction)

摩擦也是一個簡單的物理學概念。它可以使物件逼真地沿物件滑動或者反向的摩擦力。Box2D引擎支援靜態摩擦和動態摩擦,兩者都使用相同的摩擦係數為引數。摩擦係數經常會設定在0-1之間。0意味著沒有摩擦,1會產生強摩擦。讀者也可以使用其他的非負數作為摩擦係數。當計算兩個形狀之間的摩擦時,引擎必須計算兩個形狀的摩擦係數,公式如下:

float32 firction;

firction = sqrtf(shape1->firction * shape2->firction);


恢復(Restitution)

恢復可以理解為一個反彈,它可以使物件彈起,它的值設定在0-1之間。恢復就是一個物體碰撞後反彈大小的引數,值為0表示小球不會彈起,稱為非彈性碰撞;為1表示小球的速度和原來的一樣,只是方向相反,稱為完全彈性碰撞。恢復通過下面的公式合成:

float32 restitution;

restitution = b2MAX(shape1->restitution,shape2->restitution);

當一個形狀多次碰撞時,恢復會近似的模擬,Box2Dy引擎使用了迭代求解器,逐步遞迴計算恢復的數值,另外一點,當碰撞的速度很小時,為了防止抖動,引擎也會使用非彈性碰撞。

篩選(Filtering)

碰撞篩選是一個防止某些形狀發生碰撞的系統。框架Fixture會攜帶碰撞篩選資訊,讓開發者來設定某些遊戲物件相互碰撞的關係。也就是設定哪些可以存在碰撞檢測,哪些不存在碰撞檢測。
在形狀建立之後,開發者也可以去改變其碰撞篩選。此時可以使用函式b2Shape::GetFilterData以及b2Shape::SetFilterData來訪問及設定已存在框架的b2FilterData結構。也就是說,無論在任何時候,開發者都可以修改碰撞篩選的設定。

注意:就算修改了篩選資料,到下一個時間步為止,現在的接觸並不會增加或刪除。

感應器:

感應器是用來檢測兩個框架是否相交的物件。遊戲邏輯當中有的時候只需要判斷兩個框架是否相交,但卻不應該有碰撞反應。最常見的情況,就是角色失去道具的時候,比如在魂鬥羅中,玩家控制的角色可以拾取道具來更換武器,此時就會通過感應器來完成。

注意:感應器物件也是個框架,但只會偵測碰撞而不產生其他反應。

開發者可以將任何一個框架物件設定為感應器,感應器可以是靜態的也可以是動態的。因為引擎當中允許在一個物體上附加多個框架物件,所以感應器和實體框架是可以混合存在的。從程式碼的角度來看,感應器在發生碰撞時,是不會生成接觸點的,這裡有兩種函式來得到感應器的狀態:

//是否接觸

b2Contact::IsTouching

//開始接觸點和結束接觸點

b2ContactListener::BeginContact和EndContact

相關推薦

cocos2dx物理引擎碰撞檢測()框架Fixtures

框架Fixture是動態模組中的一個重要的概念,它和形狀Shape將來都是要附加到物體Body上。在一開始介紹Box2D引擎時,就曾說過物理引擎可以被看作是兩部分:碰撞檢測和物理模擬。形狀Shape是用來進行碰撞檢測的,那麼框架Fixture就是用來進行物理模擬的。在介紹框

cocos2dx物理引擎碰撞檢測(六)物體Bodies

前面已經講到形狀和框架的含義,它們分別是用來進行碰撞檢測和物理模擬的物件。到現在我們建立的物理世界當中,還未存在任何的物體。因此接下來的內容就介紹物理世界的主角:物體(Body)。它是構成世界的主要因素,因為不僅框架,形狀會依附於物體,就連後面介紹的關節也是要繫結在物體之上

cocos2dx物理引擎碰撞檢測(四)形狀Shapes

前面讓大家瞭解了物理世界,下面將為大家介紹物理世界中的物體。 形狀Shape描述了可相互碰撞的幾何物件的外形,它通常會是一個幾何圖形,這與包圍盒的概念非常相似。在引擎當中,形狀可以作為一個單獨的物件,就算不進行物理模擬,也可獨立使用,開發者可以在形狀Shape上執行一些函式

cocos2dx物理引擎碰撞檢測(三)

上文中講到了如何遍歷物理世界,但是大家想想,我們訪問了世界容器中的每一個物體,只是為了找到一個匹配的物件,這是一個非常耗時的操作,如果遊戲當中存在一百個物件,此時開發者只想找到一個發生碰撞的物件,難道就必須要將一百個物件都訪問一遍嗎?所以Box2D引擎提供了一種訪問物件的方

實例介紹Cocos2d-x中Box2D物理引擎碰撞檢測

函數實現 pda creates pty blank oid rtu and 重構 在Box2D中碰撞事件通過實現b2ContactListener類函數實現,b2ContactListener是Box2D提供的抽象類,它的抽象函數:virtual void BeginC

Unity3D物理引擎碰撞

本小節主要是Unity物理引擎,剛體碰撞方面的散記。 Character Controller的一些特性: 本身不受physics影響,需要接受外力作用時,使用onCharacterColliderHit(). Skin width:最好設定為radius的10%,防止

例項介紹Cocos2d-x中Box2D物理引擎碰撞檢測

在Box2D中碰撞事件通過實現b2ContactListener類函式實現,b2ContactListener是Box2D提供的抽象類,它的抽象函式:virtual void BeginContact(b2Contact* contact)。兩個物體開始接觸時會響應,但只調用

利用jsplumb碰撞檢測自動生成流程圖

for ans ont != 500px cat clone tran tex 使用jsplumb構建流程圖模型時,有一個需求要求,選項可以從選項表中拖拽到指定容器,並且兩個選項要接觸到的時候才能連接起來,不接觸不能連接。效果圖如下 略醜~ 因為這裏用到了拖拽,拖放功

【JavaScript】實現元素拖拽碰撞檢測

function drag() { var src1 = document.getElementById("src-1"); var src2 = document.getElementById("src-2"); var src3 =

unity物理引擎--Collider(碰撞器)

碰撞器可以實現的功能:字面意思,讓兩個物體碰撞(即物體接觸不會穿過物體)並可以產生一個碰撞事件 一般來說建立一個物體時系統會自動匹配相應的Collider(碰撞器) 但只是對系統自帶的物體來說,下面說一下如何新增/修改碰撞器       u

Unity觸發檢測碰撞檢測

void OnCollisionEnter(Collision col) { Debug.Log("開始碰撞" + col.collider.gameObject.name); } void OnCollisionStay

cocos2dx 3.x 物理引擎接觸檢測掩碼、碰撞掩碼類別掩碼問題解析

言簡意賅,物體的類別掩碼CategoryBitMask和物體的接觸測試掩碼ContactTestBitmask邏輯“與”運算結果非零,則觸發EventListenerPhysicsContact事件監聽器,物體的類別掩碼CategoryBitMask和物體

cocos2dx 精靈的碰撞檢測消滅(3)

在上一篇的基礎上增加了一點內容,必要的註釋都寫在程式碼裡了,,就直接貼程式碼吧,我也懶得寫詳細的過程。 HelloWorldSence.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #in

基於JBox2D物理引擎開發的“雷電”小遊戲()——碰撞

不好意思,隔了這麼久才發這一篇文章,雖然部分原因是最近因為實習的事情很忙,還有一部分原因是比較懶,廢話不多說,現在開始正文。 碰撞 既然學到了這裡,想必大家都明白,物理引擎會幫我們做很多事情,省去從零開始碼程式碼的工作量,當然“碰撞”也會由我們的物理引擎

物理引擎中不規則物體的碰撞檢測

在運用物理引擎的時候,經常回出現這種情況,不規則物體的碰撞檢測無法更加精確的測量,那麼,小杰今天就帶您一起解決這個問題!!! 首先下載一個windows下面的軟體 名稱是:PhysicsEditor ,這個軟體可以幫助你設計不規則的圖形。軟體的使用方法在這裡不具體講解了,說

bullet物理引擎與OpenGL結合 匯入3D模型進行碰撞檢測 以及畫三角網格的坑

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/11681069.html         一.初始化世界以及模型 /// 衝突配置包含記憶體的預設設定,衝突設定。高階使用者可以建立自己的配置。 btDefault

chipmunk 物理引擎的基本概念基本用法

num 碰撞回調 2.0 ddb mat sha print 單獨 得出 chipmunk是一個開源2D物理引擎, 項目主頁:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,這個引擎的資料還是不多,我閱讀了

Cocos2d-x 3.0中 物理碰撞檢測中onContactBegin回調函數不響應問題

track 後來 which compare mar details egl def trac 好吧,事實上這篇也是暫時冒出來的,近期朋友要做個物理遊戲,曾經做物理還是用box2d,呃。確實要花些功夫才幹搞懂當中的精髓,可是聽講這套引擎又一次封裝了一次。要easy非

canvas遊戲動畫中的碰撞檢測

底部 bsp rect circle 進行 eight nbsp odi word 碰撞檢測關鍵步驟 碰撞檢測需要處理經歷下面兩個關鍵的步驟: 計算判斷兩個物體是否發生碰撞 發生碰撞後,兩個物體的狀態和動畫效果的處理 計算碰撞 只要兩個物體相互接觸,它們就會發生碰撞

VR有種全域性光照渲染引擎各自的優缺點

來自: 喜歡(有些日子總是令人無法淡忘) 2008-10-20 15:53:26 VR有五種全域性光照渲染引擎:  Irradiance map(發光帖圖)  Photon map(光子帖圖)  QMC(準