Libgdx box2D中某些物体的碰撞失败

7
我正在使用libgdx和box2d制作我的第一款游戏。我正在使用调试渲染器测试我的对象。我创建了一些类似汽车的对象。每辆车都有一个主体,是一个由6个点组成的大型多边形(长约1米,高0.7米),并且有通过旋转连接的2个车轮。
主要部分的汽车还通过旋转连接具有炮和机枪。
我面临的问题是汽车的大部分没有按预期进行碰撞。当两辆车相撞时,它们会重叠在一起,就像这样:

Bodies colliding

一些注意事项:

  1. 车轮和加农炮(较小的形状)的碰撞正常。当车轮接触时,物体会停止。
  2. 如果我通过代码检测到碰撞,那么实际上发生了碰撞。
  3. 我尝试使用较小的对象(从机枪中发射的子弹),并像我在另一篇文章中看到的那样将对象的“isBullet”属性设置为true(not proper collision in box2d),但结果相同(子弹用红色圈出):

Bullet object colliding

这是我用来创建正文的代码:

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。你有什么想法我错过了什么吗?
1个回答

6

你的汽车主体(多边形)是凹的。 Box2D对于凹多边形或者顶点按照顺时针方向排序会有问题。 尝试用两个矩形来构建汽车,这样应该可以解决问题。

顺便说一下:你似乎在使用较旧版本的libgdx。 当前的libgdx夜间版本在polygon.set函数中增加了一个算法,它自动计算给定顶点逆时针方向的凸包。 因此使用那个版本也应该可以解决你的问题。


谢谢!我今天会尝试一下。顺便说一下,我3周前创建了这个项目,并在设置可执行文件中使用了更新的libgdx功能。这些更改是最近的吗? - Charbel
2
从我在GitHub上看到的情况来看,这个更改是在3月22日添加的。最新的libgdx发布版本是在3月16日发布的,因此目前只能在夜间版本中使用。 - Shinni
我将多边形改为凸形状,这实际上就是问题所在。我会采用两个矩形的建议。谢谢! - Charbel
1
如果有人遇到这个问题,只需按照建议获取最新版本即可解决。 - Charbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接