Search code examples
javabox2djbox2dcollision

How to prevent two objects in collisions from crossing both


I want to know how to prevent an object in crossing another. I have a ball and a square which I can move whith my mouse. When my ball is on my square I move it (in top for example) if I go very slowly the ball remains on the square if not it crosses it.


Solution

  • if both of your 2 object have a fixture defined they will not be able to crossing one another this is an exmple of how a dynamic object who will be affected by physics in the BOX2D world must be created , and also this object can't tunneling through a sensor :

    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);
    
        }
    

    make sure to define a fixture to your box2d dynamic or static object to avoid tunneling through a sensor like in this exmple :

    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);
    

    according to BOX2D official documentation :

    Recall that shapes don’t know about bodies and may be used independently of the physics simulation. Therefore Box2D provides the b2Fixture class to attach shapes to bodies. Fixtures hold the following:

    • a single shape
    • broad-phase proxies
    • density, friction, and restitution
    • collision filtering flags
    • back pointer to the parent body
    • user data
    • sensor flag