赵工的个人空间


专业技术部分转网页计算转业余爱好部分


  网站建设

首页 > 专业技术 > 网站建设 > Box2D物理引擎
Box2D物理引擎

Box2D是一个用于模拟2D刚体物体的开源物理引擎,可用来模拟2D刚体物体运动和碰撞,由Erin Catto早在2007年用C++语言开发。Box2D集成了大量的物理力学和运动学的计算,并将物理模拟过程封装到类对象中,将对物体的操作以简单友好的接口提供给开发者,只需要调用引擎中相应的对象或方法就可以模拟现实生活中的加速、减速、抛物线运动、万有引力、碰撞反弹等等各种真实的物理运动。

1. 世界b2World:

Box2D用b2World类表示世界,Box2D的所有其他物体都建立在b2World上,需要首先建立:
var world=new b2World(gravity,allowSleep);
其中,gravity为b2Vec2的二维矢量数据类型,表示b2World中的加速度参量,通常使用:
var gravity=new b2Vec2(0,9.8);
因为网页中的Box2D运行在Canvas中,Canvas的Y坐标是向下的,所以Y的重力加速度为9.8,而x方向没有加速度。这种设置符合地球上的场景,为了计算方便,常常使用10替代9.8。而太空中的游戏,可以使用b2Vec2(0,0),不考虑星体的引力。

2. 刚体b2Body:

实际中的固态物体,都有碰撞变形、弹性、摩擦等物理特性,这使用刚体b2Body类来表示。刚体有各种形状,还有速度等运动参数,还有摩擦系数、弹性系数等材质属性,分别使用b2BodyDef和b2FixtureDef两个类来描述。
1)b2BodyDef类:
描述刚体的运动和状态相关属性,如类型、线速度、角速度等。

分类

属性

数据类型

说明

 

状态

active

boolean

刚体是否可用

allowSleep

boolean

是否允许睡眠

awake

boolean

是否活动

bullet

boolean

是否模拟高速子弹

 

角度和
角速度

angle

number

刚体角度

angularDamping

number

刚体旋转时的角速度阻尼

angularVelocity

number

旋转角速度

fixedRotation

boolean

是否禁止刚体旋转

inertiaScale

number

刚体角度惯性系数

坐标和
速度

linearDamping

number

刚体线性速度阻尼

linearVelocity

b2Vec2

刚体线性速度

position

b2Vec2

刚体坐标

其他

type

uint

刚体类型

userData

*

刚体自定义数据

创建刚体时,可以通过设置b2BodyDef的属性来创建,但创建好后就不能直接读取和修改刚体的属性,而需要使用每种属性对应的获取和设置方法:

属性

获取

设置

active

IsActive()

SetActive(flag)

allowSleep

IsSleepingAllowed()

SetSleepingAllowed(flag)

awake

IsAwake()

SetAwake(flag)

bullet

IsBullet()

SetBullet(flag)

angle

GetAngle()

SetAngle(angle)

angularDamping

GetAngularDamping()

SetAngularDamping(number)

angularVelocity

GetAngularVelocity()

SetAngularVelocity(number)

fixedRotation

IsFixedRotation()

SetFixedRotation(fixed)

inertiaScale

GetInertia()

SetMassData(massData)

linearDamping

GetLinearDamping()

SetLinearDamping(number)

linearVelocity

GetLinearVelicity()

SetLinearVelicity(v)

position

GetPosition()

SetPosition(position)

type

GetType()

SetType(type)

userData

GetUserData()

SetUserData(data)

使用示例:
var bodyDef=new b2BodyDef;
bodyDef.type=b2Body.b2_dynamicBody;
bodyDef.position.x=p.x/scale;
bodyDef.position.y=p.y/scale;
2)b2FixtureDef类:
描述刚体的物质属性,如密度、摩擦系数、弹性系数等,还有物体的形状。

分类

属性

数据类型

说明

物质
特性

density

number

密度

friction

number

摩擦系数

restitution

number

弹性系数

碰撞

filter

b2FilterData

碰撞过滤

isSensor

boolean

是否为传感器

形状

shape

b2Shape

形状

自定义

userData

*

自定义数据

而获取及设置b2FixtureDef类的属性也需要使用响应的方法:

属性

获取

设置

density

GetDensity()

SetDensity(density)

friction

GetFriction()

SetFriction(friction)

restitution

GetRestitution()

SetRestitution(restitution)

filter

GetFilterData()

SetFilterData(filter)

isSensor

IsSensor()

SetSensorsensor()

shape

GetShape()

SetShape(shape)

var fixtureDef=new b2FixtureDef;
fixtureDef.density=1.0;
fixtureDef.friction=0.8;
fixtureDef.restitution=0.6;
fixtureDef.shape=new b2CircleShape(r/scale);
3)刚体形状shape:
各种形状的刚体,使用b2FixtureDef类的shape属性来表示。常用的形状有:圆形和多边形等。
fixtureDef2.shape=new b2PolygonShape;
fixtureDef2.shape.SetAsBox(20/scale,20/scale);
4)创建刚体:
定义了刚体的b2BodyDef和b2FixtureDef类参数后,可以创建刚体。
var body=world.CreateBody(bodyDef);
body.CreateFixture(fixtureDef);

3. 刚体操作:

1)b2World类的常用操作方法:

方法

说明

QueryAABB()

查找AABB碰撞刚体

QueryShape()

查找形状碰撞物体

RayCast()

射线查找

2)b2Body的常用操作方法:

方法

说明

CreateFixture()

添加b2Fixture对象

CreateFixture2()

添加形状

DestroyFixture()

删除b2Fixture对象

ApplyForce()

施加作用力

ApplyImpulse()

施加冲量

ApplyTorque()

施加旋转扭力

GetLocalCenter()

获取重心本地坐标

GetWorldCenter()

获取重心全局坐标

GetLocalPoint()

将全局坐标点转换成本地坐标

GetWorldPoint()

将本地坐标点转换为全局坐标

GetLocalVector()

将全局向量转换成本地向量

GetWorldVector()

将本地向量转换成全局向量

GetMass()

获取刚体质量

SetMassData()

设置刚体质量数据

Split()

分隔刚体

3)b2Fixture类的常用操作方法:

方法

说明

GetAABB()

获取形状最小包围盒

Box2D中没有单独设定刚体质量mass和旋转惯性interial的方法,而是将这两个属性集成到b2MassData类中,提供了SetMassData()方法来设置。b2MassData类的属性包含刚体质量mass、旋转惯量I和刚体重心坐标center,是在创建b2Fixture对象时计算得到的,创建时不需要赋值,创建后可以设置相关值而得到特殊效果。设置后,还可以使用ResetMassData()方法将自定义数值恢复成自动计算的初始值。

4. 碰撞处理:

Box2D是一种物理引擎,可以帮助实现精确地碰撞检测,并实现反弹、变向等碰撞现象的模拟。Box2D在每次碰撞后都会将碰撞的两个对象、碰撞的位置和角度等信息保存到b2Contact对象中。获取b2Contact有两种方法,一种是GetContactList()方法,一种是b2ContactListener类的碰撞事件处理函数。
1)GetContactList()方法:
b2World类和b2Body类都有GetContactList()方法,b2World类的方法返回整个Box2D中的b2Contact对象列表,而b2Body类中的方法返回的是当前刚体碰撞产生的b2Contact对象列表。
GetContactList()方法返回的只是列表起始位置的b2Contact对象,可以通过GetNext()来获取下一个b2Contact。
2)b2ContactListener类:
b2ContactListener类的事件处理函数有PreSolve()、BeginContact()、EndContact()、PostSolve(),分别对应碰撞的不同阶段,每个函数的参数中都包含一个b2Contact类型的参数,表示当前调用该处理方法的b2Contact对象。
3)b2Contact类:
b2Contact用于存放碰撞的相关信息,它没有公共属性,其功能是通过方法实现的:

方法

说明

GetFixtureA()

获取发生碰撞的第1个b2Fixture对象

GetFixtureB()

获取发生碰撞的第2个b2Fixture对象

GetManifold()

获取碰撞点信息

GetWorldManifold()

将碰撞点转换成全局坐标并保存到b2WorldManifold对象中

IsTouching()

碰撞双方的形状是否发生接触

IsEnabled()

是否开启当前的b2Contact对象

SetEnabled(flag)

设置当前b2Contact对象的状态

IsSensor()

此次碰撞是否为sensor

SetSensor(sensor)

设置此次碰撞为sensor

当碰撞发生时,Box2D将碰撞点保存在b2ManiFold对象中,需要通过b2Contact的GetManifold()方法先获取b2ManiFold对象,再通过其m_points属性来获取这些碰撞点坐标。不过,获取的坐标点是基于本地坐标系统的,实际中通常需要全局坐标。
3)b2ManiFold对象:
b2ManiFold对象保存了很多信息:

属性

说明

m_type

碰撞类型,包括e_circles、e_faceA、e_faceB三个常量

m_localPoint

碰撞点在主对象本地坐标系中的坐标位置

m_localPlaneNormal

碰撞主对象发生碰撞的边对应的垂直向量

m_pointCount

碰撞时两个对象的形状接触点的数量

m_point

碰撞点的Vector数组

m_localPoint:在m_type类型为e_faceA或e_faceB时,为主对象发生碰撞的边的中心点;在m_type类型为e_circles时,为主对象的圆心。
m_point:存在次对象的坐标系统下,当m_type类型为e_faceA或e_faceB时,如果此对象为圆形,则坐标点为次对象的圆心位置;如果次对象为多边形,则坐标点为次对象与主对象碰撞边接触的顶点位置。在m_type类型为e_circles时,坐标点为次对象的圆心。
因为Box2D的刚体限制为圆形或凸多边形,所以两个形状之间的接触点数量m_pointCount最多为2。
4)GetWorldManifold():
使用GetWorldManifold()方法,可以获取碰撞点的全局坐标b2WorldManifold对象。在调用这个方法前,需要先创建一个b2WorldManifold对象并作为参数。
b2WorldManifold对象有两个对象,一个是碰撞点的位置坐标m_point,一个是发生碰撞的边对应的法向向量normal。
当碰撞刚体分离时,b2WorldManifold对象的m_point数组不会自动清空,仍然保存上一次碰撞的碰撞点。
5)SetTangentSpeed()方法:
碰撞发生时,在碰撞的切线方向为碰撞刚体添加一个线性速度值,实现类似传送带的效果。

5. 关节b2Joint:

关节,是指通过一个或两个节点,将两个刚体关联起来,形成一种约束性运动的对象。Box2D使用Dynamics.joints的b2Joint类表示关节,关节会通过节点将两个刚体绑定在一起,使两个刚体的运动在约束条件下产生相互制约和影响。
创建b2Joint关节,需要先创建一个定义了其属性的b2JointDef对象,并设置属性,然后使用b2World的CreateJoint()方法创建b2Joint对象:
world.CreateJoint(jointDef);
不过,b2Joint和b2JointDef都是抽象类,不会用来直接创建关节对象,实际使用的是其子类b2RevoluteJoint、b2RevoluteJointDef和b2MouseJoint、b2MouseJointDef。
1)b2JointDef类的属性和方法:
b2JointDef类定义了关节的基本属性,其子类中也同样可以使用。

属性

说明

bodyA

关节连接的一个刚体

bodyB

关节连接的另一个刚体

collideConneted

表示关节连接的两个刚体之间是否进行碰撞模拟,默认false

userData

用户自定义数据,用来添加自定义属性

type

关节的类型,可选值是b2Joint表示子关节的12个常量

localAnchorA

关节中用于约束刚体bodyA运动的本地锚点A

localAnchorB

关节中用于约束刚体bodyB运动的本地锚点B

enableMotor

表示关节是否开启马达属性,默认false

motorSpeed

刚体在限制运动条件下可以达到的最大线速度或角速度

maxMotorTorque

为了时刚体达到一定的角速度或线速度,关节可以对刚体施加的最大作用力

frequencyHz

弹簧系统的震动频率,可以视为弹簧的弹性系数

dampingRatio

刚体在回归到节点过程中受到的阻尼,取值0~1

b2Joint类有两个方法,但并不常用。

方法

说明

GetReactionForce()

为保证按照约束条件运动,关节在节点位置对bodyB所施加的反作用力总和。可以根据获取作用力模拟断裂效果。

GetReactionTorque()

获取刚体在节点位置所受的扭力总和

关节常用属性的获取和设置方法:

属性

获取

设置

bodyA

GetBodyA()

/

bodyB

GetBodyB()

/

localAnchorA

GetAnchorA()

/

localAnchorB

GetAnchorB()

/

userData

GetUserData()

SetUserData(data)

type

GetType()

/

collideConnected

GetCollideConnected()

/

dampingRatio

GetDampingRatio()

SetDampingRatio(ratio)

frequencyHz

GetFrequency()

SetFrequency(number)

enableMotor

IsMotorEnabled()

EnableMotor(flag)

maxMotorForce

GetMaxMotorForce()

SetMaxMotorForce(force)

motorSpeed

GetMotorSpeed()

SetMotorSpeed(number)

2)关节的子类:
b2Joint类有12个子类:

关节子类

节点数

initialize方法

马达属性

弹簧属性

说明

b2DistanceJoint

2

v

 

v

距离关节

b2FrictionJoint

2

v

 

 

摩擦关节

b2GearJoint

2

 

 

 

齿轮关节

b2LineJoint

2

v

v

 

线段关节

b2MouseJoint

1

 

 

v

鼠标关节

b2PrismaticJoint

1

v

v

 

平移关节

b2PulleyJoint

4

v

 

 

滑轮关节

b2WeldJoint

1

v

 

v

粘贴关节

b2RevoluteJoint

1

v

v

 

旋转关节

b2WheelJoint

1

v

v

v

中轴关节

b2MotorJoint

2

v

 

 

马达关节

b2RopeJoint

2

v

 

 

绳索关节

3)b2MouseJoint鼠标关节:
鼠标关节不受关节点的约束,也不参与关节的约束性活动,通常用来实现鼠标对刚体的拖曳。常用的属性:

属性

说明

bodyA

继承来的属性,通常设置为空刚体

bodyB

要拖动的刚体

target

bodyB被拖动时受牵制的本地锚点,可绕这个点旋转或为移动目标

maxForce

鼠标关节在拖曳刚体bodyB时施加的最大作用力

空刚体是指不包括任何b2Fixture对象的刚体,也可以通过b2World的GetGroundBody()来快速获取一个空刚体。
b2MouseJoint属性的获取及设置方法有:

属性

获取

设置

bodyA

GetBodyA()

/

bodyB

GetBodyB()

/

localAnchorA

GetAnchorA()

/

localAnchorB

GetAnchorB()

/

target

GetTarget()

SetTarget(target)

maxForce

GetMaxForce()

SetMaxForce(number)

其中的anchorA和target是两个完全相同的点,都代表拖动刚体的目标位置,anchorB指的是创建鼠标节点时target相对于bodyB的本地锚点。
b2MouseJoint的拖曳是一个过程,通过对刚体施加一定的作用力,使其向目标位置移动的过程。因为b2MouseJoint包含弹簧属性frequencyHz和dampingRatio,所以刚体会有一个回弹效果,这个回弹受maxForce影响,值越大回弹持续时间越短,效果越不明显。
4)b2PrismaticJoint平移关节:
b2PrismaticJoint包括1个节点anchor和一个坐标轴axis。关节所绑定的刚体受坐标轴的限制,只能在坐标轴方向来回移动,角度无法旋转。属性有:

属性

说明

bodyA

关节连接的第1个刚体,通常设为空刚体来固定坐标轴的方向

bodyB

关节连接的第2个刚体,通常是在坐标轴上移动的刚体

anchor

平移关节的控制节点,是b2Vec2类型的全局坐标

axis

全局坐标的b2Vec2向量,表示关节坐标轴方向

enableLimit

是否对刚体的移动范围加以约束,默认false

lowerTranslation

约束条件下,刚体移动范围的下限,是axis上距离节点的偏移量

upperTranslation

约束条件下,刚体移动范围的上限,是axis上距离节点的偏移量

referenceAngle

axis和bodyB之间的角度差

localAnchorA

节点anchor相对于刚体bodyA的本地锚点

localAnchorB

节点anchor相对于刚体bodyB的本地锚点,表示bodyB在坐标轴axis上的位置

localAxisA

坐标轴axis相对于bodyA的本地向量

enableMotor

是否开启马达模式,默认false

maxMotorForce

可以施加的最大作用力

motorSpeed

bodyB在axis坐标轴上移动可以达到的最大速度

axis只是表示一个方向,长度会影响刚体在坐标轴上位移的效果,如果值过大会造成移动时的抖动或偏移。initialize()方法会将axis向量转换成bodyA本地坐标下的向量并保存在localAxisA属性中,因此bodyA的角度变化时也会影响axis的角度。
b2PrismaticJoint平移节点的常用方法:

属性

获取

设置

localAnchorA

GetAnchorA()/GetLocalAnchorA()

/

localAnchorB

GetAnchorB()/GetLocalAnchorB()

/

localAxisA

GetLocalAxisA()

/

enableLimit

IsLimitEnabled()

EnableLimit(flag)

lowerTranslation

GetLowerLimit()

SetLimits(lower,upper)

upperTranslation

GetUpperLimit()

referenceAngle

GetReferenceAngle()

/

enableMotor

IsMotorEnabled()

EnableMotor(flag)

motorSpeed

GetMotorSpeed()

SetMotorSpeed()

maxMotorForce

GetMaxMotorForce()

SetMaxMotorForce()

除此之外,还有其他几个方法:

方法

说明

GetJointSpeed()

节点当前的移动速度

GetJointTranslation()

节点相对于anchor的偏移距离

GetMotorForce()

关节当前对刚体bodyB施加的作用力大小

5)b2LineJoint线段关节:
线段关节是一种特殊的平移关节,其中bodyB可以绕localAnchorB节点旋转。

6)b2RevoluteJoint旋转关节:
旋转节点只有一个节点anchor,这个节点将两个刚体绑定在一起,使得两个刚体只能围绕该节点做旋转运动。b2RevoluteJoint关节也包含马达属性,开启后被绑定的刚体就有了自主旋转的能力,可以模拟小车车轮运动。b2RevoluteJoint的常用属性有:

属性

说明

enableLimit

是否对刚体的旋转角度加以约束,默认false

lowerAngle

约束条件下,刚体旋转角度的下限

upperAngle

约束条件下,刚体旋转角度的上限

referenceAngle

受限旋转角度范围

enableMotor

是否开启马达模式,默认false

maxMotorForce

可以施加的最大作用力

motorSpeed

bodyB在axis坐标轴上移动可以达到的最大速度

b2RevoluteJoint旋转关节的常用方法:

属性

获取

设置

localAnchorA

GetAnchorA()/GetLocalAnchorA()

/

localAnchorB

GetAnchorB()/GetLocalAnchorB()

/

enableLimit

IsLimitEnabled()

EnableLimit(flag)

lowerAngle

GetLowerAngle()

SetLimits(lower,upper)

upperAngle

GetUpperAngle()

referenceAngle

GetReferenceAngle()

/

enableMotor

IsMotorEnabled()

EnableMotor(flag)

motorSpeed

GetMotorSpeed()

SetMotorSpeed()

maxMotorForce

GetMaxMotorForce()

SetMaxMotorForce()

除此之外,还有其他几个方法:

方法

说明

GetJointSpeed()

获取关节节点旋转的角速度

GetJointAngle()

获取关节旋转的角度

GetMotorTorque()

获取关节当前的扭力大小

对刚体的旋转角度加以限制后,刚体只能在指定的角度范围内摆动,看起来像跷跷板
7)b2DistanceJoint距离关节:
距离关节包含2个节点,分别对应关节绑定的两个刚体,并对刚体行为进行约束,使得刚体只能围绕各自对应的节点旋转。同时,这两个节点之间的间距保持不变,实现连杆运动。
b2DistanceJoint关节的常用属性有:

属性

说明

length

表示两个节点之间的间距

frequencyHz

弹簧系统的震动频率,可以视为弹簧的弹性系数

dampingRatio

刚体在回归到节点过程中受到的阻尼,取值0~1

可以通过设置弹性属性实现节点对刚体的牵引,以及刚体偏离节点后恢复过程中的回弹效果。
b2DistanceJoint关节常用的方法:

属性

获取

设置

localAnchorA

GetAnchorA()

/

localAnchorB

GetAnchorB()

/

frequencyHz

GetFrequency()

SetFrequency(hz)

dampingRatio

GetDampingRatio()

SetDampingRatio(ratio)

length

GetLength()

SetLength(length)

8)b2WeldJoint粘贴关节:
这个节点像强力胶,将两个刚体粘贴在一起,形成一个刚体。实际上,b2WeldJoint关节中的两个刚体依然是相互独立的刚体,不过受到关节的限制,两个刚体的相对位置和角度都保持不变,看上去像一个整体。当使用b2World的DestroyJoint()方法将b2WeldJoint关节删除后,两个刚体会分离开来,恢复成两个独立的刚体。b2WeldJoint关节只需要一个节点坐标,可以包含弹出属性和referenceAngle属性:

属性

说明

anchor

节点坐标

frequencyHz

弹簧系统的震动频率,可以视为弹簧的弹性系数

dampingRatio

刚体在回归到节点过程中受到的阻尼,取值0~1

referenceAngle

用来调整bodyA和bodyB之间的角度差

b2WeldJoint粘贴关节的常用方法:

属性

获取

设置

localAnchorA

GetAnchorA()/GetLocalAnchorA()

/

localAnchorB

GetAnchorB()/GetLocalAnchorB()

/

frequencyHz

GetFrequency()

SetFrequency(hz)

dampingRatio

GetDampingRatio()

SetDampingRatio(ratio)

referenceAngle

GetReferenceAngle()

/

9)b2PulleyJoint滑轮关节:
滑轮关节包含4个节点,初始化时需要的参数有:

属性

说明

bodyA

关节连接的一个刚体

bodyB

关节连接的另一个刚体

groundAnchorA

一个b2Vec2类型的全局坐标点,是滑轮上与节点anchorA相连接的节点

groundAnchorB

一个b2Vec2类型的全局坐标点,是滑轮上与节点anchorB相连接的节点

anchorA

连接刚体bodyA的全局坐标节点,bodyA可以绕该节点旋转。对应刚体本地锚点localAnchorA,通常设置为bodyA的坐标位置

anchorB

连接刚体bodyB的全局坐标节点,bodyB可以绕该节点旋转。对应刚体本地锚点localAnchorB,通常设置为bodyB的坐标位置

radio

当bodyA移动时,受关节的牵动,bodyB也会相应地移动。假设bodyA移动的距离为offsetA,bodyB移动的距离是offetB,二者的比例就是ratio,ratio=offsetA/offsetB

滑轮关节还有其他属性:

属性

说明

lengthA

创建创建时anchorA到groundAnchorA的距离

lengthB

创建创建时anchorB到groundAnchorB的距离

maxLengthA

节点anchorA到groundAnchorA可以达到的最大距离

maxLengthB

节点anchorB到groundAnchorB可以达到的最大距离

上述4个属性,在创建滑轮关节时自动计算得到。b2PulleyJoint滑轮关节常用的方法有:

属性

获取

设置

groundAnchorA

GetGroundAnchorA()

/

groundAnchorB

GetGroundAnchorB()

/

localAnchorA

GetAnchorA()

/

localAnchorB

GetAnchorB()

/

lengthA

GetLengthA()

/

lengthB

GetLengthB()

/

ratio

GetRatio()

/

b2PulleyJoint滑轮关节还有其他一些方法:

方法

说明

GetCurrentLengthA()

获取当前位置节点anchorA与groundAnchorA之间的距离

GetCurrentLengthB()

获取当前位置节点anchorB与groundAnchorB之间的距离

10)b2FrictionJoint摩擦关节:
摩擦关节使两个刚体产生相互制动作用。当摩擦关节中任意一个刚体的线速度或角速度发生变化时,摩擦关节会对另一个刚体施加一定的作用力或扭力,促使两个刚体的线速度和角速度保持一致,这个过程持续的时长取决于作用力或扭力的大小。当某个刚体为静态刚体、可动刚体或者空刚体时,摩擦关节的作用力将表现为单纯对另一个刚体的摩擦力。
b2FrictionJoint摩擦关节包括的常用属性:

属性

说明

localAnchorA

关节节点对应bodyA的本地坐标点,bodyA可绕此节点旋转

localAnchorB

关节节点对应bodyB的本地坐标点,bodyB可绕此节点旋转

maxForce

为使bodyA和bodyB的线速度保持同步,关节对刚体施加的最大作用力,作用力施加在localAnchorA或localAnchorB位置

maxTorque

为使bodyA和bodyB的角速度保持同步,关节对刚体施加的最大扭力,扭力施加在localAnchorA或localAnchorB位置

11)b2GearJoint齿轮关节:
齿轮旋转时,产生的动量有两种输出方式,一种是齿轮本身的角速度,另一种是齿轮表面的线速度。b2GearJoint齿轮关节用来模拟两个齿轮间的约束关系,可以是角速度和线速度之间的转换,也可以是角速度与角速度之间的转换,也可以是线速度与线速度之间的转换。b2GearJoint关节绑定的是两个关节,并在这两个关节对刚体的约束基础上,将两个运动关联起来,实现角速度和线速度之间的相互转换。
b2GearJoint关节所绑定的关节只能是b2RevoluteJoint或b2PrismaticJoint,分别对应齿轮的角速度和表面线速度。齿轮关节包含的属性有:

属性

说明

joint1

要绑定的第1个关节,关节类型是b2RevoluteJoint或b2PrismaticJoint

joint2

要绑定的第2个关节,关节类型是b2RevoluteJoint或b2PrismaticJoint

ratio

两个齿轮角速度比例,默认1。如果两个关节类型相同,那么ratio表示两个关节的旋转角速度比例,或者可位移比例。如果两个关节不同,那么joint1的旋转角度或可移动范围不变,joint2的可移动范围或旋转角度相应减少的倍数为ratio。

两个关节,如果设置为b2PrismaticJoint类型,那么该关节必须设置enableLimit属性为true,并设置移动范围lowerTranslation和upperTranslation属性,否则齿轮关节无法正常运行。
在创建b2GearJoint齿轮关节时,使用的两个子关节的bodyA属性会设置为空刚体groundBody,使得bodyB刚体固定在一个位置或一个坐标轴上,让齿轮关节看起来依然是对两个刚体的操作。b2GearJoint关节常用的方法为:

属性

获取

设置

joint1

GetJoint1()

/

joint2

GetJoint2()

/

ratio

GetRatio()

SetRatio()

齿轮节点并不需要设置节点位置,但呈现出的效果依然是受节点约束的,这里的节点是属于子关节的,可以通过b2GearJoint中使用GetAnchorA()或GetAnchorB()方法,来直接获取joint1或joint2中限制bodyB刚体的节点坐标。
12)b2WheelJoint中轴关节:
b2WheelJoint中轴关节只包含一个节点,也可以围绕节点旋转,但包含了弹性属性,使得刚体在节点位置发生弹性偏移,常用的属性有:

属性

说明

localAnchorA

节点anchor相对于刚体bodyA的本地锚点

localAnchorB

节点anchor相对于刚体bodyB的本地锚点

anchor

b2Vec2类型的全局坐标节点,与bodyA的相对位置保持不变

axis

刚体bodyB在偏移锚点时可以移动的方向,是全局向量

localAxisA

限制刚体在偏离节点时只能在localAxisA方向移动

frequencyHz

弹簧系统的震动频率,可以视为弹簧的弹性系数

dampingRatio

刚体在回归到节点过程中受到的阻尼,取值0~1

enableMotor

是否开启马达模式,默认false

maxMotorForce

可以施加的最大作用力

motorSpeed

bodyB在axis坐标轴上移动可以达到的最大速度

b2WheelJoint关节常用的方法有:

属性

获取

设置

localAnchorA

GetAnchorA()/GetLocalAnchorA()

/

localAnchorB

GetAnchorB()/GetLocalAnchorB()

/

localAxisA

GetLocalAxisA()

/

frequencyHz

GetFrequency()

SetFrequency(hz)

dampingRatio

GetDampingRatio()

SetDampingRatio(ratio)

enableMotor

IsMotorEnabled()

EnableMotor(flag)

motorSpeed

GetMotorSpeed()

SetMotorSpeed()

maxMotorForce

GetMaxMotorForce()

SetMaxMotorForce()

中轴关节还有其他一些方法:

方法

说明

GetJointTranslation()

获取当前刚体bodyB偏离节点anchor的距离

GetJointSpeed()

获取当前刚体bodyB相对于bodyA的角速度,也就是两个刚体的角速度差

GetMotorForce()

获取马达当前的作用力大小

如果创建摩托车车轮的b2WheelJoint关节,节点坐标要设置在圆形刚体的中心位置,因为车轮的减震是上下方向,所以axis的角度也是垂直方向。
13)b2RopeJoint绳索关节:
绳索关节用来模拟绳索,它有两个节点,对应绳索的两端。
b2RopeJoint绳索关节的常用属性有:

属性

说明

bodyA

关节连接的一个刚体

bodyB

关节连接的另一个刚体

anchorA

连接刚体bodyA的全局坐标节点

anchorB

连接刚体bodyB的全局坐标节点

maxLength

anchorA和anchorB之间的最大距离

绳索关节的常用方法有:

属性

获取

设置

localAnchorA

GetAnchorA()/GetLocalAnchorA()

/

localAnchorB

GetAnchorB()/GetLocalAnchorB()

/

maxLength

GetMaxLengthy()

SetMaxLengthy(length)

另外,还可以使用GetLimit()函数查看绳索关节的当前状态,返回的状态值可以是两个常量e_inactiveLimit和e_atUpperLimit,其中e_inactiveLimit表示节点anchorB当前位置处在未受限制状态,或者说节点anchorA与anchorB的距离小于maxLength;e_atUpperLimit表示节点anchorB的当前位置处在限制范围的最大值,即与anchorA点距离等于maxLength。
使用时,可以根据绳索关节当前的状态,在其达到最大长度maxLength时删除,模拟绳索被割断的效果。
14)b2MotorJoint马达关节:
马达关节用来限制两个刚体,使其相对位置和角度保持不变。bodyB的坐标处在偏移bodyA距离为linearOffet的位置上,角度上bodyB与bodyA的偏移量为angularOffset,当任意一个刚体的位置或角度发生变化,导致bodyB偏离规则中的目标位置和角度时,b2MotorJoint马达关节会以大小分别为maxForce的作用力和maxTorque扭力驱动bodyB向目标位置和角度移动。当其中一个刚体为静态刚体或可动刚体时,呈现出的效果是另一个刚体向目标位置缓动。b2MotorJoint常用的属性有:

属性

说明

bodyA

关节连接的一个刚体

bodyB

关节连接的另一个刚体

anchorA

连接刚体bodyA的全局坐标节点

anchorB

连接刚体bodyB的全局坐标节点

linearOffset

基于bodyA坐标位置的偏移量,也是bosyB的目标位置

angularOffset

基于bodyA的角度偏移量,也是bodyB的目标角度

maxForce

当bodyB偏离目标位置时,为使其恢复到目标位置,马达关节所施加的最大作用力

maxTorque

当bodyB角度与目标角度不同时,为使其达到目标角度,马达关节施加的最大扭力

correctionFactor

bodyB向目标位置移动时的缓动因子,取值0~1,值越大速度越快

马达关节常用的方法为:

属性

获取

设置

anchorA

GetAnchorA()

/

anchorB

GetAnchorB()

/

linearOffset

GetLinearOffset()

SetLinearOffset(linearOffset)

angularOffset

GetAngularOffset()

SetAngularOffset(angularOffset)

maxForce

GetMaxForce()

SetMaxForce(force)

maxTorque

GetMaxTorque()

SetMaxTorque(force)

correctionFactor

GetCorrectionFactor()

SetCorrectionFactor(factor)

马达关节没有定义关节节点,所以通过GetAnchorA()和GetAnchorB()获取到的是刚体bodyA和bodyB的坐标位置。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659