7

我正在使用带有 box2d 的 libgdx 开发我的第一款游戏。我正在使用调试渲染器来测试我的对象。我创建了一些类似汽车的物体。每辆车有一个主体,是一个6点的大多边形(长约1米,高0.7米),并有2个通过旋转接头连接的轮子。

主车装有一门大炮和一挺机枪,也通过旋转接头连接。

我面临的问题是汽车的大部分没有按预期进行碰撞。当两辆车相撞时,它们是重叠的,像这样:

身体碰撞

一些注意事项:

  1. 车轮和大炮(较小的形状)碰撞良好。当车轮接触时,身体正在停止
  2. 如果我通过代码检测到碰撞,则碰撞实际上正在发生
  3. 我用一个较小的物体(从机枪发射的子弹)尝试了这个,并且我将对象的“isBullet”属性设置为 true,正如我在另一篇文章中看到的那样(在 box2d 中碰撞不正确),但结果相同(项目符号以红色圈出):

子弹物体碰撞

这是我用来创建主体的代码:

protected Body createBody(Material material, Shape shape, BodyType type, WorldWrapper world)
{
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = type;
    bodyDef.position.set(initialPosition);

    Body body = world.createBody(bodyDef);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.density = this.material.getDensity();
    fixtureDef.friction = this.material.getFriction();
    fixtureDef.restitution = this.material.getRestitution();
    fixtureDef.shape = shape;
    body.createFixture(fixtureDef);

    return body;
}

汽车使用车轮旋转接头上的电机向前行驶,结构如下:

public void goForward()
{
    for (RevoluteJoint joint : wheelJoints)
    {
        joint.enableMotor(true);
        joint.setMotorSpeed(-this.engineSpeed);
        joint.setMaxMotorTorque(this.engineTorque);
    }
}

我正在使用以下值:

Density = 2500;
Restitution = 0;
Friction = 0.1;
BodyType = Dynamic;

我正在使用 1/60 秒的世界步长,velocityIterations = 6 和 positionIterations = 2

知道我在这里缺少什么吗?

4

1 回答 1

6

您汽车的主体(多边形)是凹形的。Box2D 在凹多边形或顶点按顺时针顺序时存在问题。尝试用两个矩形构建那些汽车,这应该可以。

顺便说一句:您似乎使用的是旧版本的 libgdx。当前的 libgdx nightlies 在 polygon.set 函数中有一个额外的算法,它会按照给定顶点的逆时针顺序自动计算凸包。因此,使用该版本也应该可以解决您的问题。

于 2013-05-24T10:37:24.520 回答