掩码和类别位仍然允许碰撞 Box2d

时间:2021-04-07 21:43:42

标签: c# box2d

据我所知,在 Box2d 中,如果另一个对象的类别在蒙版中,则对象将与另一个对象发生碰撞。

我已经设置了一个非常简单的场景,其中我有一个应该从地板上掉下来的正方形。出于测试目的,我已经做了它,所以面具和类别在正方形和地板上完全不同,如下所示

FilterData cubeFilter = new() { CategoryBits = 0b0001, MaskBits = 0b0010 };
FilterData floorFilter = new() { CategoryBits = 0b0100, MaskBits = 0b1000 };

然而,当 MCVE 运行时,立方体仍然落在地板上而不是掉下来。

为什么两个物体还在碰撞?

完整的 MCVE

NuGet

Install-Package Box2D.NetStandard -Version 1.0.3
Install-Package Box2D.Window -Version 1.0.3

代码

using Box2D.Window;
using Box2DX.Collision;
using Box2DX.Common;
using Box2DX.Dynamics;
using System.Threading;

namespace Box2dMcve
{
    internal static class Program
    {
        private static void Main()
        {
            AABB aabb = new();
            aabb.LowerBound.Set(-20, -10);
            aabb.UpperBound.Set(20, 110);

            World world = new(aabb, new Vec2(0.0f, -9.81f), false);

            BodyDef cubeDefinition = new();
            cubeDefinition.Position.Set(0, 70);

            PolygonDef cubeFixture = new();
            cubeFixture.SetAsBox(5, 5);
            cubeFixture.Friction = 0;
            cubeFixture.Restitution = 0;
            cubeFixture.Density = 1;
            FilterData cubeFilter = new() { CategoryBits = 0b0001, MaskBits = 0b0010 };
            cubeFixture.Filter = cubeFilter;

            Body basicCube = world.CreateBody(cubeDefinition);
            basicCube.CreateFixture(cubeFixture);
            basicCube.SetMassFromShapes();

            BodyDef floorDefinition = new();
            floorDefinition.Position.Set(0, 20);

            PolygonDef floorFixture = new();
            floorFixture.SetAsBox(20, 5);
            floorFixture.Friction = 0;
            floorFixture.Restitution = 0;
            FilterData floorFilter = new() { CategoryBits = 0b0100, MaskBits = 0b1000 };
            floorFixture.Filter = floorFilter;

            Body floor = world.CreateBody(floorDefinition);
            floor.CreateFixture(floorFixture);
            floor.SetStatic();

            Thread windowThread = new(() =>
            {
                SimulationWindow game = new("Physics Simulation", 800, 600);
                game.UpdateFrame += (_, _) => { world.Step(0.02f, 8, 3); };
                game.SetView(new CameraView());

                DrawPhysics physicsDrawer = new(game);
                physicsDrawer.AppendFlags(DebugDraw.DrawFlags.Aabb);
                physicsDrawer.AppendFlags(DebugDraw.DrawFlags.Shape);

                world.SetDebugDraw(physicsDrawer);

                game.VSync = OpenTK.VSyncMode.Adaptive;
                game.Run(60, 0);
            });

            windowThread.Start();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

原来我没有为世界设置联系人过滤器。我想我只是假设它默认会这样做。

添加行 world.SetContactFilter(new ContactFilter()); 解决了问题。