Matrix трансформации

В трёхмерной графике CesiumJS матричные преобразования формируют базовый механизм описания положения, ориентации и масштаба объектов в пространстве. Любая сцена, построенная поверх глобуса, сводится к последовательному применению матриц, связывающих локальные системы координат объектов с глобальной геоцентрической системой.

В основе лежит использование однородных координат, где трёхмерная точка представляется как вектор (x, y, z, 1). Это позволяет объединять повороты, переносы и масштабирование в единую операцию умножения матрицы 4×4 на вектор.

Ключевое свойство матричных преобразований — композиционность:

  • последовательное применение преобразований эквивалентно умножению матриц
  • порядок умножения критически важен
  • результат зависит от системы координат и соглашений о правосторонней/левосторонней системе

CesiumJS использует правостороннюю систему координат с геоцентрической моделью Earth-Centered, Earth-Fixed (ECEF), где оси привязаны к вращающейся Земле.


Matrix3: базовые линейные преобразования

Matrix3 в CesiumJS предназначена для операций в трёхмерном пространстве без учёта переноса. Она применяется для:

  • поворотов
  • масштабирования
  • анизотропных деформаций
  • преобразований нормалей

Типичная структура:

  • 3 строки × 3 столбца
  • хранение в column-major порядке
  • оптимизация под WebGL-совместимые вычисления

Основные сценарии использования:

Повороты

Матрицы вращения часто формируются из:

  • углов Эйлера
  • кватернионов (Quaternion)
  • направляющих векторов

В CesiumJS поворот чаще всего вычисляется через кватернионы и затем конвертируется в Matrix3, поскольку это снижает риск gimbal lock и обеспечивает стабильную интерполяцию.

Нормальные матрицы

При освещении поверхностей используется обратная транспонированная матрица:

  • нормали нельзя трансформировать обычной Matrix4
  • требуется корректное сохранение углов между поверхностями и светом

Matrix4: полные пространственные преобразования

Matrix4 — основная матрица трансформаций в CesiumJS, объединяющая:

  • перенос (translation)
  • поворот (rotation)
  • масштаб (scale)
  • перспективные и аффинные преобразования

Она используется во всех уровнях сцены:

  • модели
  • примитивы
  • entity-объекты
  • камеры

Структура Matrix4:

  • 4×4 элементы
  • column-major порядок
  • последняя строка фиксирована для однородных координат

Классическая форма:

| R11 R12 R13 Tx |
| R21 R22 R23 Ty |
| R31 R32 R33 Tz |
|  0   0   0   1 |

где R — матрица вращения, T — перенос.


Географическая привязка и ECEF

В CesiumJS ключевым этапом является переход из географических координат (широта, долгота, высота) в ECEF:

  • ось X — пересечение экватора и нулевого меридиана
  • ось Y — 90° восточной долготы
  • ось Z — северный полюс

Этот переход осуществляется через трансформации, возвращающие Matrix4.

Примеры таких преобразований:

  • локальная система объекта → ECEF
  • ECEF → локальная East-North-Up (ENU)

Локальные системы координат

CesiumJS активно использует локальные системы:

East-North-Up (ENU)

Оси:

  • X: восток
  • Y: север
  • Z: вверх относительно эллипсоида

Матрица создаётся функциями трансформаций и применяется для:

  • размещения объектов на поверхности Земли
  • ориентации камер
  • локальных сцен

North-East-Down (NED)

Используется в авиационных и навигационных моделях:

  • X: север
  • Y: восток
  • Z: вниз

Transformations API

Модуль Transforms предоставляет набор функций, возвращающих Matrix4:

  • преобразования между географическими системами
  • локальные ориентированные матрицы
  • временные динамические трансформации

Ключевые операции:

EastNorthUpToFixedFrame

Формирует матрицу, переводящую локальные координаты в ECEF:

  • точка на поверхности Земли задаёт центр
  • оси выравниваются по касательной плоскости эллипсоида

HeadingPitchRoll

Ориентация объекта через три угла:

  • heading — поворот вокруг оси Z (вверх)
  • pitch — наклон
  • roll — крен

Эти параметры преобразуются в кватернион, затем в матрицу поворота.


Композиция трансформаций

Ключевой принцип CesiumJS — последовательное умножение матриц:

M = T × R × S

где:

  • T — перенос
  • R — вращение
  • S — масштаб

Порядок важен: изменение порядка приводит к различным результатам.

Типичные сценарии:

Локальная ориентация объекта

  1. масштабирование модели
  2. поворот
  3. перенос в мировое пространство

Иерархия объектов

Дочерние объекты наследуют матрицу родителя:

M_child_world = M_parent_world × M_child_local

Камера и view matrix

Камера в CesiumJS управляется через обратную матрицу трансформации:

  • позиция камеры
  • направление взгляда
  • вектор вверх

View matrix переводит мировые координаты в систему наблюдателя.

Основные компоненты:

  • eye (позиция)
  • target (точка взгляда)
  • up (вектор вертикали)

Проекционные матрицы

Для отображения сцены используется projection matrix:

  • перспективная проекция
  • ортографическая проекция

Перспективная матрица учитывает:

  • поле зрения
  • соотношение сторон
  • ближнюю и дальнюю плоскости отсечения

Итоговая цепочка:

clipPosition = Projection × View × Model × position

Динамические матрицы во времени

CesiumJS поддерживает временные трансформации:

  • вращение Земли
  • орбитальные движения спутников
  • анимации моделей

Матрицы пересчитываются на каждом кадре с учётом:

  • текущего времени
  • эпhemeris данных
  • интерполяции состояний

Оптимизация вычислений

Матричные операции в CesiumJS оптимизированы:

  • переиспользование буферов памяти
  • минимизация аллокаций
  • SIMD-оптимизации в WebGL pipeline
  • кеширование часто используемых трансформаций

Особое внимание уделяется:

  • сокращению количества умножений матриц
  • предварительному вычислению статических преобразований
  • хранению матриц в формате, совместимом с GPU

Связь с кватернионами

Кватернионы используются как промежуточное представление:

  • компактнее матриц
  • стабильнее при интерполяции
  • быстрее для анимации

Переход:

Quaternion → Matrix3 → Matrix4

Кватернионы применяются в:

  • ориентации камер
  • поворотах моделей
  • плавной анимации движения

Иерархия преобразований в сцене

Сцена CesiumJS строится как дерево трансформаций:

  • глобальная система (ECEF)
  • сцена
  • сущности (Entity)
  • графические примитивы
  • геометрические под-объекты

Каждый уровень добавляет собственную матрицу, формируя итоговое положение в пространстве через цепочку умножений.


Практическая структура вычислений

В типичном кадре выполняется:

  1. вычисление матрицы модели
  2. получение view matrix камеры
  3. получение projection matrix
  4. композиция MVP
  5. передача в GPU

Каждый объект сцены проходит один и тот же конвейер, независимо от сложности геометрии.


Геометрические ограничения

Матричные преобразования в CesiumJS учитывают:

  • численную стабильность при больших координатах
  • масштаб Земли (радиус ~6371 км)
  • потерю точности при работе в глобальном масштабе

Для минимизации ошибок используются:

  • локальные системы координат
  • разбиение сцены на тайлы
  • double precision вычисления в критических участках