2016-01-24 3 views
1

Я пытаюсь понять Box2D, и я создал два тела (земля и динамическое тело, плавающие). Когда динамическое тело, которое подвержено действию силы тяжести, сталкивается с земным телом, кажется, что оно находится внутри основного тела.Тело Box2d входит в другое тело

Это правильное поведение? или у меня ошибка в моем графическом рендерере?

inside

+1

привет, попробуйте увеличить значение параметра ITERATION_POSITION внутри функции world.step() – Netero

ответ

2

Это может быть "правильным" поведение или нет.

Правильно ли это зависит от деталей, которые, как представляется, не предоставляются, и которые мы определяем как «правильные». Подробная информация о том, сколько итераций используется или размеры и плотность в условиях Box2D отображаемых фигур. И является ли наше определение правильным, основано на документированном поведении Box2D или ожидаемом физическом поведении твердых тел. Ради этого ответа я буду использовать прежнее определение.

Метод b2World::Step работает для разрешения совпадений. Его позиционное разрешение будет применять импульсы к телам, чтобы вести их к целевой глубине проникновения в тела скинов. Этот скин является радиусом от вершин. Для многоугольных форм это радиальное значение равно b2_polygonRadius.

Если нарисованные периметры фигуры нарисованы, то при достаточно увеличенном увеличении мы увидим, что формы перекрываются друг с другом на долю их радиусов кожи. Вот как Box2D реализован по крайней мере по этому стандарту, некоторые перекрытия верны. С другой стороны, если рисунки вершин и ребер будут нарисованы, тогда фигуры будут плавать друг над другом при увеличении масштаба.

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

Модификация Testbed «Тяжелый На Light» тестовый код таким образом, чтобы больший круг имеет радиус 50,0 (вместо 5,0), тогда как меньший круг имеет радиус, равный 0,5 показывает нижний круг полностью перекрываются, как видно в следующее изображение: Image of larger circle completely within smaller circle в то же время увеличивая плотность большей окружности от 10,0 до 1000,0 (вместо увеличения его радиуса за пределы 5,0) аналогично также показывает перекрытие: Image of denser circle completely within smaller less-dense circle

Box2D говорит справки о вещи, как:

В частности, Box2D настроен так, чтобы хорошо работать с движущимися фигурами от 0,1 до 10 метров. Таким образом, это означает, что объекты между суп-банками и автобусами по размеру должны хорошо работать. Статические формы могут быть длиной до 50 метров без проблем.

И как:

Предложенный итерационный счетчик для Box2D является 8 для скорости и 3 для позиции. Вы можете настроить этот номер по своему вкусу, просто имейте в виду, что у этого есть компромисс между производительностью и точностью. Использование меньшего количества итераций увеличивает производительность, но точность страдает. Аналогично, использование большего количества итераций снижает производительность, но улучшает качество вашей симуляции.

Так что, основываясь на документации Box2D, похоже, это поведение можно ожидать в некоторых комбинациях настроек, поэтому ваш примерный рисунок можно считать правильным. Как предложил Нетеро, вы можете попытаться увеличить количество итераций позиции, чтобы убедиться, что это улучшает ситуацию. Ожидание дольше, в то время как b2World::Step называется больше, также может уменьшить перекрытие. Или изменить их размеры/плотность.

Что касается ошибок в вашем рендерере, это также возможно. Опять же, ответ зависит от деталей, которые не отображаются. Детали, подобные источнику кода, выполняющего рендеринг. Например, если то, что мы видим, является результатом рендеринга контуров прямоугольников, тогда вы захотите изменить это, чтобы вместо этого показывать пиксельные широкие линии между вершинами или рендеринг только твердых внутренностей, определяемых вершинами.

Смежные вопросы