代码之家  ›  专栏  ›  技术社区  ›  gsi

如何防止碰撞中的两个对象同时穿过

  •  0
  • gsi  · 技术社区  · 10 年前

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

    1 回复  |  直到 10 年前
        1
  •  0
  •   ZEE    10 年前

    如果您的两个对象都定义了固定装置,它们将无法相互交叉,这是必须如何创建受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类将形状附加到实体。固定装置保持 以下内容:

    • 单一形状
    • 宽相位代理
    • 密度、摩擦和恢复
    • 冲突过滤标志
    • 返回父实体的指针
    • 用户数据
    • 传感器标志