Box2D WeldJoint не работает правильно

Перед моим вопросом мой английский очень авантюрный...

В моем приложении libgdx я реализовал Box2D. Итак, я создал мир и добавил их 2 тела. Первое тело - это PolygonShape, установленный как коробка, которая статична и вращается в середине моего мира. Второе тело - это просто круг, который динамичен и падает поверх первого тела. Когда падающий круг сталкивается с коробкой, я создаю WeldJoint и ожидаю, что круг теперь тоже вращается с коробкой... Но примерно через 20 градусов круг останавливает его вращение внутри коробки и не двигается больше...

Вот картинка: работает правильно, как клей

другой: останавливает вращение вокруг коробки

Мой код:

BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyType.StaticBody;
    bodyDef.position.set(10, 8);

    mainBox = world.createBody(bodyDef);

    PolygonShape polygonShape = new PolygonShape();
    polygonShape.setAsBox(1, .5F);
    mainBox.createFixture(polygonShape, 1);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = polygonShape;
    fixtureDef.density = .1F;
    fixtureDef.friction = .5F;
    fixtureDef.restitution = .2F;

    Fixture f = mainBox.createFixture(fixtureDef);
    f.setUserData("mainbox");
    mainBox.setUserData("mainbox");

    /* ------------------------------------------------------------------------------------------ */

    bodyDef = new BodyDef();
    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(10, 20);

    shootBall = world.createBody(bodyDef);
    shootBall.setUserData("shootball");

    CircleShape circleShape = new CircleShape();
    circleShape.setRadius(.2F);


    fixtureDef = new FixtureDef();
    fixtureDef.shape = circleShape;
    fixtureDef.density = .5F;
    fixtureDef.friction = .5F;
    fixtureDef.restitution = .3F;

    f = shootBall.createFixture(fixtureDef);
    f.setUserData("shootball");

    circleShape.dispose();

    world.setContactListener(new ContactListener(){

        @Override
        public void beginContact(Contact contact) {
            if(contact.getFixtureA().getBody().getUserData().equals("mainbox") && contact.getFixtureB().getBody().getUserData().equals("shootball")){
                contact.getFixtureA().getBody().setUserData("createjoint");
                System.out.println("contact!");
            }
        }

И в моем цикле рендеринга:

if(mainBox.getUserData().equals("createjoint")){
        WeldJointDef jointDef = new WeldJointDef();
        jointDef.bodyA = mainBox;
        jointDef.bodyB = shootBall;
        jointDef.initialize(mainBox, shootBall, mainBox.getPosition());
        world.createJoint(jointDef);
        mainBox.setUserData("mainbox");
    }

Игнорировать плохой код, он просто для тестирования...

Спасибо:)

0 ответов

Другие вопросы по тегам