Продолжаю эксперименты с алгоритмом верлета, начатые
тут
Работую над столкновениями блоба с произвольным препятсвием.
Блоб устроен просто - кольцо из Joint'ов нужной длины. При этом поддерживается определённая в начале площадь блоба - тут всё работает на ура.
Проблема состоит в следующем:
Задаю произвольную стену в виде полигона(в примере просто случайные по размеру, положению и количеству прямоугольники). Затем в каждый момент времени провожу проверку столкновения блоба с препятствиями и поддерживаю его периметр/площадь и так несколько раз. Но, когда блоб натыкается на уголок препятсвия - всё становится очень плохо. Его ребро, которое касается уголка куда-то резко дёргается и блоб закручивается. Ещё есть проваливание блоба в препяствие, когда его ребро полностью параллельно ребру препятсвия.
Алгоритм такой:
1. При создании стены просчитываются все неизменяемые данные, фигурирующие в алгоритме(для оптимизации)
2. Идёт грубая проверка пересекаются ли ограничивающий прямоугольник блоба с ограничивающим прямоугольником препятсвия
3. Если прошло 1 пункт, то для каждого ребра блоба методом луча проверяется попадание концов ребра в наше препятсвие
3.1 Один конец попал, другой нет:
Перебираются рёбра препятсвия. Ищется то, с которым есть пересечение ребра блоба: идёт менее грубая проверка пересечения ограничивающего прямоугольника блоба с ограничивающим прямоугольником ребра препятсвия, затем ещё менее грубая проверка пересечения ограничивающего прямоугольника ребра блоба с ограничивающим прямоугольником ребра препятсвия, затем непосредственно поиск точки перечечения.
Потом точка, попавшая вовнутрь препятствия ставится куда надо, корректируется скорость в соответсвии с трением и отскоком
3.2 Оба конца снаружи, но вероятно есть пересечения ребра с уголком препятсвия
Тогда аналогично 3.1 ищется пара соседних рёбер препятствия, и оба конца ребра смешаются по перпендикуляру к нему так, чтобы они больше не пересекали уголок.
Но в пункте 3.2. и кроется, как я понимаю, проблема. По сути перемешение должно быть маленьким, но иногда идёт скачок
Кто подскажет как решаются данные проблемы или поможет с более правильным алгоритмом проверки столкновения?
Для полноты картины прилеплю код и 2 примера