对jbox2d引擎的一些回顾与思考(swing实现demo)

JBox2d回顾与思考

jbox2d 是 box2d 的java移植,感觉国内网络上针对jbox2d的教程还比较少(通常是box2d)。回顾一下这几天的学习历程顺便写下博主的所思所想。

swing实现的demo

关于jbox2d,网上大部分都是android的实现,这里提供一个博主写的基于swing的实现,下面是github地址

点我

大概是下面这个样子。点屏幕创建自由下落的小球

jbox2demo

使用jbox2d的基本步骤:

  1. 创建世界(同时设置重力)
  2. 创建刚体
  3. 开始模拟

创建世界

World world = new World(new Vec2(0f,-10f));

Vec2(0f,-10f) 是重力,jbox2d里面的二元属性通常使用向量Vec2表示
需要注意的是-10,负号表示向下,这里可以看出jbox2d的坐标系跟数学物理坐标系是一致的
所以,坐标(0,0)在坐标(0,10)的正下方10米处
我用到了米这个单位,是因为在jbox2d里基本单位为:,千克,

创建刚体

步骤如下:

  1. 定义刚体质点属性(位置,状态)
  2. 通过世界和步骤1的定义创建一个刚体
  3. 为刚体添加内部属性(摩擦力,密度,弹性等)
定义刚体质点属性(位置,状态)
BodyDef bd = new BodyDef();
//设置bd属性...

BodyDef 代表刚体的质点属性,质点,是因为在牛顿力学里,为了研究方便,大多数物体都可以用一个点和它的质量来表示.jobx2d作为一个物理引擎,引用物理学的定义是必然的.所以刚学的时候可能会觉得步骤太过繁琐,可是我们应该理解它为什么要这样做.
BodyDef 内含常用的属性有:
position 位置
angle 角度
type 类型(static,dinamic,kinematic)

通过世界和步骤1的定义创建一个刚体

Body ball = world.createBody(bd)

先保留一个ball的引用,因为后面需要设置内部属性

设置刚体内部属性

FixtureDef fd = new FixtureDef();//创建一个夹具,代表刚体的内部属性
//设置夹具属性...
ball.createFixture(fd);//将夹具与ball挂钩

夹具FixtureDef的常用属性有:
shape 形状
density 密度
friction 摩擦系数
restitution 恢复系数

开始模拟

world.step(1f/30f,6,6);

为什么通过设置timeStep可以实现慢放快放呢?

关于第一个参数timeStep,我的理解是,每次调用step,模拟box2d世界中的1/30秒
假设程序每秒30帧,每一帧调用一次step,一秒也就是30帧过后,box2d的物理世界也刚好过了1/3030 == 一秒。
那么,如果我改成1f/60f,会怎么样呢?
一秒三十帧后,调用了30次step,而jbx2d物理世界里只过了1/60
30 == 0.5秒.也就是说原本可以走10米的一个小球,可现在只走了5米,在我们看来就产生了慢放镜头。

以上就是我对jbox2d的一些理解

posted @ 2017-04-21 23:50  音无麻里亚  阅读(752)  评论(0编辑  收藏  举报