Динаміка на основі положень — тканина, мотузки та м’які тіла в реальному часі
Традиційні фізичні рушії інтегрують другий закон Ньютона — сили породжують прискорення, прискорення оновлюють швидкості, швидкості оновлюють положення. Цей конвеєр має критичну ваду: жорсткі обмеження (нерозтяжна тканина, жорсткі шарніри, контакти зіткнень) потребують крихітних часових кроків або спеціалізованих розв’язувачів, щоб залишатися стабільними. Динаміка на основі положень (PBD), запроваджена Мюллером та ін. у 2007 році, обходить цю проблему, оперуючи безпосередньо положеннями через ітеративну проєкцію обмежень — даючи безумовно стабільну симуляцію тканини, мотузок і м’яких тіл, достатньо швидку для ігор реального часу та інтерактивних VFX.
1. На основі сил проти на основі положень
У симуляції на основі сил пружина між двома частинками вносить силу F = k(|Δx| − L₀) × n̂ на кожному часовому кроці. Розв’язання отриманого жорсткого ЗДР потребує або:
- Малих часових кроків (явний метод Ейлера, Рунге–Кутта) — стабільно, але повільно для жорстких пружин.
- Неявного інтегрування (Ньюмарк-Бета, неявний метод Ейлера) — стабільно, але потребує розв’язання великої лінійної системи на кожному кадрі.
Обидва підходи погано масштабуються до мільйонів обмежень. PBD замінює це прямим кроком проєкції обмежень: замість обчислення сил ми безпосередньо обчислюємо, наскільки зсунути кожну вершину, щоб задовольнити геометричне обмеження. Результат:
- Безумовна стабільність незалежно від розміру часового кроку.
- O(n) і легко паралелізується (без глобальної лінійної системи).
- Інтуїтивна жорсткість як кількість ітерацій розв’язувача (художній контроль).
2. Алгоритм PBD
Оновлення швидкості на кроці 4 є вирішальним: швидкості виводяться зі зміщень положень, а не інтегруються із сил. Це означає, що корекції обмежень автоматично породжують фізично узгоджені зміни швидкості — зіткнення безкоштовно дають точні імпульси.
3. Типи обмежень
Обмеження відстані
Підтримує природну довжину L₀ між частинками p₁ та p₂:
Обмеження згину
Чинить опір складанню тканини поза площиною. Застосоване до чотирьох частинок, що утворюють два суміжні трикутники, воно штрафує відхилення двогранного кута від природного кута.
Збереження об’єму
Для м’яких тіл глобальне обмеження об’єму утримує сумарний замкнений об’єм близьким до природного об’єму V₀, породжуючи нестисливість, характерну для біологічних тканин і гуми.
Обмеження зіткнення
Коли частинка p проникає крізь поверхню з нормаллю n̂ і зсувається на глибину d, обмеження C = d ≥ 0 накладається проєкцією p на площину контакту та застосуванням імпульсів тертя по дотичній.
4. Ітерація Гаусса–Зейделя та збіжність
PBD застосовує обмеження послідовно (у порядку Гаусса–Зейделя), а не одночасно. Кожне обмеження проєктується з припущенням, що всі інші вже задоволені — жадібний підхід, який швидкий, але не точний:
- З 1 ітерацією: низька роздільність, пружна поведінка (корисно для мотузок).
- З 10–30 ітераціями: майже нерозтяжна тканина, жорсткі шарніри.
- З 50+ ітераціями: майже жорсткі стрижні, підвісні мости.
Ефективна жорсткість масштабується як (1 − (1 − k)^n), де k — коефіцієнт жорсткості обмеження [0,1], а n — кількість ітерацій. Збіжність гарантована для опуклих наборів обмежень, і симуляція ніколи не «вибухає» — у найгіршому разі обмеження дещо «слабше», ніж задумано.
Для залежних обмежень (наприклад, довгих ланцюгів мотузок) збіжність усе ще обмежена швидкістю поширення інформації — обмеження на одному кінці «дізнається» про обмеження на іншому лише після N проходів крізь ланцюг. Це мотивує підкроки: розбиття кожного кадру на кілька менших часових кроків PBD.
5. XPBD — розширений PBD з податливістю
Мюллер та ін. (2020) запровадили XPBD, щоб надати PBD належну фізичну основу. Кожне обмеження отримує параметр податливості α = 1/k (де k — жорсткість пружини в Н/м), що не залежить від часового кроку.
XPBD використовується в NVIDIA Flex, Chaos Physics в Unreal Engine та розв’язувачі Vellum у Houdini. Він дозволяє художникам задавати жорсткість матеріалу в Н/м (фізично осмислена одиниця), тоді як рушій автоматично породжує стабільні симуляції незалежно від кількості підкроків.
6. Самозіткнення та неперервне виявлення
Самозіткнення тканини — вершини, що проникають крізь ту саму сітку, — найважча задача в симуляції тканини. Наївне виявлення зіткнень O(n²) між усіма парами вершин занадто повільне. Поширені підходи:
- Просторове гешування: геш-сітка комірок розміром із товщину тканини; перевіряються лише пари вершин у тій самій або сусідніх комірках. O(n) для однорідної тканини.
- Обхід BVH: ієрархії обмежувальних об’ємів (AABB або орієнтовані обмежувальні паралелепіпеди), що перепідганяються на кожному кадрі. O(n log n), добре для неоднорідних сіток.
- Неперервне виявлення зіткнень (CCD): замість перевірки положень у кінці часового кроку перевіряється вся траєкторія від x до p на зіткнення вершина-трикутник та ребро-ребро. Запобігає протунелюванню крізь тонкі шари.
Для візуальних ефектів кіноякості система тканини Pixar додає сили відштовхування між поверхнями, що зближуються ближче за поріг близькості, усуваючи потребу розв’язувати багато одночасних глибоких проникнень.
7. Паралелізм на GPU
PBD добре масштабується на GPU, бо крок проєкції обмежень легко паралелізується на рівні окремого обмеження. Основний виклик — конфлікти запису: два обмеження зі спільною вершиною обидва намагаються оновити цю вершину одночасно.
Рішення включають:
- Розфарбовування графа: розфарбовуйте обмеження так, щоб обмеження одного кольору не мали спільних вершин. Кожна кольорова група обробляється паралельно на GPU. Тканина зазвичай потребує 4–8 кольорів.
- Атомарне додавання float: накопичуйте дельти положень атомарно; діліть на кількість після обробки всіх обмежень (у стилі Якобі).
- Обчислювальні шейдери WebGPU: сучасна вебальтернатива CUDA/OpenCL; підтримує конвеєр PBD з розфарбовуванням графа зі спільною пам’яттю робочої групи для локального агрегування.