Quantized-mesh представляет собой специализированный формат хранения данных рельефа, ориентированный на эффективную передачу и визуализацию глобальных и локальных поверхностей в WebGL-рендерерах. Основная идея заключается в том, чтобы заменить классические heightmap-растры треугольной сеткой, где координаты вершин квантованы до целочисленного диапазона, что позволяет значительно сократить объём данных при сохранении геометрической точности после декодирования на клиенте.
Каждый тайл представляет собой независимый фрагмент поверхности, описанный набором вершин, индексов треугольников, метаданных об ограничивающих объёмах и вспомогательных структур для сшивки соседних тайлов.
В основе формата лежит квантование координат в диапазон фиксированной битности, чаще всего 16 бит на каждую компоненту внутри тайла.
Для каждой вершины хранятся нормализованные координаты:
где:
Декодирование выполняется на стороне клиента:
x = x_min + u * (x_max - x_min) y = y_min + v * (y_max - y_min) z = h_min + h * (h_max - h_min)
Такое представление позволяет:
Геометрия тайла хранится в виде индексированного буфера треугольников. Индексы задают порядок обхода вершин, формируя непрерывную поверхность.
Особенности индексации:
Дополнительно вводятся специальные индексы для “skirt”-геометрии — вертикальных полос по краям тайла, предотвращающих появление щелей между уровнями детализации.
Skirt-геометрия представляет собой расширение края тайла вниз по оси высоты. Она добавляется как дополнительный набор вершин и треугольников вдоль границ сетки.
Назначение:
Skirt вершины создаются путём дублирования граничных вершин с искусственным снижением высоты:
z_skirt = z_original - δ
где δ — фиксированное смещение вниз, зависящее от масштаба тайла.
Каждый quantized-mesh тайл содержит набор служебной информации:
Используется для отсечения невидимых тайлов на этапе culling.
Формы представления:
Bounding sphere задаётся как:
Для ускорения глобального рендеринга используется horizon-based culling. Каждый тайл хранит данные, позволяющие оценить его потенциальную видимость относительно горизонта камеры.
Это позволяет:
Для корректного соединения тайлов различного уровня детализации используются маски границ:
Каждая грань может содержать набор индексов, которые используются для stitching алгоритмов между родительскими и дочерними тайлами.
Нормали поверхности часто хранятся в сжатом виде с использованием octahedral encoding.
Идея заключается в проекции единичного вектора нормали на октаэдр с последующей нормализацией в 2D пространство:
Восстановление:
nz = sqrt(1 - nx² - ny²)
После декодирования получается полноценная нормаль для освещения.
Такой метод обеспечивает:
Типичный quantized-mesh файл содержит бинарную структуру:
Header фиксирует смещения секций и версию формата.
Water mask используется для различения суши и водных поверхностей в рендеринге.
Представляет собой растровый слой низкого разрешения, где:
Маска применяется в шейдерах для:
Quantized-mesh тесно связан с quadtree-структурой.
Каждый тайл имеет:
LOD выбирается на основе:
Error metric обычно вычисляется как максимальное отклонение между упрощённой и детальной поверхностью.
В CesiumJS quantized-mesh используется в terrain provider слоях.
Процесс загрузки:
CesiumJS автоматически управляет:
Декодирование выполняется полностью в JavaScript и WebGL пайплайне.
Ключевые этапы:
Оптимизация достигается за счёт:
Основной компромисс формата — баланс между размером и точностью.
Источники ошибки:
Ошибка контролируется через:
Сильные стороны:
Ограничения: