Чому ігри не розв’язують проблему з мотузкою за допомогою сил
Мотузка або ланцюг фізично є дуже довгим серією жорстких або майже жорстких зв’язків, з’єднаних суглобами, і моделювання їх шляхом обчислення сил натягу та інтегрування прискорень (як ви це робите для твердотільного тіла) схильне до чисельної міцності: натягнутий сегмент так сильно протистоїть розтягненню, що розв’язувачу на основі сил потрібен надзвичайно малий крок часу, інакше він вибухає. Динаміка позиції (ПЗД), яку запропонували Мюллер та інші у 2007 році, обходить цю проблему, працюючи безпосередньо з положеннями замість сил: кожна обмеження (наприклад, «ці дві точки повинні залишатися на фіксованій відстані одна від одної») задовольняється шляхом безпосереднього коригування положень, а потім швидкість відновлюється пізніше з того, як далеко фактично рухалася кожна точка. Ця схема є незмінно стабільною в сенсі того, що вона ніколи не може розійтися до нескінченності — мотузку, змодельовану таким чином, тягнеться під занадто мало ітерацій, але вона ніколи не вибухає.
Основний цикл
Кожен крок моделювання слідує одному й тому ж чотирма етапам, що виконується один раз на кадр:
1. Прогнозування: p* = p + v·h + a·h^2 (інтегрується як якщо б не було обмежень) 2. Розв’язання: для кожного відстані між точками (i, j): Δp = поправка, яка тягне |p*_i − p*_j| до значення довжини L застосовується Δp до p*_i та p*_j, зважено за оберненою масою (повторюється для всіх обмежень, кілька ітерацій, стиль Гаусса-Зейделя) 3. Оновлення v: v = (p* − p) / h 4. Підтвердження: p = p* Відстань між двома сусідніми точками ланцюга i та j, з оберненими масами w_i та w_j, коригується пропорційно тому, наскільки кожна точка може вільно рухатися:
Δp_i = -w_i/(w_i+w_j) * (|p_i − p_j| − L) * (p_i − p_j)/|p_i − p_j| Δp_j = +w_j/(w_i+w_j) * (|p_i − p_j| − L) * (p_i − p_j)/|p_i − p_j| Виконання цієї корекції один раз на обмеження на кадр є дешевим, але лише приблизно задовольняє всі обмеження одночасно, оскільки незначне коригування довжини одного зв’язку трохи впливає на сусідні; кілька ітерацій Гаусса-Зейделя на кадр (повторне простежування всіх обмежень) дозволяє корекціям поширюватися по ланцюгу та збігатися до глобально узгодженої, майже нерозтяжної мотузки. Більше ітерацій означає більш жорстку мотузку за пропорційно більшу вартість на кадр.
1. predict: p* = p + v·h + a·h² (integrate as if unconstrained)
2. solve: for each distance constraint (i, j):
Δp = correction that pulls |p*_i − p*_j| back to rest length L
apply Δp to p*_i and p*_j, weighted by inverse mass
(repeat over all constraints, several iterations, Gauss–Seidel style)
3. update v: v = (p* − p) / h
4. commit: p = p*
Почему возникает форма катеноида для свободных объектов?
При подвешивании веревки под действием силы тяжести между двумя фиксированными точками она принимает форму катеноида — кривую y = a * cosh(x/a), которая минимизирует потенциальную энергию, учитывая заданную общую длину — и решатель PBD достигает ее естественным образом, без необходимости кодирования уравнения: гравитация тянет каждый свободный прогнозирующий элемент вниз, а ограничения на расстояние сопротивляются растяжению, и равновесие этих двух конкурирующих эффектов итеративно приближается к сходимости, что соответствует форме реальной подвешенной цепи. То же самое объясняет, почему основная проволока подвесного моста близка к катеноиду (параболической под равномерной горизонтальной нагрузкой, точнее), поскольку физика минимизирует энергию, а решатель ограничений фактически выполняет эту минимизацию шаг за шагом.
Статичні хвилі та самоперешкода
Оскільки кожен зв’язок спілкується лише з безпосередніми сусідами, різка перерва в одному кінці ланцюга (ривок, кидок) поширюється вниз мотузкою як справжня поздовжня хвиля, а фіксація обох кінців перетворює мотузку на природний резонатор стоячої хвилі, з тим самим фізичним принципом, що й у смичка, де первинна та вищі гармоніки видно як збільшення кількості ітерацій Гаусса-Зеіля та симуляції напруги.
Самоперешкода додається таким же чином, як і будь-яке інше обмеження: коли два несусідні сегменти мотузки наближаються один до одного занадто близько, нерівність (а не рівність) відштовхує їх лише тоді, коли порушується, дозволяючи мотузці скручуватися та накопичуватися сама на собі без перехресного проникнення.
Frequently asked questions
Чому мотузка типу PBD ніколи не вибухає, як фізика на основі сили,?
PBD безпосередньо працює з положеннями, а не інтегрує сили та прискорення для жорстких обмежень. Оскільки кожне обмеження задовольняється шляхом прямого переміщення точок на обмежену відстань замість застосування потенційно великої корекційної сили, немає нестабільного зворотного зв’язку, який може безмежно посилюватися, лише недостатня збіжність при недостатній кількості ітерацій.
Чому висяча мотузка утворює криву катенари без програмування цієї форми?
Крива катенари – це просто форма, яка мінімізує гравітаційний потенційну енергію для заданої довжини мотузки. Оскільки PBD тягне точки вниз за допомогою кроку гравітації та чинить опір розтягуванню за допомогою обмежень відстані, ітерація цих двох ефектів до рівноваги числово досягає тієї самої форми, що мінімізує енергію, як аналітичне рівняння катенари.
Що відбувається, якщо запускати лише одну ітерацію обмеження на кадр замість кількох?
Мотузка стане помітно витягнутою за межі її спокійної довжини, оскільки один прохід лише частково вирішує кожен зв’язок до того, як його сусіди також перемістяться. Збільшення кількості ітерацій Гаусса на кадр робить мотузку більш жорсткою та ближчою до нерозтяжної, за пропорційний збиток обчислювальних ресурсів.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Chain and Rope і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Chain and Rope