LINUX.ORG.RU

box2d шарики прогибаются

 


0

2

Осваиваю box2d + libGDX, написал проект где в коробку падают шарики. Создается ощущение что шарики весят несколько тон и вдавливают шарики которые внизу(начинают наползать друг на друга). Как сделать чтоб они вели себя нормально?

Создаются так

BodyDef bodyDef = new BodyDef();
            bodyDef.type = BodyType.DynamicBody;

            CircleShape dynamicCircle = new CircleShape();
            dynamicCircle.setRadius(3.6f);
            FixtureDef fixtureDef = new FixtureDef();
            fixtureDef.shape = dynamicCircle;
            fixtureDef.density = 1.0f;
            fixtureDef.friction = 1.0f;
            fixtureDef.restitution = 0.7f;

            bodyDef.position.set(10.0f+ rn.nextInt(13),70.0f);
            pBalls.add(new Ball(world.createBody(bodyDef),rn.nextInt(3)));
            pBalls.get(pBalls.size()-1).body.createFixture(fixtureDef);
            pBalls.get(pBalls.size()-1).body.setLinearVelocity(0,-100);
            MassData massData =  pBalls.get(pBalls.size() - 1).body.getMassData();
            massData.mass = rn.nextFloat();
            pBalls.get(pBalls.size()-1).body.setMassData(massData);

http://postimg.org/image/iazstv3wp/ Вот картинка, посмотрите что происходит с нижними шариками.

★★★

Последнее исправление: abs (всего исправлений: 1)

Ответ на: комментарий от Harald

а по-моему на картинке всё нормально

В самом низу ближе к правому краю, красный шарик налез на зеленый

abs ★★★
() автор топика
Ответ на: комментарий от abs

сделай раз в 10 больше шариков и картинку, если там будет явное непотребство после этого, тогда можно считать, что проблема есть

Harald ★★★★★
()
Ответ на: комментарий от Harald

сделай раз в 10 больше шариков и картинку, если там будет явное непотребство после этого

Я под телефон игру делаю, там будет примерно такое количество шариков как сейчас на экране.

abs ★★★
() автор топика

Там ограничение на глубину неправильно работает, шарик, который «продавился» на самом деле чуть дальше от наблюдателя и точка контакта закрыта от нас частью шарика, а не на видимой окружности.

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

Там ограничение на глубину неправильно работает, шарик, который «продавился» на самом деле чуть дальше от наблюдателя и точка контакта закрыта от нас частью шарика, а не на видимой окружности.

Я новичок в box2d, можно более понятными словами объяснить что не так, и где это настраиваться?

abs ★★★
() автор топика
Последнее исправление: abs (всего исправлений: 1)

тебе нужно подобрать параметры правильно. Плотность/размеры/масса шариков, гравитацию, трение. Либо же увеличивать количество итераций на шаг и/или выбрать другой метод интегрирования.
Но ничто тебя не спасёт в общем случае. Все движки имеют и будут иметь погрешности(никакой физической точности там нету, ибо риалтайм). Подбирай параметры.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от abs

Надо ограничение на размер коробки по оси, перпендикулярной экрану, поставить равным диаметру шарика (можно на очень малую величину больше, чтобы не было артефактов округления).

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

Надо ограничение на размер коробки по оси, перпендикулярной экрану, поставить равным диаметру шарика (можно на очень малую величину больше, чтобы не было артефактов округления).

Подожди, но разве тут все не в 2д? Нет оси перпендикулярной экрану.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Ну тогда в коде рассчёта коллизии неправильно задан диаметр шарика (или он останавливается когда сработала коллизия, а не возвращается назад на сумму радиусов).

dn2010 ★★★★★
()
Ответ на: комментарий от dn2010

Ну тогда в коде рассчёта коллизии неправильно задан диаметр шарика (или он останавливается когда сработала коллизия, а не возвращается назад на сумму радиусов).

Но как это исправить? Не править же код движка.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Можно написать свой код, или написать разработчикам.

dn2010 ★★★★★
()

Покажите реальный объект, которым оперирует box2d, а не ваши шарики.

Реализуйте свой b2Draw и подключите его. Я делал приблизительно так:

class cDebugDraw : public b2Draw
{
public:
    virtual ~cDebugDraw();

    virtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);
    virtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);
    virtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color);
    virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color);
    virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color);
};

// connect debug draw to box2d world
b2world->SetDebugDraw(point_to_cDebugDraw_instance);
andreyu ★★★★★
()
Ответ на: комментарий от andreyu
class Ball{
    Body body;
    int color;
    Ball(Body _body,int _color){
        body = _body;
        color = _color;
    }
}
for (int i = 0; i < pBalls.size(); i++) {
            batch.draw(tBall[pBalls.get(i).color],pBalls.get(i).body.getPosition().x*10 -36f , pBalls.get(i).body.getPosition().y*10 -36f , 72, 72);
        }
abs ★★★
() автор топика

плотность

Тоже недавно начал изучать box2d и не знаю как раньше были устроены fixtures, но в доках сказано, что density (плотность) измеряется в kg/m^2. Это значит что для эмуляции плотности нужно подбирать значения плотности из реального мира. К примеру, плотность воды 1000 кг/м^3, это значит по системе box2d -> 100 кг/м^2. А у Вас в примере плотность равна 1 - то есть объекты имеет плотность в 100 раз меньшую, чем вода и следовательно она друг в друга проваливаются (смешиваются). Попробуйте значение плотности 500, думаю все исправится...

anonymous
()
Ответ на: плотность от anonymous

Тоже недавно начал изучать box2d и не знаю как раньше были устроены fixtures, но в доках сказано, что density (плотность) измеряется в kg/m^2. Это значит что для эмуляции плотности нужно подбирать значения плотности из реального мира. К примеру, плотность воды 1000 кг/м^3, это значит по системе box2d -> 100 кг/м^2. А у Вас в примере плотность равна 1 - то есть объекты имеет плотность в 100 раз меньшую, чем вода и следовательно она друг в друга проваливаются (смешиваются). Попробуйте значение плотности 500, думаю все исправится...

Я конечно попробую, но как по мне это вообще не связанные вещи. Плотность не играет никакого смысла если установлена другая масса, просто если не ставить массу вручную это то значение на основе которого будет считаться масса. ИМХО.

abs ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.