初入Box2D

创建Box2D物理世界

1
2
// Vector2为x与y方向加速度
World = new World(new Vector2(0, -9.8f));

明确换算单位

Box2D中的计量单位是米(m),而目前大部分的平台渲染都是基于像素px的,所以在进行渲染计算时,要注意对坐标或形状尺寸进行转换。通常 $$1m=30px$$

开启2D模拟

调用World.Step(float timeStep);函数进行世界的模拟与刷新。 注意Box2D中计时单位是秒,不是帧!

timeStep

每次调用刷新函数间隔,由于Box2D世界计时单位是秒,所以要进行转化。 比如你游戏想运行在60帧,即一秒刷新60次,每次耗时1/60秒,那么timeStep = 1/60;

初识刚体

什么是刚体

一个固态的物体,他至少包含看得见或者摸得着这两个特性之一。 b2Body是Box2D的核心类,是学习Box2D的基础,也是重中之重。

创建刚体

创建一个刚体,不单单是b2Body的事情,还要创建多个对象,包括b2BodyDef和b2FixtureDef对象,然后在这些对象的协同合作下,完成刚体的创建。

1
2
3
4
//World = new World(new Vector2(0, -9.8f));
Body ground;
var bd = new BodyDef();
ground = World.CreateBody(bd);

b2FixtureDef最为重要的一个特性是它定义了刚体的形状,保存在shape属性中,刚体的形状用来勾勒出物体的轮廓,实现精确的物理碰撞模拟。 没有定义形状的刚体只是一个“空刚体”,无法进行任何物理模拟。 b2FixtureDef对象的shape属性值是一个b2Shape对象,他同样是创建刚体必不可少的一个条件,不过他是b2FixtureDef的一个属性。

1
2
3
4
5
6
7
8
9
10
11
var bd = new BodyDef
{
BodyType = BodyType.DynamicBody,
AllowSleep = false,
Position = new Vector2(0.0f, 10.0f)
};
var body = World.CreateBody(bd);

var shape = new PolygonShape();
shape.SetAsBox(0.5f, 10.0f, new Vector2(10.0f, 0.0f), 0.0f);
body.CreateFixture(shape, 5.0f);

刚体形状

b2Shape只是一个抽象的父类,没有实际创建形状的过程。 在实际开发中,都是用b2CircleShape,b2PolygonShape等b2Shape的子类对象。

圆形

只有一个半径属性,注意除以30px

1
2
3
4
5
var bfd =new FixtureDef();
var circleShape = new CircleShape();
circleShape.Radius = 30;
bfd.Shape = circleShape;
body.CreateFixture(bfd);

矩形

Box2D中矩形通过b2PolygonShape创建,但是b2PolygonShape是多边形类,创建矩形只是其功能中最简单的一个。 因为多边形的形状尺寸,都是不确定因素,所以b2PolygonShape没有在构造函数中设定任何参数,而是根据具体的形状,调用对应的函数来创建并返回相应的形状。 例如SetAsBox(float hx, float hy, in Vector2 center, float angle)用来创建以刚体坐标位置为中心点的矩形,即宽高都是相对于刚体坐标位置对称的。 hx:矩形半宽 hy:矩形半高(长) center:相对于自身坐标系的中心点 angle:相对于自身坐标系的旋转度

小结

1.创建b2BodyDef对象,定义刚体的坐标和速度相关属性 2.创建b2FixtureDef对象,定义物质材料特性相关属性 3.创建b2Shape子类对象,定义刚体形状 4.基于b2Body创建刚体,依据b2FixtureDef中定义的形状和其他属性,调用刚体的CreateFixture()添加形状。

刚体属性详解

b2BodyDef

b2BodyDef类包含的缸体属性有10多种,包括刚体类型,线性速度,角速度等,主要是刚体运动和状态相关的属性。

状态类属性

active

刚体是否处于激活状态,如果为false,将不会被渲染和参与物理模拟。

awake

是否处于唤醒状态,当发生碰撞时,将会惊醒,一般不需要对他进行设置

allowSleep

刚体是否允许休眠,为false时,一直保持清醒状态

bullect

开启CCD碰撞检测,避免高速物体穿透检测,性能开销较大,请谨慎使用

角度,角速度类属性

angle

刚体的角度,这是一个弧度,注意角度/弧度转换

使用GetAngle和SetAngle进行读写

angularVelocity

刚体角速度,单位弧度/秒,注意单位换算,我们通常使用度/帧

坐标,速度类属性

position

刚体坐标,即刚体在b2World中的位置,同时也是刚体本地坐标系统的坐标原点。

linearVelocity

刚体运动的线性速度,单位米/秒,在赋值时同样要注意单位转换。游戏渲染时速度单位通常是像素/帧。

linearDamping

线性速度阻尼,取值在0~1,与将速度阻尼类似。

其他属性

刚体类型

b2_staticBody 静态刚体,指静止不动的,碰撞后不进行反弹等运动模拟的刚体。此类刚体不受任何外力影响,不能调节速度。 b2_kinematicBody 可动刚体,碰撞后不进行反弹等运动模拟的刚体。可以调节速度。 b2_dynamicBody 动态刚体,拥有一切正常功能的刚体。 bullect只对动态刚体有效,另外两个刚体类型的bullect默认开启的。 游戏在运行时可以动态改变刚体的类型。

userData

用户自定义数据,可以将任何类型的值或者对象赋值给该属性。

b2FixtureDef

碰撞属性

b2FilterData

刚体筛选条件,只对符合条件的刚体进行碰撞检测 groupIndex:当前刚体的碰撞分组,默认为0 categoryBits:当前刚体的碰撞类别,默认0x0001,需要与maskBits属性搭配使用 maskBits:当前刚体的筛选类别,默认为0xFFFF,需要与categoryBits搭配使用 对categoryBits和maskBits进行按位与(&)以及逻辑与(&&)操作来实现碰撞过滤。

isSensor

若为true,当与其他刚体发生碰撞时,只进行碰撞检测和派发碰撞事件,但不进行碰撞模拟,不影响其他刚体的线性速度,角速度等运动属性。

形状

b2CircleShape

GetLocalPosition:获取圆形本地坐标 SetLocalPosition:调整圆形的本地坐标 ResetMassData:重新计算刚体的重心坐标,避免不可预知的错误 GetRadius:获取圆形的半径大小 SetRadius:设置圆形的半径大小 Clone:返回当前圆形的副本

b2PolygonShape

用来实现除标准圆外的所有形状。 Set:将一组保存在point数组中的顶点连接起来绘制成刚体的多边形形状 points:一个保存了多个Vec2对象的数组 count:创建多边形时从points数组中去除的顶点数 SetAsBox:将当前形状设置成半宽为hx,半高为hy的矩形 SetAsOrientedBox:将当前形状社会为半宽为hx,半高为hy,中心点为center,角度为angle的矩形(angle大于0顺时针旋转,小于0逆时针旋转

b2EdgeShape

用来创建一个点到点的线段形状,通常用法是模拟凹凸不平的地面,或者形成一个封闭的线框,限制只能在边框内移动 Set(v1,v2)创建一条一v1,v2为端点的线段形状 无法被旋转 线段之间不会碰撞,但是线段可以与别的类型刚体发生碰撞

b2ChainShape

可以看成b2EdgeShape升级版,将一组顶点连接起来形成“线条” CreateChain(vecs,count):将保存了顶点数组vecs的前count个顶点连接起来 CreateLoop:将保存了顶点数组vecs的前count个顶点连接起来,同时也会连接第一个和最后一个顶点,形成封闭边框

其他属性

userdata

用户自定义数据