赵工的个人空间


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


 手持终端

首页 > 专业技术 > 手持终端 > JBox2D物理引擎
JBox2D物理引擎

JBox2D是开源的2D物理引擎,能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动进行2D刚体物理运动的模拟。JBox2D中有很多常用的类。

1. 二维向量Vec2类:
Vec2类表示二维向量,它是由两个float类型的数组成,支持+=、-=和*=操作符。Vec2在JBox2D中使用频率非常高,通常用于表示物体的位置、速度等。Vec2的属性有:

属性

含义

float x

表示向量的x轴分量或坐标系中的x坐标值

float y

表示向量的y轴分量或坐标系中的y坐标值

Vec2的构造器为:

构造器

含义

Vec2()

创建Vec2类对象

Vec2(float x, float y)

创建Vec2类对象,x/y表示向量的x/y轴分量

Vec2的方法有:

方法

含义

void setZero()

将向量设置为0向量

Vec2 set(float x, float y)

设置两个分量值

float length()

计算向量的长度

float lengthSquared()

计算向量长度的平方

float normalize()

将此向量转化为单位向量

Vec2 skew()

计算向量的垂直向量,x分量为原向量的-y,y分量为原向量的x值

boolean isValid()

检测向量的数据是否合法

2. 包围盒AABB类:
该类表示轴对称的包围盒,也就是边界盒子。轴对齐是指左、右边界与y轴平行,同时上、下侧边界与x轴平行,其主要功能为加速碰撞检测,所以包围盒应大于等于物体实际所占的区域。包围盒的属性有:

属性

含义

Vec2 lowerBound

表示包围盒的左下角顶点

Vec2 upperBound

表示包围盒的右上角顶点

包围盒的常用方法有:

方法

含义

Vec2 getCenter()

计算包围盒的中心点坐标

Vec2 getExtents()

计算出从包围盒中心点指向包围盒右上角的向量

float getPerimeter()

计算包围盒的周长

boolean isValid()

判断包围盒的数据是否合法

3. 刚体描述BodyDef类:
该类主要用于存储一些刚体的属性信息,在创建刚体时是通过该类的实例给出刚体的相关属性信息,主要包括刚体位置坐标、线速度值、角速度值、线性阻尼、角度阻尼等。

属性

含义

BodyType type

表示刚体的类型,默认值是静态staticBody

Vec2 position

表示刚体位置的坐标轴,默认值是Vec2(0.0f, 0.0f)

float angle

表示姿态,弧度值,默认值是0.0f

Vec2 linearVelocity

表示线速度值,默认值是Vec2(0.0f, 0.0f)

float angularVelocity

表示角速度值,默认值是0.0f

float linearDamping

表示线性阻尼值,默认值是0.0f

float angularDamping

表示角度阻尼值,默认值是0.0f

boolean allowSleep

表示是否允许休眠,默认值是true

boolean awake

表示是否被唤醒,默认值是true

boolean fixedRotation

表示是否锁定旋转,默认值是false

boolean bullet

表示刚体是否充当类似子弹等运行速度很快的物体,默认false

boolean active

表示是否被激活,默认值是true

float gravityScale

表示加在刚体上的重力值系数,默认值是1.0f

Object userData

用来存储用户数据,默认值NULL

BodyDef类的构造器为:

BodyDef()

用于创建刚体描述对象

BodyDef的刚体类型有3种,分别是静态物体staticBody、动态物体dynamicBody和不受重力影响匀速直线运动的物体kinematicBody。

4. 世界World类:
该类表示物理世界,物理世界就是物体、形状和约束相互作用的集合,可以在物理世界中创建或删除所需的刚体或关节以实现所需的物理模拟。要创建物理世界,必须给出其重力向量。
物理世界的构造器为:

World(Vec2 gravity)

创建World对象,gravity表示要设置的重力向量

World类的常用方法有:

方法

含义

Body createBody(BodyDef def)

创建刚体,def表示对应刚体描述类的引用

void destroyBody(Body body)

删除刚体,body表示要删除刚体对象的引用

Joint createJoint(JointDef def)

创建一个关节,def表示对应关节描述类的引用

void destroyJoint(Joint joint)

删除关节,joint表示要删除关节对象的引用

Body getBodyList()

获取刚体的列表,返回值为刚体列表第一个元素的引用

Joint getJointList()

获取关节的列表,返回值为关节列表第一个元素的引用

Contact getContactList()

获取碰撞的列表,返回值为碰撞列表第一个元素的引用

int getProxyCount()

获取代理的数量,返回值为获取的代理数量值

int getBodyCount()

获取刚体的数量,返回值为获取的刚体数量值

int getJointCount()

获取关节的数量,返回值为获取的关节数量值

int getContactCount()

获取碰撞的数量,返回值为获取的碰撞数量值

int getTreeHeight()

获取嵌入树的高度,返回值为获取的嵌入树的高度值

int getTreeBalance()

获取嵌入树的平衡值,返回值为获取的嵌入树的平衡值

int getTreeQuality()

获取嵌入树的质量,返回值为获取的嵌入树的质量值

void setGravity(Vec2 gravity)

设置物理世界的重力向量

Vec2 getGravity()

获取物理世界的重力向量

Profile getProfile()

获取当前配置

void step ( float timeStep, int velocityIterations, int position Iterations)

进行一轮迭代模拟,timeStep为模拟的时间步进,velocity Iterations为速度迭代次数,positionIterations为位置迭代次数

World类的其他方法还有:

方法

含义

void setDestructionListener ( Destruction Listener listener)

注册摧毁监听器

void setContactFilter(ContactFilter filter)

注册碰撞过滤器

void setContactListener(ContactListener listener)

注册碰撞监听器

void clearForces()

清除作用力

void setAllowSleeping(boolean flag)

开启/禁用物体休眠,flag为ture表示开启,否则表示禁用

boolean getAllowSleeping()

查看是否开启物体休眠,若开启了则返回true

void setWarmStarting(boolean flag)

开启/禁用用于测试的热启动,flag为ture表示开启

boolean getWarmStarting()

查看是否开启了用于测试的热启动,若开启了则返回true

void setContinuousPhysics(boolean flag)

开启/禁用连续物理模拟,flag为ture表示开启

boolean getContinuousPhysics()

查看是否开启了连续物理模拟,若开启了则返回true

void setSubStepping(boolean flag)

开启/禁用连续单步物理模拟,flag为ture表示开启

boolean getSubStepping()

查看是否开启了连续单步物理模拟,若开启了则返回true

void setAutoClearForces(boolean flag)

设置每一个时间步后是否自动清除力,flag为ture表示开启

boolean getAutoClearForces()

获取在每个时间步之后是否自动清除力,若开启了返回true

boolean isLocked()

检测世界是否被锁定,若被锁定了返回true

void shiftOrigin(Vec2 newOrigin)

改变世界的原点坐标,newOrigin为新的坐标原点

ContactManager getContactManager()

获取碰撞管理器,返回值为获得的碰撞管理器对象

void queryAABB(QueryCallback callback, AABB aabb)

查询世界中所有可能与指定AABB包围盒重叠的刚体,callback表示查询回调对象的引用,aabb为指定的包围盒

void rayCast(RayCastCallback callback, Vec2 point1, Vec2 point2)

查询世界中所有可能被指定射线射中的刚体,callback表示查询回调对象的引用,后面参数为射线的起点和终点坐标

5. 形状Shape类:
JBox2D物理引擎中,刚体都需要有指定的形状,形状包括圆形CircleShape、多边形PolygonShape、线段形EdgeShape、链形ChainShape。这四种形状对应的实现类都继承自Shape。
Shape类的常用属性有:

属性

含义

ShapeType m_type

表示形状类型

float m_radius

表示形状的半径

Shape类的常用方法有:

方法

含义

Shape clone()

使用分配器来克隆形状,返回值为克隆的形状对象的引用

ShapeType getType()

获取当前形状的类型

int getChildCount()

获取子顶点元素的数量

boolean testPoint(final Transform xf, final Vec2 p)

判断指定点是否在形状包含的区域范围内,xf为给定的变换,p为指定的点

boolean rayCast(RayCastOutput output, RayCastInput input, Transform transform, int childIndex)

判断形状是否与指定的射线相交,若是则返回true。output为计算结果类对象的引用,类中包含了交点对应的射线方程参数值以及射线与形状相交的法线,input为射线的信息类对象,包含射线起点终点及允许相交时射线方程的最大参数值,transform为给定的变换,childIndex为子的索引值

void computeAABB (AABB aabb, Transform xf, int childIndex)

计算形状的AABB包围盒,xf为给定的变换,childIndex为子索引值

void computeMass (MassData massData, float density)

计算形状的质量,MassData为计算结果对象的引用,density为给定的密度值

6. 圆形CircleShape类:
圆形的实现类是CircleShape,其对象主要用于存储描述圆形形状所需的一些信息,同时还提供一些实用方法。CircleShape的常用属性有:

属性

含义

Vec2 m_p

表示位置坐标

CircleShape的构造器为:

构造器

含义

CircleShape()

创建圆形类的对象

CircleShape的常用方法有:

方法

含义

int getVertexCount()

获取顶点的数量,对于圆形返回值总为1

Vec2 getVretex(int index)

根据指定索引值获取对应顶点的坐标

int getSupport(Vec2 d)

根据给出的方向向量获取指定方向上的支撑点索引

Vec2 getSupportVertex( Vec2 d)

根据给出的方向向量获取指定方向上的支撑点

7. 多边形PolygonShape类:
多边形主要用于存储描述多边形形状所需的一些信息。其构造器为:

构造器

含义

PolygonShape()

创建多边形类的对象

PolygonShape常用的属性有:

属性

含义

Vec2 m_centroid

表示多边形的质心坐标

Vec2 m_vertices[]

表示构成多边形的顶点数组

Vec2 m_normals[]

表示多边形的法线数组

int m_count

表示多边形的顶点总数

PolygonShape常用的方法有:

方法

含义

void set(Vec2 points, int3 count)

根据指定顶点序列和顶点数量创建多边形对象,points表示顶点序列中第1个顶点坐标的引用,count表示顶点的数量

void setAsBox(float hx, float hy)

将多边形设置为矩形,hx表示矩形半宽,hy表示矩形的半高

void setAsBox(float hx, float hy, Vec2 center, float angle)

将多边形设置为指定位置和姿态的矩形,hx表示矩形半宽,hy表示矩形的半高,center表示矩形中心点坐标,angle表示旋转角度

int getVertexCount()

获取顶点的数量,返回值为获取的顶点数量

Vec2 getVretex(int index)

获取给定索引对应顶点的坐标,index为给定的顶点索引值

boolean validate()

检测是否为凸多边形,若是则返回true

多边形的顶点数在3~maxPolygonVertices范围内,maxPolygonVertices是JBox2D预定义的一个静态常量,值为8。如果这个值不够,可以通过org.jbox2d.commin包下的Settings类的静态常量maxPolygonVertices自行修改。此值在满足需要情况下越小越好,否则增加计算量。
JBox2D支持的多边形必须是凸多边形,对凹多边形不能正确进行碰撞计算。凸多边形是指任意两个顶点的连线不会划过多边形外部区域的多边形。初始化多边形时给出的多边形顶点坐标需要按照逆时针顺序进行卷绕,否则也会影响计算的正确性。

8. 线段形状EdgeShape类:
线段形状的实现类是EdgeShape,主要用于存储描述线段形状所需的一些信息。构造器为:

构造器

含义

EdgeShape()

创建线段类的对象

EdgeShape常用的属性有:

属性

含义

Vec2 m_vertex0

表示可选的相邻顶点1,用于平滑碰撞检测

Vec2 m_vertex1

表示线段的一个顶点

Vec2 m_vertex2

表示线段的另一个顶点

Vec2 m_vertex3

表示可选的相邻顶点2,用于平滑碰撞检测

boolean m_hasVertex0

表示是否有相邻顶点1

boolean m_hasVertex3

表示是否有相邻顶点3

EdgeShape常用的方法有:

方法

含义

void set(Vec2 v1,Vec2 v2)

设置线段的两个顶点,v1、v2分别表示两个端点的坐标

9. 链形ChainShape类:
链形是一个自由形式的线段序列,就像链条这一类由多段首尾相连构成的形状。JBox2D的链形可以首尾相连构成闭环,支持双面碰撞,可用来开发闭环内部和外部都有碰撞的应用。
链形的实现类是ChainShape,主要用于存储描述链形所需的一些信息。构造器为:

构造器

含义

ChainShape()

创建链形类的对象

ChainShape常用的属性有:

属性

含义

Vec2 m_vertices

表示链形顶点序列中第一个顶点

int m_count

表示顶点的数量

Vec2 m_prevVertex

表示第一个顶点的前导顶点

Vec2 m_nextVertex

表示最后一个顶点的后继顶点

boolean m_hasPrevVertex

表示是否存在第一个顶点的前导顶点

boolean m_hasNextVertex

表示是否存在最后一个顶点的后继顶点

ChainShape常用的方法有:

方法

含义

void createLoop (Vec2 vectices, int count)

将链条对象创建为环,vertices表示链形顶点序列中第1个顶点的坐标,count表示顶点的数量

void createChain (Vec2 vectices, int count)

将链条对象创建为非闭环链,vertices表示链形顶点序列中第1个顶点的坐标,count表示顶点的数量

void setPrevVertex (Vec2 prevVertex)

设置第1个顶点的前导顶点,prevVertex表示前导顶点坐标

void setNextVertex (Vec2 nextVertex)

设置最后1个顶点的后继顶点,prevVertex表示后继顶点坐标

void getChildEdge (EdgeShape edge, int index)

根据给定的索引获取链中对应的线段,edge表示线段形状对象的引用以存储获取的结果,index表示给定的索引值

初始给出的顶点数据不能形成自身交叉的情况,也即给出的顶点数据构成的线段相互之间不可以有交叉。

10. 刚体Body类:
刚体在JBox2D中是一个最重要的概念,由Body类实现。使用JBox2D进行物理模拟时主要是通过刚体进行的。刚体的常用方法有:

方法

含义

Fixture createFixture(FixtureDef def)

创建刚体物理信息对象,def表示刚体物理描述类对象的引用

Fixture createFixture(Shape shape, float density)

创建刚体物理信息对象,shape表示形状类对象引用,density表示密度值

void destroyFixture (Fixture fixture)

销毁刚体物理信息对象

Vec2 getPosition ()

获取位置坐标

float getAngle ()

获取刚体姿态角弧度值

void setLinearVelocity (Vec2 v)

设置线速度

Vec2 getLinearVelocity ()

获取线速度

void setAngularVelocity (float omega)

设置角速度

float getAngularVelocity ()

获取角速度

float getMass()

获取刚体质量

float setMassData(MassData data)

设置刚体质量数据

float getMassData(MassData data)

获取刚体质量数据

void resetMassData()

重置刚体质量数据

float getInertia ()

获取刚体的转动惯量

float getGravityScale ()

获取重力比例值

void setGravityScale (float scale)

设置重力比例

void setType (BotyType type)

设置刚体类型

BodyType getType ()

获取刚体类型

Object getUserData ()

获取用户数据

void setUserData(Object data)

设置用户数据

Vec2 getWorldCenter ()

获取刚体质心在世界坐标系中的位置

Vec2 getLocalCenter ()

获取刚体质心在局部坐标系中的位置

刚体还有一些设置或获取刚体属性及各种状态的方法:

方法

含义

void setTransform(Vec2 position, float angle)

设置刚体位置和姿态角,position表示要设置的位置坐标,angle表示要设置的姿态角弧度

Transform getTransform()

获取刚体的变换信息

float getLinearDamping ()

获取线性阻尼值

void setLinearDamping (float linear Damping)

设置线性阻尼值

float getAngularDamping ()

获取角度阻尼值

void setAngularDamping (float angularDamping)

设置角度阻尼值

void setBullet (boolean flag)

设置刚体是否充当类似子弹等运行速度很快的物体

boolean isBullet()

获取刚体是否充当类似子弹等运行速度很快的物体

void setSleepingAllowed (boolean flag)

设置是否允许休眠

boolean isSleepingAllowed ()

获取是否允许休眠

void setAwake(boolean flag)

设置是否唤醒

boolean isAwake()

获取唤醒状态

void setActive(boolean flag)

设置是否激活

boolean isActive()

查看是否激活

void setFixedRotation(boolean flag)

设置是否锁定旋转

boolean isFixedRotation()

查看是否锁定旋转

void applyTorque (float torque, boolean wake)

给刚体施加力矩

void applyLinearImpulse (Vec2 impulse, Vec2 point, boolean wake)

给刚体施加冲量

void applyAngularImpulse (float impulse, boolean wake)

给刚体施加角冲量

Fixture getFixtureList ()

获取刚体物理信息对象列表

JointEdge getJointList ()

获取关节列表

ContactEdge getContactList ()

获取碰撞列表

Body getNext ()

获取世界刚体列表中的下一个刚体对象

void applyForce (Vec2 force, Vec2 point, boolean wake)

给刚体施加力

void applyForceToCenter (Vec2 force,  boolean wake)

给刚体的质心施加力

刚体还有关于坐标变换的一些方法:

方法

含义

Vec2 getWorldPoint(Vec2 localPoint)

获取提供的局部坐标点在世界坐标系中的位置

Vec2 getWorldVector(Vec2 localPoint)

获取提供的局部向量在世界坐标系中的对应向量

Vec2 getLocalPoint(Vec2 worldPoint)

获取提供的世界坐标系中的坐标点在局部坐标系中对应的坐标点

Vec2 getLocalVector(Vec2 worldPoint)

获取提供的世界坐标系中的向量在局部坐标系中对应的向量

Vec2 getLinearVelocityFromWorldPoint(const Vec2 worldPoint)

获取关联到此刚体的指定点在世界坐标系中的线速度

Vec2 getLinearVelocityFromLocalPoint(const Vec2 localPoint)

获取关联到此刚体的指定点在世界坐标系中的线速度

刚体的创建需要用到World类对象的CreateBody方法,而没有构造器。

11. 刚体物理描述FixtureDef类:
刚体物理描述的实现是由FixtureDef类完成的,主要是包含一些记录不同物理属性的成员,如摩擦系数、弹性系数以及密度。FixtureDef类的构造器为:

构造器

含义

FixtureDef()

创建刚体物理描述类的对象

FixtureDef常用的属性有:

属性

含义

Shape shape

表示刚体的形状,默认null

void userData

表示用户的数据,默认为null

float friction

表示刚体的摩擦系数值,默认0.2f

float restitution

表示刚体的弹性系数,默认0.0f

float density

表示刚体的密度值,默认0.0f

boolean isSensor

表示刚体碰撞后是否由JBox2D进行物理模拟,还是采用自定义物理模拟,默认为false,由JBox2D进行物理模拟。为true时仅由JBox2D进行碰撞检测,不模拟碰撞后的物理运动,而自定义运动方式

Filter filter

表示刚体过滤信息

12. 刚体物理信息Fixture类:
刚体相关的一些物理信息的管理和组织由Fixture类完成,如设置刚体的密度、摩擦系数和弹性系数等。常用方法有:

方法

含义

ShapeType getType()

获取刚体的形状,返回值为形状类型类的对象

Shape getShape()

获取刚体的形状,返回值为形状类的对象

void setSensor(boolean sensor)

设置刚体碰撞后是否由JBox2D进行物理模拟,sensor为true时表示仅仅由JBox2D进行碰撞检测,而不模拟碰撞后运动

boolean isSensor()

获取刚体碰撞后是否由JBox2D进行物理模拟

void setFilterData(Filter filter)

设置刚体的碰撞过滤信息

Filter getFilterData()

获取刚体的碰撞过滤信息

void refilter()

当希望把先前由ContactFilter接口中ShouldCollide方法禁用的碰撞重新建立时可以调用此方法

Body getBody()

获取刚体的父刚体

Fixture getNext()

获取刚体物理信息列表的下一刚体物理信息对象

Object getUserData()

获取用户数据,返回值为获取的用户数据类的对象

void setUserData(Object data)

设置用户数据,data表示要设置的用户数据类对象的引用

void getMassData(MassData massData)

获取刚体的质量数据,data为指向质量数据的引用

void setDensity(float density)

设置密度

float getDensity()

获取密度

void setFriction(float friction)

设置摩擦系数

float getFriction()

获取摩擦系数

void setRestitution(float restitution)

设置弹性系数

float getRestitution()

获取弹性系数

boolean testPoint(Vec2 p)

判断指定点是否在此对象包含的区域范围内,p为指定的点坐标

boolean rayCast(RayCastOutput output, RayCastInput input, int childIndex)

判断形状是否与指定的射线相交,output为计算结果类对象的引用,其中包含了交点对应的射线方程参数以及射线与形状相交的法线,input为射线的相关信息类对象的引用,其中包含射线起点终点及允许相交时射线方程的最大参数值

AABB getAABB(int childIndex)

获取此对象的AABB包围盒

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