Ось публікація, яка містить посилання на статті про подібні типи моделювання (в інженерному / академічному контекстах, а не для ігор): https://gamedev.stackexchange.com/a/10350/6398
Я спробував принаймні два різні підходи до виявлення зіткнень + відповідь для такого роду "дротяного" моделювання (як видно в грі Umihara Kawase); принаймні, я думаю, що це те, що ти шукаєш - мабуть, не існує конкретного терміна для подібного моделювання, я просто називаю це "дротом", а не "мотузкою", тому що, здається, більшість людей вважають "мотузку" синонімом "ланцюжка частинок". І, якщо ви хочете, щоб поведінка мотузки ніндзя (тобто вона може штовхати ТА потягувати), це більше схоже на жорсткий дріт, ніж на мотузку. Все одно ..
Відповідь Пекуджі хороша, ви можете здійснити безперервне виявлення зіткнень, вирішивши час, коли підписана площа трьох балів дорівнює 0.
(Я не можу повністю згадати OTOH, але ви можете підійти до нього наступним чином: знайдіть час t, коли точка a міститься у рядку, що проходить через b, c, (я думаю, що я це зробив, вирішивши, коли крапка (ab, cb) = 0, щоб знайти значення t), а потім задати дійсний час 0 <= t <1, знайдіть параметричне положення s а на відрізку bc, тобто a = (1-s) b + s c і якщо a знаходиться між b і c (тобто, якщо 0 <= s <= 1), це дійсне зіткнення.
AFAICR, ви також можете підійти до цього навпаки (тобто вирішити для s, а потім підключити це, щоб знайти t), але це набагато менш інтуїтивно. (Вибачте, якщо це не має сенсу, я не встигаю викопувати свої нотатки, і пройшло вже кілька років!))
Отже, тепер ви можете обчислити всі часи, в які відбуваються події (тобто вузли мотузки слід вставляти або видаляти); обробити найбільш ранню подію (вставити або видалити вузол), а потім повторити / повторити, поки не буде більше подій між t = 0 і t = 1.
Одне попередження про такий підхід: якщо об’єкти, якими мотузка може обернутись, є динамічними (особливо, якщо ви імітуєте їх І їх вплив на мотузку, і навпаки), то можуть виникнути проблеми, якщо ці об’єкти обрізати / проходити через кожен інше - дріт може заплутатися. І, безумовно, буде складним завданням запобігти такому взаємодію / русі (кути предметів, ковзаючи між собою) у фізичному моделюванні в стилі box2d .. невелика кількість проникнення між об'єктами - це нормальна поведінка в цьому контексті.
(Принаймні .. це була проблема з однією з моїх реалізацій "дроту".)
Інше рішення, яке набагато стійкіше, але яке пропускає певні зіткнення в певних умовах, - це просто використовувати статичні тести (тобто не турбуйтеся про впорядкування часом, просто рекурсивно підрозділяйте кожен сегмент при зіткненні, як ви їх знайдете), що може бути набагато міцніший - дріт не заплутається по кутах і невелика кількість проникнення буде добре.
Я думаю, що підхід Пекуї працює і для цього, проте є альтернативні підходи. Один із підходів, який я використав, - це додавання допоміжних даних зіткнення: у кожній опуклої вершини v у світі (тобто кутах фігур, якими мотузка може обернутися), додати крапку u, що утворює відрізок прямої лінії uv, де u - деякий точка "всередині кута" (тобто всередині світу, "позаду" v; для обчислення u ви можете кинути промінь всередину v вздовж його інтерпольованої нормалі і зупинити деяку відстань після v або до того, як промінь перетинається з краєм світу і Виходить із суцільної області. Або ви можете просто вручну намалювати сегменти у світ, використовуючи візуальний інструмент / редактор рівнів).
У будь-якому разі, тепер у вас є набір "кутових рядків рядків" uv; для кожного uv і кожного сегмента ab в проводі перевірте, чи перетинаються ab і uv (тобто статичний, булевий рядок lineseg-lineseg-перетин); якщо так, повторіть повтор (розділіть рядок рядка ab на av і vb, тобто вставте v), записуючи, в якому напрямку мотузка зігнута на v. Потім для кожної пари сусідніх рядків ab, bc в проводі, перевіряйте, чи поточний напрямок вигину на b те саме, що і коли було створено b (усі ці випробування на "напрямок згину" є лише тестами області, що підписалися); якщо ні, то з’єднайте два сегменти у змінні (тобто видаліть b).
А може, я злився і потім розколовся, я забуваю - але це, безумовно, працює принаймні в одному з двох можливих замовлень! :)
Враховуючи всі дротяні сегменти, обчислені для поточного кадру, ви можете змоделювати обмеження відстані між двома кінцевими точками дроту (і ви навіть можете залучити внутрішні точки, тобто точки контакту між проводом і світом, але це дещо більше ).
У будь-якому випадку, сподіваюсь, це буде корисною ... документи в пості, з якими я також зв’язувався, також повинні дати вам кілька ідей.