Метод матеріальної точки (MPM) — як симулювати сніг, пісок і м’які тіла
Метод матеріальної точки — це техніка симуляції, що стоїть за снігопадом у «Крижаному серці» Disney, лавиною в «Тайна Коко» та руйнуванням піску в реальному часі в багатьох сучасних іграх. Це гібридний підхід: лагранжеві частинки несуть властивості матеріалу та історію деформації, тоді як ейлерова фонова сітка опрацьовує виявлення зіткнень та інтегрування сил — даючи найкраще з обох світів.
1. Чому MPM? Лагранж проти Ейлера
Симуляції механіки суцільного середовища поділяються на дві родини:
- Лагранжів (частинки/сітка): елементи рухаються разом із матеріалом. Чудово підходить для відстеження великих деформацій і руйнування. Використовується в МСЕ для механіки твердих тіл. Дає збій, коли сітка стає надто спотвореною (розриви, екстремальна течія).
- Ейлерів (сітка): сітка фіксована; матеріал тече крізь неї. Чудово підходить для рідини — без заплутування сітки. Важко відстежувати чіткі межі матеріалів або залежну від історії пластичність.
MPM перебуває посередині: частинки несуть історію матеріалу (градієнт деформації, напруження, швидкість, густину), тоді як свіжа фонова сітка перестворюється на кожному часовому кроці для опрацювання контакту, проєкції тиску та граничних умов. Сітка відкидається після кожного кроку — заплутування неможливе.
2. Огляд алгоритму: чотири кроки на кадр
Кожен крок симуляції виконує чотири ключові операції:
- P2G (частинка → сітка): розмазування маси та імпульсу частинки на сусідні вузли сітки за допомогою інтерполяційних ваг
- Сили на сітці: обчислення та застосування сил (пружне напруження, гравітація, імпульси зіткнень) до швидкостей вузлів сітки
- Граничні умови: накладання стін, липких/слизьких поверхонь, об’єктів на сітці
- G2P (сітка → частинка): оновлення швидкостей та положень частинок із сітки; оновлення градієнта деформації
3. P2G — перенесення частинка-сітка
Кожна частинка впливає на найближчі 3×3 (2D) або 3×3×3 (3D) вузли сітки. Інтерполяційне ядро — це квадратичний B-сплайн — обраний за компактний носій (2 комірки), C¹-неперервність та властивість розкладу одиниці:
Внесок пружного напруження у силу на сітці походить від першого напруження Піоли–Кірхгофа P = ∂ψ/∂F, де ψ — це густина енергії деформації, а F — градієнт деформації:
4. Оновлення сітки — сили та граничні умови
Щойно маса та імпульс растеризовані на сітку, сили інтегруються явно:
Накладання граничних умов на сітку тривіальне порівняно з лагранжевим МСЕ, де контакт потребує складних формулювань функцій зазору. Це одна з ключових практичних переваг MPM.
5. G2P — перенесення сітка-частинка
Після оновлення сітки інформація повертається до частинок. Критична операція — оновлення градієнта деформації F, який кодує те, як матеріал розтягнувся та зазнав зсуву від початку симуляції:
Положення частинок оновлюються останніми, після того як пластичне зворотне відображення обмежило F до поверхні текучості (для моделей снігу/піску):
6. Конститутивні моделі
Градієнт деформації F керує обчисленням напружень. Різні матеріали використовують різні густини енергії деформації:
Неогуківське пружне тверде тіло
Сніг (Disney 2013)
Сніг руйнується при розтягу та ущільнюється при стиску. Це моделюється через мультиплікативну пластичність:
Пісок Друкера–Прагера
Пісок має критерій текучості за кутом тертя — він витримує стиск, але не розтяг, а міцність на зсув залежить від тиску:
Слабостислива рідина (тиск у стилі SPH)
7. Варіанти APIC та FLIP
Базова схема PIC (реконструкція швидкості суто із сітки) є чисельно дифузійною — кутовий момент втрачається. Існують два покращення:
-
FLIP (1988): переносить лише приріст
швидкості із сітки:
v_p += (v_grid_new − v_grid_old). Зберігає більше енергії, але з часом накопичує шум. -
APIC (Jiang та ін. 2015): Affine Particle-In-Cell.
Кожна частинка зберігає матрицю апроксимації локального поля
швидкостей C_p. P2G використовує
v_p + C_p·(x_i − x_p); G2P реконструює C_p із сітки. Зберігає кутовий момент точно з нульовою чисельною дисипацією — поточний рівень техніки для більшості застосувань MPM.
8. Основний цикл MLS-MPM на JavaScript
Нижче показано основний 2-D цикл MLS-MPM — спрощений для ясності. Повна робоча реалізація з рендерингом на canvas потребує ~200 рядків:
// Ядро MLS-MPM: сітка 64×64, ваги квадратичного B-сплайна
const n = 64; // роздільність сітки
const dt = 1e-4;
const dx = 1 / n;
const inv_dx = n;
// Стан частинок
let pos, vel, C, J; // положення, швидкість, афінна матриця, відношення об’ємів
function mpmStep() {
// 1. Скидання сітки
const gm = new Float32Array(n * n); // маса
const gmv = new Float32Array(n * n * 2); // імпульс xy
// 2. P2G
for (let p = 0; p < pos.length; p++) {
const [px, py] = pos[p];
const base = [Math.floor(px * inv_dx - .5), Math.floor(py * inv_dx - .5)];
// Ваги квадратичного B-сплайна (3 вузли на вісь)
const fx = [px * inv_dx - base[0], px * inv_dx - base[0] - 1, px * inv_dx - base[0] - 2];
const fy = [py * inv_dx - base[1], py * inv_dx - base[1] - 1, py * inv_dx - base[1] - 2];
const wx = [.5 * (1.5-fx[0])**2, .75-fx[1]**2, .5*(.5+fx[2])**2];
const wy = [.5 * (1.5-fy[0])**2, .75-fy[1]**2, .5*(.5+fy[2])**2];
// Доданок напруження MLS-MPM (неогуківська рідина: P = k₀(1 - 1/J) I)
const stress = -dt * 4 * inv_dx * inv_dx * 400 * (1 - 1 / J[p]);
for (let di = 0; di < 3; di++)
for (let dj = 0; dj < 3; dj++) {
const w = wx[di] * wy[dj];
const ix = base[0] + di, iy = base[1] + dj;
if (ix < 0 || ix >= n || iy < 0 || iy >= n) continue;
const idx = ix * n + iy;
const dpos = [(di - fx[di]) * dx, (dj - fy[dj]) * dx];
gm[idx] += w;
gmv[idx*2] += w * (vel[p][0] + C[p][0]*dpos[0] + stress * dpos[0]);
gmv[idx*2+1] += w * (vel[p][1] + C[p][3]*dpos[1] + stress * dpos[1]);
}
}
// 3. Оновлення сітки: нормалізація за масою, додавання гравітації, накладання межі
// 4. G2P: реконструкція швидкості та оновлення F, x (цикл по частинках)
}