Box2D 碰撞过滤与同时碰撞

发布于 2024-12-26 13:11:30 字数 438 浏览 1 评论 0原文

我使用的是 Box2DWeb 2.1a,Box2DFlash 的直接端口。

我通过设置类别和掩码位来使用联系人过滤器(b2FilterData)。这在一定程度上有效,但有一些我没想到的令人恼火的行为。当不应该碰撞的物体也与另一个它们应该碰撞的物体接触时,这些物体也会相互碰撞。我不想要这个,但不知道如何摆脱它。

我使用 ShouldCollide 方法创建了一个 b2ContactFilter,该方法是 b2ContactFilter.prototype.ShouldCollide 方法的精确副本,以便在接触时打印出类别和掩码位的值。当错误冲突发生时,我注意到filter1.categoryBits和filter1.maskBits分别变成0x0001和0x65535。这就好像 b2FilterData 是一个新实例,或者 b2Body 已被分配了一个新的 b2FixtureDef 实例。但我不知道为什么会发生这种情况。

I am using Box2DWeb 2.1a, a direct port of Box2DFlash.

I am using contact filters (b2FilterData) by setting the category and mask bits. This works in part, but there is some irritating behaviour that I did not expect. When items that should not collide are also in contact with another object, which they should collide with, these objects will collide with each other too. I do not want this, but cannot find out how to get rid of it.

I created a b2ContactFilter with a ShouldCollide method that is an exact copy of the b2ContactFilter.prototype.ShouldCollide method in order to print out the values of the category and mask bits upon contact. When the erroneous collisions occur, I noticed that the filter1.categoryBits and filter1.maskBits become 0x0001 and 0x65535, respectively. This is as though the b2FilterData is a new instance, or the b2Body has been assigned a new b2FixtureDef instance. I do not know why this has happened, though.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱的那么颓废 2025-01-02 13:11:30

您确定正确分配了 b2FilterData 吗?它应该应用于 b2Fixture 而不是 b2FixtureDef。如果您正在这样做:

var myData = new b2FilterData();
myData.maskBits = ~0x0004;

fixture.m_filter = myData;

尝试改为:

fixture.SetFilterData(myData);

如果调用 SetFilterData 时出错,则意味着您不是在 b2Fixture 上调用它,而是在 b2FixtureDef 上调用它,这是错误的。

这有帮助吗?

Are you sure you are assigning the b2FilterData correctly? It should be applied to a b2Fixture and not a b2FixtureDef. If you are doing:

var myData = new b2FilterData();
myData.maskBits = ~0x0004;

fixture.m_filter = myData;

Try instead:

fixture.SetFilterData(myData);

If you get an error calling SetFilterData it means you are not calling it on the b2Fixture but on the b2FixtureDef instead, which is wrong.

Did that help at all?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文