v - arraypointsprocessingproject

advertisement
Лекция 2.
Упрощение сеток
Высокопроизводительные методы
геометрического моделирования
Михаил Бессмельцев
к.ф.-м.н. Ольга Нечаева
Simplification
Упрощение
12,000
2,000
300
Зачем упрощать сетки?

Уменьшать количество информации



для передачи и хранения сеток
Ускорять рендеринг (отрисовку)
Контролировать разрешение модели
error
Level of Detail (LOD)
Уровень Детализации


Подробная сетка для близких объектов
Грубая для далёких
Progressive Meshes
Прогрессивные сетки

Упрощать за один шаг

Mn
Приоритет: качество
Mc
Mc
1
10,103
ver

13,133
ver
Mc
2
8903 ver
503 ver
Упрощать постепенно (Прогрессивные сетки)

Приоритет: скорость
Mn
13,133 ver
Mc
1
10,103 ver
Mc
2
8903 ver
Mc
3
503 ver
M0
489 ver
3
Progressive Meshes
Прогрессивные сетки

Hoppe, 1996

Подробная сетка - это самая грубая сетка + история,
как с ней такое сделали (вся последовательность
операций упрощения)
Качество сеток (например, углы)
Mn (12,946 faces)
192 faces
1,070 faces
PM (200 faces)
PM (1,000 faces)
Методология
Методология

Упрощение – последовательность локальных
операций



Каждая операция затрагивает только несколько соседних
вершин
Каждая операция влияет на ошибку аппроксимации
Каждый раз находим и применяем операцию, которая
влечет к наименьшей ошибке
Операции: удаление вершины

Удаление вершины



v = v-1;
f = f -2;
Новое множество вершин – подмножество старого
Operations: Edge Collapse
Операции: Коллапс ребра

Коллапс ребра (Edge collapse)



v = v -1;
f = f - 2;
Вершины двигаются!
Operations: Pair contraction
Операции: Слияние пары

Вершины двигаются!
Контроль ошибки

Локальная ошибка




Быстро считать
Нужно мало памяти
Можно накапливать
Глобальная ошибка: сравнить что получилось с тем,
что было




Медленно
Зато точнее контролируем ошибку
Можно использовать в качестве условия останова
Необходимо помнить начальную сетку
Измерение ошибки упрощения

Меры



Расстояние до плоскости
Кривизна
Обычно аппроксимируется


Средняя плоскость
Дискретная кривизна
Основной алгоритм упрощения

Repeat




Найти элемент с минимальной ошибкой
Выполнить операцию (удаление или слияние)
Пересчитать ошибку
Пока не достигнут нужный размер / качество сетки
Детали реализации

Структура данных сетки


Такая, чтобы было просто обходить соседей
Очередь с приоритетами (например, куча)

Быстрый доступ к элементу с минимальной ошибкой



В случае кучи: Θ(1) для нахождения максимума
O(log n) для извлечения максимума
Быстрое добавление

Для кучи: O(log n)
Алгоритм удаления вершин
Алгоритм удаления вершин



Операция упрощения: удаление вершины
Мера ошибки: расстояние до плоскости
Можно предохранять особенности сетки
Сохранение особенностей модели

Оригинал (1972 вершины):
Сохранение особенностей модели

Результат упрощения (200 вершин)
Сохранение особенностей модели

Результат умного упрощение (те же 200 вершин)
Топологически корректный
алгоритм упрощения
Schroeder et al. 1992
Алгоритм удаления вершин



Исследовать локальную топологию/геометрию
Посмотреть, какие вершины можно удалять
Повторять




Удалить вершину
Триангулировать образовавшуюся дырку
Обновить ошибку нужных вершин
Пока не выполнено условие упрощения (например,
на размер сетки)
Локальная топология и геометрия
Граничная
Внутренняя
Простая
Сложная
Угловая
Локальная топология и геометрия

Простые вершины можно еще
классифицировать:




if (двугранный угол между соседними
треугольниками > FeatureAngle),
then их общее ребро – характерное ребро
Внутренняя
Если вершина принадлежит двум
характерным рёбрам, то это внутренняя
вершина.
Если трём или больше, то это угловая
вершина.
Угловая
Критерий удаления


Пользователь задаёт Emax
Простая вершина


Расстояние от неё до средней плоскости < Emax
Граничная вершина

Расстояние от вершины до нового граничного ребра < Emax
Расстояние
Триангулирование дырки

После удаления вершины образуется неплоская дырка
(непланарный цикл)




2D алгоритмы в общем случае не сработают
Рекурсивно разбивать дырку
Следить за качеством получаемой триангуляции
Триангуляция может не сработать

Тогда не удаляем вершину
Плюсы и минусы


Эффективный
Легко запрограммировать и использовать

Немного параметров для настройки

Неплохая аппроксимация
Работает на очень больших сетках
Выбирает из начального мн-ва вершин (не двигает)

Ошибка не ограничена



Т.к. ошибка меряется только локально
Алгоритм коллапса рёбер
Где и как используются
структуры данных для сеток?



Операция упрощения: коллапс ребра
Мера ошибки: расстояние, псевдоглобальное
Также упрощает топологию
Мера расстояний: Квадрика

Найти точку, ближайшую к
множеству плоскостей

Сумма расстояний до множества
плоскостей – это квадратичная
форма – а значит, у нее есть
минимум
Мера расстояний: Квадрика

Плоскость



Ax + By + Cz + D = 0, где A2 + B2 + C2 = 1
p = [A, B, C, D], v = [x, y, z, 1], v pT = 0
Выражается в виде квадратичной формы
p(v) = (v pT)2 = (v pT) (p vT) = v (pTp) vT = v KP vT
KP =
 A 2 AB AC AD 


2
AB
B
BC
BD


 AC BC C 2 CD 

2 
AD BD CD D 
Расстояние до множества плоскостей
 ( v) 
  p ( v)

После того, как v1 и v2
сливаются в v,

Qv  Qv1+Qv2

Псевдо-глобальное
Первую сетку/поверхность
храним всегда
pplanes(v)

 (v K p v )
T
pplanes(v)
 v(
K
p
pplanes(v)
 v Q v vT
)v
T

Слияние двух вершин

Цель: Пусть дано ребро e = (v1,v2), найти вершину v =
(x,y,z,1) «слияния», которая минимизирует функцию
(v):
/x = /y = /z = 0

Для этого нужно решить следующую СЛУ:
 q11 q12
q
 21 q 22
q 31 q 32

0
0

q13
q 23
q 33
0
q14 
0 
0 
q 24 
v 
0 
q 34 

 
1 
1
Если решения нет, то выбираем середину
Слияние двух вершин


Выбирать ребра из сетки
Или вершины, которые находятся близко – с заданным
порогом
T
Алгоритм





Посчитать QV для всех вершин сетки
Найти все нужные пары вершин
Для каждой нужной пары (v1,v2) вычислить
оптимальную вершину для слияния и её ошибку (v)
Разместить все пары в очереди с приоритетами (в
соответствии с (v))
Пока не выполняется условие останова


Склеить ребро (v1,v2) с наименьшей ошибкой в v
Обновить очередь
Пример
Dolphin (Flipper)
Original - 12,337 faces
2,000 faces
300 faces (142 vertices)
Тоже пример

Упрощение сеток
12,000
2,000
300
Плюсы и минусы






Ошибка ограничена
Можно упрощать топологию
Получаются сетки высокого качества
Довольно эффективный
Проблемы с границами
Добавляет вершины, которых не было в оригинальной
сетке
Вопросы?

Вся информация по спецкурсу + презентации +
текущие баллы выкладываются на
http://aitricks.com/ru/research/course
Download