zoukankan      html  css  js  c++  java
  • 对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的一些理解

  • 相关阅读:
    POJ 3258 (NOIP2015 D2T1跳石头)
    POJ 3122 二分
    POJ 3104 二分
    POJ 1995 快速幂
    409. Longest Palindrome
    389. Find the Difference
    381. Insert Delete GetRandom O(1)
    380. Insert Delete GetRandom O(1)
    355. Design Twitter
    347. Top K Frequent Elements (sort map)
  • 原文地址:https://www.cnblogs.com/uturobako/p/jbox2d.html
Copyright © 2011-2022 走看看