如何防止碰撞中的两个物体同时交叉

Posted

技术标签:

【中文标题】如何防止碰撞中的两个物体同时交叉【英文标题】:How to prevent two objects in collisions from crossing both 【发布时间】:2015-04-15 19:40:12 【问题描述】:

我想知道如何防止一个物体穿过另一个物体。我有一个球和一个正方形,我可以用鼠标移动它们。当我的球在我的方格上时,如果我走得很慢,我会移动它(例如在顶部),如果没有穿过它,球就会留在方格上。

【问题讨论】:

【参考方案1】:

如果您的 2 个对象都定义了一个固定装置,它们将无法相互交叉,这是一个示例,说明如何必须创建一个受 BOX2D 世界中物理影响的动态对象,并且该对象也可以不要通过传感器隧道:

public Ball (World world)


        this.world = world;


        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyType.DYNAMIC;
        bodyDef.position.set(0.0f/RATE, 0.0f/RATE);
        Ballbody = world.createBody(bodyDef);

        CircleShape circle = new CircleShape();
        radius = (int) (Math.random()*30+15); // you can set a non randum raduis 
        circle.m_radius = radius/RATE;

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = circle;
        fixtureDef.restitution = 0.8f;
        fixtureDef.density = 2.0f;
        fixtureDef.friction = 0.3f;
        fixtureDef.filter.groupIndex = -1;
        Ballbody.createFixture(fixtureDef);
        Ballbody.getFixtureList().setUserData("Ballounaton"); // optional 

        Vec2 ballVec = new Vec2((float) (Math.random()*8+2),0.0f);
        Ballbody.setLinearVelocity(ballVec);

    

确保为您的 box2d 动态或静态对象定义一个夹具,以避免像本示例中那样通过传感器隧道:

FixtureDef fixtureDef = new FixtureDef();
            fixtureDef.shape = circle;
            fixtureDef.restitution = 0.8f;
            fixtureDef.density = 2.0f;
            fixtureDef.friction = 0.3f;
            fixtureDef.filter.groupIndex = -1;
            Ballbody.createFixture(fixtureDef);

根据BOX2D官方文档:

回想一下,形状不了解物体,可以使用 独立于物理模拟。因此 Box2D 提供了 b2Fixture 类将形状附加到主体。夹具保持 以下:

单一形状 广泛阶段代理 密度、摩擦和恢复 冲突过滤标志 返回到父正文的指针 用户数据 传感器标志

【讨论】:

当我不移动方球时它不起作用,但如果我缓慢移动它(到顶部)它会停留但很快它不会停留 运动:if (body.getUserData().getClass() == Square.class) if (Mouse.isButtonDown(0)) System.out.println("ok"); Vec2 mousePosition = new Vec2(Mouse.getX(), Mouse.getY()).mul(0.5f).mul(1/3f); PhysicalObject newPhysicalObject = new Square(world,mousePosition.x,mousePosition.y); physicalObjects.set(index, newPhysicalObject); world.destroyBody(object.getBody()); 将代码添加到您的问题中,请格式化! 提供了一个链接到管理身体创建的班级,我可以看到你是如何实现它们的!! 我修复了我的世界步法(60hz)的问题

以上是关于如何防止碰撞中的两个物体同时交叉的主要内容,如果未能解决你的问题,请参考以下文章

如何防止因哈希碰撞引起的DoS攻击

如何防止因哈希碰撞引起的DoS攻击

如何防止因哈希碰撞引起的DoS攻击

unity同一个gameobject上可以同时存在碰撞体和触发器吗

如何防止两个操作相互交错,同时仍然允许并发执行?

canvas游戏和动画中的碰撞检测