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;

未完待续…

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