Что может вызвать внезапную остановку в Box2D?

Я использую Box2d для игры, и у меня есть ошибка, которая сводит меня с ума. Я упростил ситуацию до квадратного игрока, скользящего вперед-назад без трения по полу, состоящего из серии квадратных плиток, управляемых левой и правой клавишами (которые применяют горизонтальное усилие). Прекрасно работает, скользя вперед и назад по всему полу.

За исключением … Время от времени, игрок внезапно прилипнет к краю одной из плиток, как будто он ударяет по (несуществующей) стене. Дальнейшие толчки в том же направлении, в котором они двигались, потерпят неудачу, но как только я толкну назад один раз в противоположном направлении, я снова смогу продвинуться вперед через точку прилипания. Точка слипания кажется случайной, за исключением того, что она находится на краю плитки. Бывает при движении влево или вправо.

В целях отладки я сохраняю значения Positions / speed для двух предыдущих тиков обновления и распечатываю их, когда происходит эта остановка. Например, здесь вы видите, что игрок двигается вправо, слегка замедляясь; pos2 должен быть около 8.7, но вместо этого он останавливается.

tick0:  pos= 8.4636 vel= 7.1875
tick1:  pos= 8.5816 vel= 7.0833
tick2:  pos= 8.5816 vel= 0.0000

Таким образом, поскольку у игрока 0,8, а у плитки 1,0, он останавливается, как только собирается перейти на следующий тайл (8,5816 + 0,8 / 2 = 8,9816). Фактически, я получаю сообщение о столкновении (которое я игнорирую, за исключением того, что замечаю, что это произошло). Кажется, что это происходит только в x.5816 (или -x.4184) при движении вправо и в x.4167 (или -x.5833) при движении влево

Я сказал, что это все равно, что ударить стену, но на самом деле, когда он попадает в стену, цифры выглядят так:

 tick0:  pos0= 12.4131 vel2= 8.4375
tick1:  pos1= 12.5555 vel1= 8.5417
tick2:  pos2= 12.5850 vel0= 0.0000

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

Кто-нибудь видел что-нибудь подобное? Любые предложения о том, как я мог быть причиной такого поведения?

2

Решение

К сожалению, это известная проблема в Box2d … из FAQ:

Плитка на основе окружающей среды

Использование множества ящиков для вашей местности может не сработать, потому что ящики похожи
персонажи могут зацепиться за внутренние углы. Будущее обновление для
Box2D должен обеспечивать плавное движение по краевым цепям. В общем ты
следует избегать использования прямоугольного символа, потому что столкновение
Допуски все равно приведут к нежелательному зацеплению.

Для получения дополнительной информации см. Этот пост:
http://box2d.org/forum/viewtopic.php?f=3&т = 3048

И от Эрика Катто, создателя Box2d (выделение добавлено):

Я работаю над решением для краевых цепей, но нет решения для
смежные полигоны. Вы действительно лучше, используя один или несколько кругов
для персонажа против окружающей среды
. Большинство профессиональных игр с использованием современных
физические движки используют гладкие формы, такие как капсулы, для персонажей.
Использование фигур для персонажей действительно хорошо работает только в системах,
использовать основанное на пикселях столкновение с интегральной математикой (то есть старая консоль
игры).

В общем, ваше тело должно быть гладкой формы, а не многоугольником, чтобы оно не цеплялось между плитками.

3

Другие решения

Других решений пока нет …