Лекция 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 Псевдо-глобальное Первую сетку/поверхность храним всегда pplanes(v) (v K p v ) T pplanes(v) v( K p pplanes(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