c++ - LibGDX + Box2D 旋转

标签 c++ libgdx box2d simulation

如何使用 LibGDX 在 Box2D 中应用自动旋转(就像在现实世界中一样)?这看起来不现实(见下图)。

Screenshot

在现实世界中, block 会旋转并掉落,但在这个模拟中却不会。

世界的 Y 重力为 -9.81(因此下落和碰撞效果很好)这是我创建盒子的代码:

PolygonShape pShape = new PolygonShape();
FixtureDef fDef = new FixtureDef();
BodyDef bDef = new BodyDef();
Body body;

pShape.setAsBox(width, height);
bDef.position.set(x, y);
bDef.type = type;
fDef.shape = pShape;
fDef.density = 1.0f;
fDef.friction = 0.3f;
body = world.createBody(bDef);
body.createFixture(fDef);
body.setUserData(this);
MassData md = new MassData();
md.mass = 5;
body.setMassData(md);

主游戏类的代码:

public class Game implements ApplicationListener {

public static int WIDTH;
public static int HEIGHT;

World world;
Box2DDebugRenderer dr;
OrthographicCamera cam;
float time;
final float P = 1/60f;
final static int C = 100;

public void create() {
    Gdx.gl.glClearColor(.1f, .1f, .1f, 1.0f);
    WIDTH = Gdx.graphics.getWidth();
    HEIGHT = Gdx.graphics.getHeight();
    world = new World(new Vector2(0, -9.8f), false);

    dr = new Box2DDebugRenderer();
    cam = new OrthographicCamera();
    cam.setToOrtho(false, WIDTH/C, HEIGHT/C);

    new Block(world, BodyType.StaticBody, 2,        HEIGHT,     0,          HEIGHT);
    new Block(world, BodyType.StaticBody, 2,        HEIGHT,     WIDTH-40,   HEIGHT);
    new Block(world, BodyType.StaticBody, WIDTH,    2,          WIDTH,      HEIGHT);
    new Block(world, BodyType.StaticBody, WIDTH,    2,          WIDTH,      0); 
}

public void render() {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    input();

    dr.render(world, cam.combined);

    time += Gdx.graphics.getDeltaTime();
    while(time >= P) {
        update();
        time -= P;
    }
}

public void update() {
    world.step(P, 5, 5);
}

public void input() {
    if(Gdx.input.isTouched()) {
        new Block(world, BodyType.DynamicBody, 50, 20, Gdx.input.getX(), HEIGHT-Gdx.input.getY());
    }
}

public void dispose() { }
public void pause() { }
public void resize(int arg0, int arg1) { }
public void resume() { }
}

Block 类的代码:

public class Block {

public Block(World world, BodyType type, float width, float height, float x, float y) {

    PolygonShape pShape = new PolygonShape();
    FixtureDef fDef = new FixtureDef();
    BodyDef bDef = new BodyDef();
    Body body;

    pShape.setAsBox(width/Game.C, height/Game.C);
    bDef.position.set(x/Game.C, y/Game.C);
    bDef.type = type;
    fDef.shape = pShape;
    fDef.density = 1.0f;
    fDef.friction = 0.3f;
    body = world.createBody(bDef);
    body.createFixture(fDef);
    body.setUserData(this);
    body.setFixedRotation(false);
    MassData md = new MassData();
    md.mass = 5;
    body.setMassData(md);
}
}

最佳答案

MassData md = new MassData();

提供零转动惯量:md.I == 0,因此盒子不会旋转。

如果你这样做

MassData md = body.getMassData();

根据当前密度,您将获得质量和转动惯量。

改变质量并获得正确转动惯量的最佳方法 - 根据您的新质量自行计算,例如:

float massScale = [newMass] / md.mass;      
md.mass *= massScale;
md.I *= massScale;

这样您就可以保存正确的旋转点并拥有物理上正确的惯性。

关于c++ - LibGDX + Box2D 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657006/

相关文章:

c++ - 我如何使用来自 IMAPI2 的 IFileSystemImage2 的 put_BootImageOptionsArray(获取 E_NOINTERFACE)?

java.lang.NoClassDefFoundError & 解析失败 ... 接口(interface) 804 (LibGDX)

c# - 平台物理 - XNA Farseer C#

javascript - 不影响 Box2d Javascript 的碰撞检测

c++ - 不确定性 std::system_error: what(): 不允许操作

c++ - async([](){}) 和 thread([](){}).detach() 有什么区别?

c++ - C++编译错误已自行修复(试图找出原因)

android-studio - LibGDX Gradle任务可以在jar中导出android项目

java - Android 游戏上的自动保存和自动加载游戏概念以及内部保存与保存。外部(又称 SD 卡)

ios - b2DistanceJointDef anchor