Box2D Fixture 没有获得与其 FixtureDef 相同的类别和掩码位

Box2D Fixture doesn't get the same category and mask bits of its FixtureDef

在我看来这很奇怪。我基于 fixtureDef 创建 fixture。 我使用 libGDX 版本的 Box2D。 这是我的代码:

System.out.println("category bits of fixtureDef: " + fixtureDef.filter.categoryBits);
System.out.println("mask bits of fixtureDef: " + fixtureDef.filter.maskBits);
System.out.println("category bits of fixtureDef: " + fixtureDef_leftPropeller.filter.categoryBits);
System.out.println("mask bits of fixtureDef: " + fixtureDef_leftPropeller.filter.maskBits);
System.out.println("category bits of fixtureDef: " + fixtureDef_rightPropeller.filter.categoryBits);
System.out.println("mask bits of fixtureDef: " + fixtureDef_rightPropeller.filter.maskBits);

Body body = world.createBody(Res.bodyDef_dynamic);
fixture = body.createFixture(fixtureDef);
fixture_leftPropeller = body.createFixture(fixtureDef_leftPropeller);
fixture_rightPropeller = body.createFixture(fixtureDef_rightPropeller);
body.setTransform(pos.x * Drone2D.MPP, pos.y * Drone2D.MPP, 0);
body.setUserData(drone);

System.out.println(" ");

for (Fixture fix : body.getFixtureList()) {
    System.out.println("category bits of fixture: " + fix.getFilterData().categoryBits);
    System.out.println("mask bits of fixture: " + fix.getFilterData().maskBits);
}

这段代码的输出是:

category bits of fixtureDef: 2
mask bits of fixtureDef: 11
category bits of fixtureDef: 2
mask bits of fixtureDef: 11
category bits of fixtureDef: 2
mask bits of fixtureDef: 11

category bits of fixture: 4
mask bits of fixture: -1
category bits of fixture: 4
mask bits of fixture: -1
category bits of fixture: 4
mask bits of fixture: -1

什么?我的 fixture 的过滤位怎么可能与创建时使用的 fixtureDef 不同?

我也发现了这一点:这些灯具获得的遮罩是我在创建这些新灯具之前销毁的 body 的遮罩。

不过,这不应该发生。

有人body知道什么会导致这种行为吗?

编辑:

我发现我的游戏中每一个 body 都会出现这种过滤器扰乱现象。

我目前的解决方法是以下功能,这似乎足够了:

public static void fixFixtureFilter(Fixture fixture, short maskBits, short categoryBits) {
    Filter filter = fixture.getFilterData();
    filter.maskBits = maskBits;
    filter.categoryBits = categoryBits;
    fixture.setFilterData(filter);
}

不过,我的 B2D 世界肯定有问题。

更新

似乎这个问题已经被跟踪 here and has been fixed in the new 1.9.13 release (see the release notes. So this problem can be fixed by updating your libGDX version 到 1.9.13。


我刚刚在我的项目中对此进行了测试,发现了与您描述的相同的行为。我将 FixutreDefmaskBits 设置为 9,但是当我创建 Body 并使用调试器检查装置时 [= Fixture 的 10=] 被设置为 -1。所以这个bug似乎是可以重现的。

但是 如果我更改 FixtureDefmaskBits 以避免特定类别的灯具(我用敌方灯具测试过),它们确实不再与创建的 Fixture 发生冲突(如果它确实将 maskBits 设置为 -1,那是不可能的,因为那将意味着夹具与所有其他对象发生碰撞)。

所以libGDX中的maskBits似乎是错误的,而[= Box2D 中的 10=] 似乎是 正确的 ,这是可能的,因为 libGDX 使用 java Box2D 的包装器,它是在本机方法中实现的(我认为是在 C 中)。

因此 碰撞检测有效,但 java 包装器显示错误值 (可能是因为错误的引用,因为你说“这些掩码fixtures get 是我在创建这些新 fixtures 之前破坏的 body 的掩码”)。
这个问题可能只是 libGDX 中的一个 bug,很难找到,因为一开始一切似乎都在工作(直到你调试它)。


您应该将此错误添加到 libGDX 的 issue tracker,以便修复。但不幸的是,这可能需要一些时间,因此您可能需要将工作区保留一段时间,或者忽略它,因为碰撞检测无论如何都在工作。