Нужна помощь в обнаружении / разрешении столкновений в 2D-симуляции "червеобразных" существ - PullRequest
1 голос
/ 31 июля 2011

Я реализую физический движок для симуляции червеобразных существ. Проблема в том, что они могут плавать друг над другом и занимать одну и ту же точку в пространстве. Итак, у вас есть некоторое представление об окружающей среде, я предоставляю видео здесь: http://www.box.net/shared/mlddkslszbxd59cfdhpc

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

Example of worms interacting with coarse grain and fine grain collision circles

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

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

Приветствия за любую помощь, я действительно ценю это! :-) Бен.

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

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

https://gamedev.stackexchange.com/questions/12059/why-do-objects-interpenetrate-in-this-simple-collision-solver

Я в основном использую тот же код, и черви отскакивают друг от друга, как и ожидалось.

Приветствия,

Бен.

0 голосов
/ 31 июля 2011

Самый простой способ смоделировать упругое столкновение (при котором энергия не теряется), просто рассчитав общий импульс (скорость * масса) каждого червя в X и Y до столкновения и разделив его между двумя червями после столкновения. Импульс обычно делится на массу, поэтому проще всего, если черви имеют одинаковую массу, тогда импульс X и Y каждого из них после столкновения будет просто вдвое меньше суммарного импульса двух предыдущих.

Это означает, что если два червя, движущихся с одинаковой скоростью, сталкиваются, они отскакивают, как если бы это было зеркало, если движущийся червь в виде стационарного червя слипается и движется в одном направлении с половинной скоростью

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

...