我正在使用带有 box2d 的 libgdx 开发我的第一款游戏。我正在使用调试渲染器来测试我的对象。我创建了一些类似汽车的物体。每辆车有一个主体,是一个6点的大多边形(长约1米,高0.7米),并有2个通过旋转接头连接的轮子。
主车装有一门大炮和一挺机枪,也通过旋转接头连接。
我面临的问题是汽车的大部分没有按预期进行碰撞。当两辆车相撞时,它们是重叠的,像这样:
一些注意事项:
- 车轮和大炮(较小的形状)碰撞良好。当车轮接触时,身体正在停止
- 如果我通过代码检测到碰撞,则碰撞实际上正在发生
- 我用一个较小的物体(从机枪发射的子弹)尝试了这个,并且我将对象的“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
知道我在这里缺少什么吗?