Box2D物理引擎(1)

目前在自學Cocos2d-x,學到了Box2D,總結了一點Box2D的知識。有什麼不對地方希望指出,共同學習。

1.Box2D物理引擎介紹
它是一個開源的,C++的一個物理引擎。物理引擎就是解決遊戲中物理規律的變化,主要是按照物理規律來進行計算剛體的運動軌跡。Box2D可以和Cocos2D完美結合
Box2D屬於純C++的物理引擎
而Chipmunk是屬於純C的物理引擎

物理引擎中的基本概念
①世界 b2World
一個世界就是一個模擬,一個物理世界的所有物體都會按照這個世界的重力、摩擦力、阻力等等進行模擬

構造函數
b2World(const b2Vec2& gravity , bool doSleep);//gravity就是設定這個世界的重力
代碼片段:

b2Vec2 gravity;
gravity.Set(0.0f,-5.0f);//表示這個世界裏物體自由下落,若橫縱座標都爲0,則不動
b2World * world= new b2World(gravity,true);

②剛體b2Body
剛體是物理引擎中不變形的對象
剛體有自身的屬性b2BodyDef
剛體有若干的b2Fixtrue屬性
剛體有質心點(決定碰撞之後它的角速度)

③b2Fixtrue
b2Fixtrue是依附在剛體上的物理特質屬性
b2Fixtrue有各種形狀(形狀、密度、質量)
使用的尺寸是米,沒有像素,是多少米的概念
一個b2Body可以有多個b2Fixture,每個Fixture表示一個物理特性
Shape 形狀
Density 密度
Friction 摩擦力
Restitution 恢復係數

④b2Shape
形狀都是b2Shape的子類
比如:b2polygonShape 多邊形形狀,b2CircleShape 圓形形狀

像素與米的換算關係:1米=32像素

創建靜態(Static)剛體b2Body
什麼是靜態剛體?比如:地面就是一個靜態剛體,即使碰到它,它也不會移動。
代碼片段:

b2BodyDef groundBodyDef;
goundBodyDef.position.Set(0,0);
b2Body * groundBody=world->CreateBody(&groundBodyDef);

創建dynamic剛體b2Body(動態剛體)
動態剛體就是碰到他以後,他會發生移動。
代碼片段:

b2BodyDef  ballBodyDef;
ballBodyDef.type=b2_dynamicBody;//表示爲動態剛體
ballBodyDef.position.Set(100/32,100/32);//要轉換成物理事件,座標爲米,所以用像素除以32,而在屏幕上的座標是100,100
ballBodyDef.userData=self;//userData就是指這個剛體有一些附加信息,是self,事實上就是一個指針,指向任意類型的指針,self一般是精靈
b2Body *ballBody=world->CreateBody(&ballBodyDef);

剛體子彈效應
剛體在做碰撞的時候其實是在做一個實時的計算,進行一個仿真模擬。如果這個剛體很薄,比如一個球,一面牆,球可能把牆給穿過去了。在實際開發中可能會有這種穿透的效果。當加上下面這句代碼,它就不能穿透了
ballBodyDef.bullet=yes;

創建剛體b2Fixture

b2FixtureDef ballShapeDef;
ballShapeDef.shape=&blockShape;    //形狀
ballShapeDef.density=80.0f;         //密度
ballShapeDef.friction=1.0f;          //摩擦力
ballShapeDef.restitution=0.5f;       //恢復係數
ballBody->CreateFixture(&ballShapeDef);   //綁定

Box2D總體關係圖
這裏寫圖片描述

一個b2World可以有很多b2Body,每個b2Body可以有多種屬性,多種b2Fixture,每個b2Fixture又有各種屬性、形狀

Cocos2d和Box2D對應關係
這裏寫圖片描述

Box2D只有數據的模擬,它只有數據的變化,如剛體在哪,座標多少,都沒有顯示。那麼就需要通過Cocos2D讓它顯示出來,因此在開發的時候,Box2D只是一個數據的模擬,我們就需要通過精靈層,通過Node把這些剛體呈現。Cocos2D是物理世界中的呈現,所有的精靈都是表示物理世界的座標。Box2D屬於邏輯數據層,Cocos2D屬於顯示層

Box2D模擬原理
這裏寫圖片描述

假設我們定義了10個剛體,定了重力、速度和衝量。在t0的時,所有剛體都會由座標的變化而變化,在t1時也有,t2時也有,直到tn時也有。這樣就可以用現在來模擬未來,當到第n個時間的時候,我們這些剛體會是個什麼狀態,在什麼位置,它就是通過這種方式來進行計算和模擬

模擬世界b2World

void b2World::Step(float32 dt,int32 velocitylterations,int32 positionlterations);//Step表示下一步,如該時刻這個球在100米處,下一刻往下落,到了n米處,再一刻等等..一般會把這個方法寫到cocos2d-x的update方法中
b2Body * b2World::GetBodyList();//得到模擬完的當前剛體的座標
int32 GetBodyCount() const;

b2Body常用方法

Const b2Vec2& b2Body::GetPosition() const;

void b2Body::SetLinearVelocity(const    b2Vec2& v);//設置線速度
b2Vec2 b2Body::GetLinearVelocity() const;   //得到線速度

void b2Body::SetAngularVelocity(float32 w);  //設置角速度
float32 b2Body::GetAngularVelocity() const;  //得到角速度

float32 b2Body::GetAngle() const;//得到角度
bool b2Body::IsAwake() const;

未完待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章