本文介绍了某些实体在Libgdx box 2D中的碰撞失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我面临的问题是,汽车的大部分没有按预期发生碰撞。当两辆车相撞时,它们是重叠的,如下所示:

注意事项:

  1. 车轮和大炮(较小的形状)碰撞良好。当车轮接触时,车身停止
  2. 如果我通过代码检测到冲突,则冲突实际上正在发生
  3. 我尝试了一个较小的对象(机枪发射的子弹),并将该对象的"isBullet"属性设置为True,就像我在另一个帖子中看到的那样(not proper collision in box2d),但得到了相同的结果(该项目符号以红色圈出):

以下是我用来创建Body的代码:

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秒世界步长,速度迭代=6,位置迭代=2

知道我在这里遗漏了什么吗?

推荐答案

您的汽车主体(多边形)是凹面的。Box2D在处理凹多边形或顶点按顺时针顺序时有问题。试着用两个矩形来制造这些汽车,这样应该可以。

btw:您似乎使用的是较旧版本的libgdx。当前的libgdx夜总会在Polygon.set函数中有一个额外的算法,该算法以给定顶点的逆时针顺序自动计算凸壳。因此,使用该版本也可以解决您的问题。

这篇关于某些实体在Libgdx box 2D中的碰撞失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-23 14:13