Libgdx既是传感器又是非传感器的Box2D装置?

Libgdx Box2D fixtures that are both sensors and non sensors?

假设我有主体 A、B 和 C,每个主体都有一个夹具。有可能让固定装置 A 和 B 彼此相互作用,其中一个或两个都是传感器,因此不会发生物理相互作用,但是 A 和 B 是否都与固定装置 C 有物理相互作用?所以,A-B = 无交互,A-C = 交互,B-C = 交互

你应该看看碰撞过滤(掩蔽)

通过为不同的对象设置类别和掩码,您可以控制允许哪些对象相互交互。

// create categories
final short A = 0x0001;  // 0000000000000001 in binary
final short B = 0x0002; // 0000000000000010 in binary
final short C = 0x0004; // 0000000000000100 in binary

// create masks
final short AM = 0x0006 // 0000000000000110 in binary
final short BM = 0x0006 // 0000000000000110 in binary
final short CM = 0x0001 // 0000000000000001 in binary

// apply masks and categories to fixtures
FixtureDef ADef = new FixtureDef();
ADef.filter.categoryBits = A;
ADef.filter.maskBits = AM;

是的,这可以使用掩码位和类别位来实现。这些允许灯具仅与使用这些位定义的某些其他灯具交互。

类别位定义灯具类型,默认为 0。

掩码位定义灯具可以与之交互的灯具类别。


因此,为了让 A 和 B 与 C 交互但不与彼此交互,我们需要应用以下类别位:

A.filter.categoryBits = 0x0001; //binary: 01
B.filter.categoryBits = 0x0001; //binary: 01
C.filter.categoryBits = 0x0002; //binary: 10

以及以下掩码位:

A.filter.maskBits = 0x0002; //binary: 10
B.filter.maskBits = 0x0002; //binary: 10
C.filter.maskBits = 0x0001; //binary: 01

由于 A 和 B 属于类别 0x0001 且 C 具有掩码 0x0001,因此 C 可以与 A 和 B 进行交互。A 和 B 的掩码中不包含 0x0001,因此不能互相交流。


可以找到更多 in-depth 解释和示例 here