Marching Cubes — виділення ізоповерхонь з об'ємних даних
МРТ-скани, симуляції рідин на основі множин рівня, метакулі та процедурні ландшафти мають спільне представлення: тривимірне скалярне поле, де цікава поверхня — це множина точок, у яких поле дорівнює пороговому значенню (ізоповерхня). Marching Cubes, винайдений Лоренсеном і Клайном у GE 1987 року, перетворює будь-яку таку неявну поверхню на трикутну сітку, придатну для растеризованого рендерингу, — і попри те, що йому майже 40 років, він лишається алгоритмом першого вибору в програмах медичної візуалізації, 3D-ігрових рушіях і рендерерах рідин реального часу по всьому світу.
1. Ізоповерхні та неявні представлення
Скалярне поле F: ℝ³ → ℝ приписує дійсне значення кожній точці 3D-простору. Ізоповерхня на ізозначенні c — це множина S = {(x, y, z) : F(x,y,z) = c}. Приклади:
- Метакуля: F(x,y,z) = Σ rᵢ² / (|p − pᵢ|²) з ізозначенням c = 1; поверхня — там, де внески дають у сумі 1.
- Поле знакової відстані (SDF): F дає знакову відстань до найближчої поверхні; ізоповерхня на c = 0 — це сама поверхня.
- Густина тканини на МРТ: F(x,y,z) = одиниця Гаунсфілда вокселя; ізоповерхня на c ≈ 400 HU виділяє кістку.
- Множина рівня рідини: ϕ = 0 — це межа повітря-вода; від'ємне ϕ — внутрішня частина рідини.
Усі вони породжують ізоповерхні, які не можна растеризувати напряму — їх спершу треба перетворити на явну трикутну сітку.
2. Воксельна сітка
Marching Cubes семплює скалярне поле на регулярній 3D-сітці з вокселів (об'ємних пікселів). Кожен воксель — це куб із 8 кутовими семплами. Алгоритм обробляє по одному кубу за раз — «марширує» крізь кожен куб у сітці:
3. Таблиця пошуку на 256 випадків
За 8 кутів, кожен з яких можна класифікувати як всередині чи зовні, існує 2⁸ = 256 унікальних конфігурацій кутів. Проте комплементарність та обертальна симетрія зводять їх лише до 15 принципово різних випадків:
- Усі зовні: жодного трикутника.
- Один кут усередині: 1 трикутник.
- Одне ребро всередині: 1 трикутник (інша орієнтація).
- Два сусідні кути: 2 трикутники.
- Два протилежні кути на одній грані: 2 трикутники (S-подібна форма).
- Два діагонально протилежні кути: 2 трикутники (з перетином).
- Три кути на одній грані: 2 трикутники + 1.
- Три кути L-подібно: 3 трикутники.
- Уся грань усередині: 2 трикутники, що утворюють чотирикутник.
- Грань + сусідній кут: 3 трикутники.
- Дві грані: 4 трикутники.
- S-подібна діагональ: 4 трикутники.
- Три грані: 4 трикутники.
- Майже повний (7 кутів): 1 трикутник.
- Усі всередині: жодного трикутника.
Усі 256 випадків породжуються застосуванням 15 базових випадків під
обертаннями та відображеннями. Отримана
triTable[256][16] кодує, які ребра утворюють кожен трикутник
(індекси ребер 0–11; −1 завершує список).
4. Трилінійна інтерполяція
Marching Cubes розміщує вершини трикутників не у кутах сітки, а в інтерпольованих точках перетину на кожному ребрі. Для ребра між кутами i та j зі скалярними значеннями vᵢ та vⱼ:
function interpolateEdge(p1, p2, v1, v2, iso) {
if (Math.abs(v1 - iso) < 1e-5) return p1;
if (Math.abs(v2 - iso) < 1e-5) return p2;
const t = (iso - v1) / (v2 - v1);
return {
x: p1.x + t * (p2.x - p1.x),
y: p1.y + t * (p2.y - p1.y),
z: p1.z + t * (p2.z - p1.z)
};
}
5. Неоднозначні випадки та MC33
Оригінальний marching cubes 1987 року має неоднозначні конфігурації граней: коли протилежні кути однієї грані обидва всередині (або обидва зовні), існує два топологічно різні способи тріангулювати куб, і наївна таблиця пошуку може обрати неузгоджено — спричиняючи дірки в кінцевій сітці.
MC33 (Черняєв, 1995) розширює таблицю пошуку до 33
різних випадків, задаючи узгоджену стратегію усунення неоднозначності
граней. Він гарантує топологічно коректну сітку без дірок. Більшість
промислових реалізацій (OpenVDB, VTK, Three.js
MarchingCubes) використовують таблиці MC33.
6. Обчислення нормалей поверхні
Гладкі нормалі критично важливі для затінення. Два підходи:
Нормалі на основі градієнта
Нормаль до ізоповерхні в точці p пропорційна градієнту скалярного поля: n̂ = ∇F / |∇F|. Наближайте градієнт центральними різницями на воксельній сітці:
Плоскі нормалі граней
Візьміть векторний добуток двох ребер трикутника: n = (v₁ − v₀) × (v₂ − v₀). Швидко, але дає гранчастий вигляд на сітках низької роздільної здатності.
7. Застосування
- Медична візуалізація: об'ємні набори даних КТ/МРТ реконструюються у 3D-сітки для хірургічного планування та візуалізації (ITK-SNAP, 3D Slicer, VTK).
- Симуляція рідин: симулятори рідин на основі множин рівня (OpenVDB, Houdini FLIP) запускають marching cubes щокадру, щоб виділити сітку поверхні рідини для рендерингу.
- Генерація ландшафту: воксельні ігри (рушії в стилі Minecraft) використовують модифікований marching cubes для гладкого ландшафту з навісами та печерами, неможливими в ландшафті на основі карти висот.
- Метакулі: органічні, краплеподібні форми для оснастки анімації персонажів та спецефектів — класичний ефект демосцени зі злиттям сфер.
- Нейронні SDF: NeRF та нейронні мережі неявних поверхонь (NeuS, VolSDF) видають поля знакової відстані, які marching cubes перетворює на сітки для конвеєрів рендерингу на основі сіток.