Position Based Dynamics (PBD): тканина, м'які тіла та обмеження
Тканина, що тріпоче, в Assassin's Creed, деформівні тіла в Baldur's Gate 3 та симуляція волосся в Horizon Forbidden West — усі працюють на одній ідеї: замість обчислення сил та інтегрування законів Ньютона безпосередньо проєктувати позиції частинок, щоб задовольнити геометричні обмеження. Position Based Dynamics жертвує фізичною точністю заради гарантованої стійкості за будь-якого кроку часу — саме того, що потрібно іграм реального часу.
1. Чому б просто не використати сили?
Традиційна симуляція на основі сил (системи маса-пружина, FEM) обчислює сили в поточному стані, а потім інтегрує другий закон Ньютона, щоб оновити позиції та швидкості. Проблема: жорсткі пружини вимагають крихітних кроків часу, щоб лишатися стійкими, а тканина має дуже жорсткі пружини (інакше вона розтягується нереалістично).
Полотно тканини з 10 000 частинок, з'єднаних пружинами з жорсткістю k = 10⁶ Н/м, потребує кроку часу Δt < √(m/k) ≈ 10⁻⁴ с, щоб лишатися стійким за явного інтегрування — 600 підкроків на кадр при 60 fps. Неявне інтегрування потребувало б розв'язання великої розрідженої лінійної системи на кожному підкроці.
PBD був представлений Мюллером та ін. у статті 2007 року на SIGGRAPH «Position Based Dynamics» і відтоді став домінантним методом для симуляції тканини, волосся та м'яких тіл реального часу в іграх та інструментах візуальних ефектів кіно.
2. Цикл алгоритму PBD
Повний цикл симуляції PBD на кадр такий:
Вирішальна властивість: внутрішній цикл змінює лише передбачені позиції p, а не фактичні позиції x. Швидкість відновлюється наприкінці як скінченна різниця. Це означає, що нестійкі коливання не можуть накопичуватися — будь-яка надмірна корекція в p поглинається як зміна швидкості наприкінці кадру, а не повертається до наступної проєкції обмежень.
Кількість solverIterations керує
компромісом якість-продуктивність: 1 ітерація швидка, але обмеження
задовольняються не повністю; 10-20 ітерацій дають майже жорстку поведінку для
структурних обмежень.
3. Типи обмежень
Обмеження — це функція C(p₁, …, pₙ) = 0 (рівність) або ≥ 0 (нерівність), яку мають задовольняти передбачені позиції. Поширені типи обмежень для тканини та м'яких тіл:
Обмеження відстані
Підтримує фіксовану довжину спокою між двома частинками — «реберне» обмеження тканини:
Обмеження згинання
Протидіє згинанню вздовж ребра, спільного для двох трикутників. Двогранний кут між двома трикутниками має відповідати куту спокою:
Обмеження збереження об'єму
Для м'яких тіл (деформівних сіток) повний об'єм тетраедра має зберігатися:
Обмеження зіткнень
Генеруються динамічно, коли частинка проникає крізь поверхню. Обмеження-нерівність виштовхує частинку назад до поверхні:
Обмеження узгодження форми
Для твердих або майже твердих тіл: обчисли оптимальне жорстке перетворення (поворот + зсув), що відображає позиції спокою в поточні позиції, потім підтягни всі частинки до їхніх перетворених позицій спокою. Це зберігає загальну форму, дозволяючи певну пружну деформацію.
4. Проєкція обмежень: основна математика
Маючи порушене обмеження C(p₁,…,pₙ) ≠ 0, як мінімально перемістити частинки, щоб його задовольнити? PBD розв'язує задачу умовної мінімізації: знайти корекції Δpᵢ, що мінімізують ½Σ(1/wᵢ)|Δpᵢ|² за умови C = 0, де wᵢ = 1/mᵢ — обернена маса.
Проєкція обмеження відстані (замкнена форма)
Цей розв'язок у замкненій формі — причина, чому проєкція обмеження відстані така дешева — лише кілька операцій з рухомою комою на обмеження, без матричної факторизації, без ітеративного розв'язувача. Та сама простота стосується майже всіх типів обмежень PBD: градієнт ∇C аналітичний, а формула проєкції має розв'язок у замкненій формі.
5. Симуляція тканини за допомогою PBD
Сітка тканини — це регулярна або нерегулярна решітка частинок, з'єднаних трьома наборами обмежень:
Вітер та самозіткнення обробляються як додаткові сили та обмеження відповідно. Самозіткнення — найдорожча частина: просторовий хеш або BVH знаходить близькі пари частинок, а обмеження-нерівність за відстанню запобігає взаємопроникненню.
Тканина, що звисає на двох шпильках: мінімальна реалізація
Зверніть увагу на інтегрування в стилі Верле: швидкість неявно міститься у
різниці pos - prev. Це варіант «XPBD» або «PBD з
Верле», що поширено використовується на практиці — він уникає зберігання явних
швидкостей і дає автоматичне релеївське згасання, пропорційне
швидкості.
6. Жорсткість, ітерації та збіжність
У класичному PBD жорсткість керується лише кількістю ітерацій розв'язувача та параметром жорсткості на обмеження k ∈ [0, 1], що частково масштабує корекцію:
Ця залежність від кількості ітерацій — центральна практична проблема класичного PBD. Подвоєння ітерацій робить тканину жорсткішою; половинне зменшення ітерацій (через зміну бюджету продуктивності) робить тканину м'якшою. Художники переналаштовують симуляцію щоразу, коли змінюється бюджет розв'язувача — болісний робочий процес.
Збіжність також повільна для жорстких обмежень у великих сітках — проєкція в стилі Гаусса-Зейделя поширює корекції обмежень зі швидкістю O(1) обмеження на ітерацію, тож хвиля деформації потребує O(N) ітерацій для поширення через N частинок. Техніки для пом'якшення цього:
- Ієрархічний / мультисітковий PBD: проєктуй обмеження на кількох рівнях роздільності одночасно.
- Прискорення Чебишова: над-релаксуй корекції з залежним від ітерації коефіцієнтом, щоб прискорити збіжність.
- Групування обмежень: незалежні набори обмежень (розфарбовувані як несуміжні ребра графа) можна проєктувати паралельно — практично для GPU PBD.
7. XPBD: розширений PBD з податливістю
XPBD (Macklin et al. 2016) усуває залежність від кількості ітерацій, вводячи параметр податливості α, що є оберненою величиною фізичної жорсткості, та модифікує формулу проєкції множником Лагранжа:
XPBD — наступник PBD, що використовується в усіх сучасних фізичних рушіях. Chaos Physics в Unreal Engine, NVIDIA PhysX 5 та ECS-тканина Unity — усі реалізують XPBD. Параметр податливості α безпосередньо відповідає фізичним властивостям матеріалу: α ≈ 10⁻⁸ м/Н для майже твердої кістки, α ≈ 10⁻⁴ м/Н для жорсткої тканини, α ≈ 10⁻¹ м/Н для м'якої пружної тканини тіла.
Обмеження на рівні позицій проти рівня швидкостей
XPBD також вводить корекцію обмежень на рівні швидкостей наприкінці циклу розв'язувача (згасання), тож енергію можна коректно розсіювати без покладання на штучне згасання на рівні позицій, що порушує енергетичну модель XPBD. Це уможливлює фізично точне згасання матеріалу як окремий параметр α_damp.
8. Застосування та використання в індустрії
PBD та XPBD — домінантні методи симуляції реального часу в іграх, кіно та медичній симуляції:
Ігри
- Тканина: плащі, прапори, волосся, мотузки практично в кожній AAA-грі від 2010 року. Часто 1000–5000 частинок на шматок тканини, 5–15 ітерацій розв'язувача, підкроки: 1–3 на кадр.
- Стекування твердих тіл: XPBD з високою жорсткістю замінює розв'язувачі на основі імпульсів для стабільності купи з подібною якістю, але з уніфікованим кодом розв'язувача.
- Руйнування: уламки моделюються як обмеження відстані PBD між фрагментами — обмеження розривається, коли сила перевищує поріг.
Кіно та VFX
- Houdini Vellum: продакшн-розв'язувач тканини, волосся та зерна — повністю на основі XPBD. Використовувався в десятках оскароносних фільмів. Може запускати симуляції з 200 000+ частинок з кількістю підкроків 20–100.
- Maya nCloth: раніший розв'язувач тканини, похідний від PBD, у Maya, широко використовуваний у телевиробництві.
Медицина та наука
- Хірургічні симулятори: деформація м'яких тканин PBD для лапароскопічного тренування — у реальному часі, стійка навіть за великих деформацій від хірургічних інструментів.
- Плиноподібні зернисті матеріали: обмеження густини PBD симулюють пісок, бруд та неньютонівські плини. «Position Based Fluids» Маккліна (2013) додає обмеження густини плину поряд із ядерними функціями SPH.
Поєднання в PBD простоти, стійкості та фізичної правдоподібності — навіть без суворої точності — зробило його основою фізичної симуляції реального часу понад 15 років. Модель податливості XPBD тепер скорочує розрив до фізично точної поведінки, роблячи цей метод конкурентним з FEM для багатьох застосувань, де діють мілісекундні бюджети симуляції.