Фізична симуляція · Комп’ютерна графіка · Алгоритми
📅 Квітень 2026 ⏱ ≈ 13 хв читання 🎯 Середній–просунутий · Останнє оновлення: 28 травня 2026 р.

Динаміка на основі положень — тканина, мотузки та м’які тіла в реальному часі

Традиційні фізичні рушії інтегрують другий закон Ньютона — сили породжують прискорення, прискорення оновлюють швидкості, швидкості оновлюють положення. Цей конвеєр має критичну ваду: жорсткі обмеження (нерозтяжна тканина, жорсткі шарніри, контакти зіткнень) потребують крихітних часових кроків або спеціалізованих розв’язувачів, щоб залишатися стабільними. Динаміка на основі положень (PBD), запроваджена Мюллером та ін. у 2007 році, обходить цю проблему, оперуючи безпосередньо положеннями через ітеративну проєкцію обмежень — даючи безумовно стабільну симуляцію тканини, мотузок і м’яких тіл, достатньо швидку для ігор реального часу та інтерактивних VFX.

1. На основі сил проти на основі положень

У симуляції на основі сил пружина між двома частинками вносить силу F = k(|Δx| − L₀) × n̂ на кожному часовому кроці. Розв’язання отриманого жорсткого ЗДР потребує або:

Обидва підходи погано масштабуються до мільйонів обмежень. PBD замінює це прямим кроком проєкції обмежень: замість обчислення сил ми безпосередньо обчислюємо, наскільки зсунути кожну вершину, щоб задовольнити геометричне обмеження. Результат:

Обмеження: жорсткість PBD залежить від кількості ітерацій та часового кроку — подвоєння кількості підкроків змінює уявну жорсткість. XPBD (розділ 5) виправляє це параметром податливості, який залишається фізично осмисленим за різних розмірів часового кроку.

2. Алгоритм PBD

для кожного часового кроку h: 1. ПРОГНОЗ для кожної частинки i: v_i ← v_i + h · (f_ext / m_i) // застосувати зовнішні сили (гравітація, вітер) p_i ← x_i + h · v_i // спрогнозоване положення 2. ЗГЕНЕРУВАТИ ОБМЕЖЕННЯ ЗІТКНЕНЬ виявити зіткнення з геометрією сцени та між частинками додати тимчасові контактні обмеження 3. ПРОЄКЦІЯ (повторити n ітерацій): для кожного обмеження C_j(p_1, ..., p_k) = 0: обчислити корекції Δp_i, що задовольняють обмеження застосувати: p_i ← p_i + Δp_i (зважено за оберненою масою 1/m_i) 4. ОНОВЛЕННЯ для кожної частинки i: v_i ← (p_i − x_i) / h // швидкість зі зміни положення x_i ← p_i // зафіксувати нове положення 5. ОНОВИТИ ШВИДКОСТІ (демпфування, тертя тощо)

Оновлення швидкості на кроці 4 є вирішальним: швидкості виводяться зі зміщень положень, а не інтегруються із сил. Це означає, що корекції обмежень автоматично породжують фізично узгоджені зміни швидкості — зіткнення безкоштовно дають точні імпульси.

3. Типи обмежень

Обмеження відстані

Підтримує природну довжину L₀ між частинками p₁ та p₂:

C(p_1, p_2) = |p_1 - p_2| - L_0 Градієнт: ∇_p1 C = (p_1 - p_2) / |p_1 - p_2| = n̂ Корекція: Δp_1 = -(w_1 / (w_1 + w_2)) · C · n̂ Δp_2 = +(w_2 / (w_1 + w_2)) · C · n̂ де w_i = 1/m_i (обернена маса; w=0 для закріплених/статичних частинок)

Обмеження згину

Чинить опір складанню тканини поза площиною. Застосоване до чотирьох частинок, що утворюють два суміжні трикутники, воно штрафує відхилення двогранного кута від природного кута.

Збереження об’єму

Для м’яких тіл глобальне обмеження об’єму утримує сумарний замкнений об’єм близьким до природного об’єму V₀, породжуючи нестисливість, характерну для біологічних тканин і гуми.

Обмеження зіткнення

Коли частинка p проникає крізь поверхню з нормаллю n̂ і зсувається на глибину d, обмеження C = d ≥ 0 накладається проєкцією p на площину контакту та застосуванням імпульсів тертя по дотичній.

4. Ітерація Гаусса–Зейделя та збіжність

PBD застосовує обмеження послідовно (у порядку Гаусса–Зейделя), а не одночасно. Кожне обмеження проєктується з припущенням, що всі інші вже задоволені — жадібний підхід, який швидкий, але не точний:

Ефективна жорсткість масштабується як (1 − (1 − k)^n), де k — коефіцієнт жорсткості обмеження [0,1], а n — кількість ітерацій. Збіжність гарантована для опуклих наборів обмежень, і симуляція ніколи не «вибухає» — у найгіршому разі обмеження дещо «слабше», ніж задумано.

Для залежних обмежень (наприклад, довгих ланцюгів мотузок) збіжність усе ще обмежена швидкістю поширення інформації — обмеження на одному кінці «дізнається» про обмеження на іншому лише після N проходів крізь ланцюг. Це мотивує підкроки: розбиття кожного кадру на кілька менших часових кроків PBD.

5. XPBD — розширений PBD з податливістю

Мюллер та ін. (2020) запровадили XPBD, щоб надати PBD належну фізичну основу. Кожне обмеження отримує параметр податливості α = 1/k (де k — жорсткість пружини в Н/м), що не залежить від часового кроку.

XPBD замінює проєкцію обмеження оновленням множника Лагранжа: Δλ = -(C(p) + ã · λ) / (Σ w_i |∇_pi C|² + ã) де ã = α / h² (податливість, масштабована до розміру часового кроку h) Корекція: Δp_i = w_i · Δλ · ∇_pi C Після кожного підкроку: оновити λ ← λ + Δλ Ключова властивість: α = 0 → жорстке обмеження (класичний PBD) α → ∞ → жодного обмеження Жорсткість тепер не залежить від кількості ітерацій та часового кроку!

XPBD використовується в NVIDIA Flex, Chaos Physics в Unreal Engine та розв’язувачі Vellum у Houdini. Він дозволяє художникам задавати жорсткість матеріалу в Н/м (фізично осмислена одиниця), тоді як рушій автоматично породжує стабільні симуляції незалежно від кількості підкроків.

6. Самозіткнення та неперервне виявлення

Самозіткнення тканини — вершини, що проникають крізь ту саму сітку, — найважча задача в симуляції тканини. Наївне виявлення зіткнень O(n²) між усіма парами вершин занадто повільне. Поширені підходи:

Для візуальних ефектів кіноякості система тканини Pixar додає сили відштовхування між поверхнями, що зближуються ближче за поріг близькості, усуваючи потребу розв’язувати багато одночасних глибоких проникнень.

7. Паралелізм на GPU

PBD добре масштабується на GPU, бо крок проєкції обмежень легко паралелізується на рівні окремого обмеження. Основний виклик — конфлікти запису: два обмеження зі спільною вершиною обидва намагаються оновити цю вершину одночасно.

Рішення включають:

Цільова продуктивність: сітка тканини 128×128 (16 384 частинки, ~96 000 обмежень) при 8 підкроках × 10 ітераціях із GPU розв’язувачем на розфарбованому графі зазвичай досягає <1 мс на кадр на сучасному обладнанні — більш ніж достатньо швидко, щоб працювати поряд із повноцінною 3D-сценою на 60 Гц.
🧵 Спробувати симуляцію тканини →