jBox2D круг заканчивается движением по горизонтали или вертикали - PullRequest
0 голосов
/ 14 апреля 2011

Я попытался реализовать подпрыгивающий круг между 4 стенами. Но не имеет значения, что является начальным вектором скорости этого круга, через некоторое время он всегда заканчивается движением по горизонтали или вертикали. Это нормальное поведение? Если нет, как я могу это исправить?

Спасибо за ваши ответы.

Стена:

BodyDef bd = new BodyDef();
    Body body = w.createBody(bd);
    PolygonDef sd = new PolygonDef();
    sd.density = 0.0f;
    sd.friction = 0.01f;
    sd.restitution = 1f;

    sd.setAsBox(250, 10f, new Vec2(250, 1), 0);
    body.createShape(sd);

    sd.setAsBox(250, 10f, new Vec2(250, 499), 0.0f);
    body.createShape(sd);

    sd.setAsBox(250, 10f, new Vec2(1, 250), (float) (Math.PI / 2));
    body.createShape(sd);

    sd.setAsBox(250, 10f, new Vec2(499, 250), (float) (Math.PI / 2));
    body.createShape(sd);

// Круг:

BodyDef bd = new BodyDef();
    bd.position.set((float) (Math.random() * 400 + 50), (float) (Math.random() * 400 + 50));
    //bd.isBullet = true;
    Body body = w.createBody(bd);
    Vec2 v = new Vec2((float) (Math.random() * 20 - 10), (float) (Math.random() * 20 - 10));
    System.out.println(body + "  " + v);
    body.setLinearVelocity(v);
    body.setAngularVelocity(0.1f);

    CircleDef sd = new CircleDef();
    sd.radius = (float) (Math.random() * 40 + 5);
    sd.density = 15.0f;
    sd.restitution = 0.8f;

    body.createShape(sd);
    body.setMassFromShapes();

1 Ответ

1 голос
/ 25 марта 2012

Попробуйте установить значение трения крепления шара на 0.

Моя история:

У меня была похожая установка и проблема (4 стены, без гравитации, отскок мяча внутри - хотя в LibGDX, но неjBox2D).После нескольких часов поиска и возни, я обнаружил, что установка трения шарикового приспособления в 0 заставляла шар отражаться / отражаться внутри стен.Не ноль, и он будет несколько раз подпрыгивать под нечетными углами отражения (не квадратный / прямой угол, как ожидалось), заканчиваясь в устойчивом состоянии, подпрыгивая по горизонтали или вертикали.

Больше информации о моем случае, если этоотносящийся к любому (у Google почти ничего не было в этом!):

После долгого изучения я наконец понял, что на самом деле он не подпрыгивает точно по горизонтали или вертикали.Исходя из моего (по общему признанию, очень плохого) понимания физики, я думаю, что где-то в Box2D есть ошибка;wlog отскакивает от горизонтальной стены, вы ожидаете vx * = -1f;но в устойчивом состоянии это также будет vy * = -1f.Угловая скорость не имела никакого эффекта (я даже пытался установить фиксированный угол на теле и отдельно добавлять дрожание угловой скорости к объекту каждый тик), и это не имело никакого отношения к типу телосложения (делая стенку кинематической, статической и динамичнойвсе дало одинаковый эффект).Я пробовал как с порогом скорости в 0f и по умолчанию, так и с радиусом кожи и без.Изменение реституции будет влиять на то, сколько времени потребуется, чтобы закончить в своем горизонтальном / вертикальном устойчивом состоянии;но, тем не менее, он всегда достигал этого.

Эффект, возможно, связан с (на основании того, что, по утверждениям, происходило в отношении скорости, влияющей на угол отражения в пространстве без гравитации): http://www.box2d.org/forum/viewtopic.php?f=3&t=7716

...