Box2D篇:基础知识整合
初入Box2D
创建Box2D物理世界
1 | // Vector2为x与y方向加速度 |
明确换算单位
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 | //World = new World(new Vector2(0, -9.8f)); |
b2FixtureDef最为重要的一个特性是它定义了刚体的形状,保存在shape属性中,刚体的形状用来勾勒出物体的轮廓,实现精确的物理碰撞模拟。 没有定义形状的刚体只是一个“空刚体”,无法进行任何物理模拟。
b2FixtureDef对象的shape属性值是一个b2Shape对象,他同样是创建刚体必不可少的一个条件,不过他是b2FixtureDef的一个属性。
1 | var bd = new BodyDef |
刚体形状
b2Shape只是一个抽象的父类,没有实际创建形状的过程。 在实际开发中,都是用b2CircleShape,b2PolygonShape等b2Shape的子类对象。
圆形
只有一个半径属性,注意除以30px
1 | var bfd =new FixtureDef(); |
矩形
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
用户自定义数据