Вот пост, в котором есть ссылки на статьи о подобных типах симуляций (в инженерном / академическом контексте, а не для игр): https://gamedev.stackexchange.com/a/10350/6398
Я попробовал по крайней мере два разных подхода к обнаружению столкновений + отклик для такого рода «проводной» симуляции (как видно в игре Umihara Kawase); по крайней мере, я думаю, что это то, что вам нужно - кажется, нет особого термина для такого рода симуляции, я просто называю это «провод», а не «веревка», потому что кажется, что большинство людей считают «веревку» синонимом «цепи частиц». И, если вы хотите, чтобы у ниндзя было поведение прилипания (то есть он может толкать и тянуть), это скорее напоминает жесткий провод, чем веревку. Так или иначе..
Ответ Пекуджи хороший, вы можете реализовать непрерывное обнаружение столкновений, решив для времени, когда подписанная область трех точек равна 0.
(Я не могу полностью вспомнить OTOH, но вы можете подойти к нему следующим образом: найдите время t, когда точка a содержится в линии, проходящей через b, c, (я думаю, что я сделал это, решив, когда точка (ab, cb) = 0, чтобы найти значения t), а затем, учитывая действительное время 0 <= t <1, найдите параметрическую позицию s a на сегменте bc, то есть a = (1-s) b + s c, и если a находится между b и c (то есть, если 0 <= s <= 1), это допустимое столкновение.
AFAICR, вы можете подойти к нему и с другой стороны (то есть решить для s, а затем подключить это, чтобы найти t), но это гораздо менее интуитивно понятно. (Извините, если это не имеет никакого смысла, у меня нет времени, чтобы выкопать свои записи, и это было несколько лет!))
Таким образом, теперь вы можете рассчитать все моменты, в которые происходят события (т.е. узлы веревки должны быть вставлены или удалены); обработать самое раннее событие (вставить или удалить узел), а затем повторять / повторять до тех пор, пока не останется больше событий между t = 0 и t = 1.
Одно предупреждение об этом подходе: если объекты, которые может обернуть веревка, являются динамическими (особенно, если вы имитируете их И их влияние на веревку, и наоборот), тогда могут возникнуть проблемы, если эти объекты обрезают / проходят через каждый Другое - провод может запутаться. И, безусловно, будет сложно предотвратить такого рода взаимодействие / движение (углы объектов проскальзывают друг через друга) в физическом моделировании в стиле box2d. Небольшое проникновение между объектами - нормальное поведение в этом контексте.
(По крайней мере ... это была проблема с одной из моих реализаций "wire".)
Другое решение, которое намного более устойчиво, но в некоторых условиях пропускает некоторые коллизии, состоит в том, чтобы просто использовать статические тесты (т.е. не беспокоиться о порядке упорядочения по времени, просто рекурсивно подразделить каждый сегмент в коллизии, как вы их находите), что может быть намного более надежный - проволока не будет запутываться в углах, и небольшое количество проникновения будет в порядке.
Я думаю, что подход Пекуджи работает и для этого, однако есть альтернативные подходы. Один из подходов, который я использовал, заключается в добавлении вспомогательных данных о столкновениях: в каждой выпуклой вершине v в мире (то есть в углах фигур, которые может обернуть веревка), добавьте точку u, образующую направленный отрезок линии uv, где u - некоторая точка «внутри угла» (то есть внутри мира, «позади» v; для вычисления u вы можете направить луч внутрь от v вдоль его интерполированной нормали и остановиться на некотором расстоянии после v или до того, как луч пересечется с краем мира и Выход из сплошной области. Или вы можете просто нарисовать сегменты вручную, используя визуальный инструмент / редактор уровней).
В любом случае, теперь у вас есть набор "угловых линейных сегментов"; для каждого uv и каждого сегмента ab в проводе проверьте, пересекаются ли ab и uv (т. е. статический, логический запрос пересечения lineseg-lineseg); если это так, выполните возврат (разбейте линейный сегмент ab на av и vb, т. е. вставьте v), записав, в каком направлении изогнут верёвку в v. Затем для каждой пары соседних линейных сегментов ab, bc в проводе проверьте текущее направление изгиба в точке b то же самое, что и при генерации b (все эти тесты «направления изгиба» являются просто тестами со знаком области); если нет, объедините два сегмента в ac (то есть удалите b).
Или, может быть, я слился, а затем разделился, я забыл - но это определенно работает по крайней мере в одном из двух возможных заказов! :)
Учитывая все сегменты провода, рассчитанные для текущего кадра, вы можете затем смоделировать ограничение расстояния между двумя конечными точками провода (и вы даже можете задействовать внутренние точки, то есть точки контакта между проводом и миром, но это немного сложнее ).
В любом случае, надеюсь, это будет полезно ... статьи в посте, который я тоже связал, должны также дать вам некоторые идеи.