E57 "PDF облаков точек" один открытый файл, который хранит миллионы измеренных 3D-точек, их цвета и панорамные фотографии, которые идут вместе с ними.
База знаний · форматы файлов

E57, объяснение: "PDF облаков точек"

Представьте, что вы фотографируете комнату — но вместо плоского снимка вы фиксируете точное положение миллиона крошечных точек, покрывающих каждую стену, стул и чашку кофе. Если быстро вращать лазер и измерять, как далеко находится всё вокруг, получится облако точек — 3D "фотография" из измеренных точек. Это дружелюбный, без жаргона обзор того, что на самом деле находится внутри файла E57 — и одного удобного приёма, который наше ПО делает с ним.

Зачем вообще нужен специальный формат?

Обычная фотография — это всего лишь сетка цветных пикселей, просто. 3D-скан устроен сложнее. Для каждого из миллионов точек нужно сохранить где она находится в пространстве (три числа: X, Y, Z), какого цвета она, с какой силой лазер отразился обратно (её интенсивность — представьте чёрно-белую "лазерную фотографию") и часто панорамные фотографии, которые сканер сделал одновременно.

Теперь представьте: один человек сканирует с помощью Faro, коллега использует Leica, а клиент открывает результат в ПО Autodesk. Три устройства, три программы — и всем им нужно уметь читать один и тот же файл спустя годы, не выпрашивая у производителя секретный декодер. Именно эту проблему решает E57. Это открытый, нейтральный по отношению к производителю стандарт (опубликованный как ASTM E2807 и основанный на библиотеке с открытым исходным кодом libE57). Его называют "PDF облаков точек": один переносимый файл, который все умеют читать.

Главная идея: текстовая карта с бинарной мощью

По сути, файл E57 — это гибрид двух очень разных вещей, соединённых вместе: небольшого фрагмента XML — обычного, читаемого человеком текста, который служит оглавлением — и больших блоков бинарных данных, хранящих сырые миллионы чисел в компактном виде ради скорости.

Анатомия файла E57 один файл = маленький заголовок + большие бинарные блоки + текстовое "оглавление" в конце Заголовок 48 байт Данные точек (бинарные) миллионы X, Y, Z + цвет Изображения (бинарные) встроенные панорамы JPEG / PNG XML-раздел читаемая "карта" всего этого начало файла конец файла заголовок точно записывает, где начинается XML-карта (xmlPhysicalOffset) ПО сначала открывает заголовок на 48 байт — там сказано: "карта находится по байту N". Оно переходит к XML-карте, читает, что внутри, а затем сразу прыгает к нужному бинарному блоку. Не нужно читать гигабайты, чтобы найти один скан — карта делает доступ мгновенным.
Файл E57 читается с конца: заголовок на 48 байт указывает на XML "карту" в конце, а та, в свою очередь, сообщает, где находится каждый бинарный блок.

Зачем помещать карту в конец? Потому что во время записи файла сканер ещё не знает, какого размера всё получится, поэтому сначала передаёт сырые данные, а уже потом, когда всё готово, записывает аккуратное резюме. Выгода огромна: чтобы извлечь один скан из файла на 20 гигабайт, ПО читает крошечный заголовок, переходит к XML-карте, находит строку "скан #3 находится по байту 4 812 000 000" и сразу прыгает туда.

Незаметная страховка: весь файл разбит на "страницы" по 1024 байта, и каждая страница резервирует последние 4 байта под контрольную сумму — отпечаток, который позволяет ПО заметить, если файл был повреждён.

Всё держится на одном корне

Откройте эту XML-карту, и вы увидите дерево — совсем как папки на компьютере. Есть один root, а две ветви делают основную работу: data3D, нумерованный список сканов, и images2D, нумерованный список фотографий (обычно это панорамы 360°, снятые сканером).

Дерево E57: всё держится на одном корне XML-раздел — это дерево папок: откройте корень и доберитесь до любого скана или фото root data3D список сканов [ scan 0, scan 1, ... ] метаданные кто / когда система координат images2D список фотографий [ pano 0, pano 1, ... ] scan 0 точки + pose scan 1 … points prototype X Y Z · R G B · intensity pose = где стоял сканер позиция (x,y,z) + вращение (кватернион) у каждой фотографии тоже есть своя pose, чтобы просмотрщик знал, куда её поместить
У каждого скана и фотографии есть своя pose — положение сканера плюс направление взгляда (хранящееся как кватернион) — и именно это позволяет нескольким сканам складываться в одну выровненную модель.

Два способа записать точку

Лазерный сканер на самом деле не мыслит в X, Y, Z. Он стоит в одной точке и вращается, и для каждой точки знает три вещи: дальность (как далеко прошёл луч), азимут (насколько вокруг, влево-вправо) и угол места (насколько вверх или вниз). Это сферические координаты — родной язык сканера. Большинство программ, однако, предпочитает обычные декартовы X, Y, Z. E57 спокойно хранит и то и другое, а перевод между ними — это немного быстрой тригонометрии.

Два способа записать точку сканер мыслит углами & расстоянием — E57 может хранить точки любым способом Сферические — как видит датчик сканер точка дальность (расстояние) азимут (влево-вправо) + угол места (вверх-вниз) дальность · азимут · угол места естественно для вращающегося лазерного сканера декартовы — как этого хочет ПО Z X Y точка X · Y · Z простые координаты сетки, понятные всем быстро тригонометрия
Точки находятся в компактной таблице, которую E57 называет CompressedVector: XML один раз задаёт столбцы (X, Y, Z, цвет, интенсивность...), а затем бинарный блок хранит строка за строкой плотно упакованные значения.

Три вида встроенных фотографий

Фотографии в images2D — это не ссылки на файлы в какой-то папке: настоящий JPEG или PNG спрятан прямо внутри E57. И встроенные фотографии бывают не одного вида. E57 упаковывает каждую в "представление", которое сообщает ПО, насколько можно доверять изображению с геометрической точки зрения. Разница сводится к одному вопросу: насколько полно описана камера?

Три способа, которыми E57 хранит фотографию один и тот же файл, три "представления" — они отличаются тем, насколько подробно описана камера sphericalRepresentation полная панорама 360° × 180° натянутая на сферу Измеримая ✓ каждый пиксель = известное направление от сканера это "посмотреть вокруг отсюда" панорама, которую делают большинство сканеров pinholeRepresentation объектив плоская фотография Измеримая ✓ одна обычная фотография с объективом, полностью откалибрована фокусное расстояние + размер сенсора позволяют ПО знать угол каждого пикселя visualReferenceRepresentation просто картинка Не для измерений ✗ вообще без модели камеры - исключительно для человеческого глаза "вот как выглядело место " — миниатюра, фото с места
Удобная деталь: одна запись изображения может содержать и точный растр (точечный или сферический), и простую версию для визуальной справки — так просмотрщик показывает дружелюбную картинку, сохраняя измеряемую для расчётов.
  • sphericalRepresentation — полная панорама 360° × 180°, знакомое растянутое эквиректангулярное 2:1 изображение. Поскольку проекция известна, каждый пиксель соответствует точному направлению, поэтому оно идеально совпадает с облаком. Это основной путь в нашем конвейере: мы читаем его, приводим холст к чистому 2:1 и передаём в просмотрщик панорам.
  • pinholeRepresentation — одна обычная фотография с объективом, описанная классической моделью камеры-обскуры (фокусное расстояние, размер сенсора, оптический центр). Этого достаточно, чтобы ПО знало и направление каждого пикселя, только в более узком поле зрения. На практике именно так чаще всего работает Leica: она записывает готовый cubemap — шесть плоских граней куба, смотрящих наружу, — прямо в E57, а наш путь по граням куба точно собирает их в полную панораму. Это один из самых простых случаев, чтобы снова получить чистое изображение 360°.
  • visualReferenceRepresentation — фотография без какой-либо модели камеры, прямо "только для человеческого глаза". С ней нельзя проводить измерения или проецировать её на облако; это лишь референсный снимок. Наш импортёр сохраняет такие изображения как вложенные комментарии, а не размещает их в 3D.

Вот в чём загвоздка. sphericalRepresentation — популярный вариант, но его удивительно легко слегка испортить — именно поэтому один и тот же скан может выглядеть по-разному в разных программах.

  • Слепые зоны обрезаются. У каждого сканера есть место, которое он не может видеть — обычно прямо вниз, где стоит его собственный штатив. Некоторые экспортеры просто обрезают панораму там, оставляя разрыв или нестандартную высоту.
  • Прямоугольные пиксели. У чистой панорамы пиксели квадратные (pixelWidth = pixelHeight); в некоторых файлах это не так, поэтому изображение выглядит растянутым, пока его не масштабируют.
  • Неверное направление — это “forward”. Поворот, сохранённый вместе с панорамой, показывает, какое направление находится в центре изображения, и нет единого соглашения о том, что вообще означает “forward” — одни экспортеры направляют его на север, другие на восток. Малейшая ошибка здесь поворачивает весь вид.
  • Инструменты редактирования могут терять данные. Например, при обратной записи E57 через CloudCompare может пропасть позиция съёмки изображений pinholeRepresentation — фотографии сохраняются, но уже не знают, где были сняты.

Итог такой: в реальности разное ПО часто показывает один и тот же E57 по-разному. Наш импортёр старается сгладить типичные особенности — сделать прямоугольные пиксели квадратными, исправить ориентацию панорамы и привести холст к формату 2:1 — чтобы тур выглядел правильно, независимо от того, какой инструмент записал файл.

Когда панорама встроена прямо в само облако точек

Вот одна из самых элегантных — и наименее оценённых — идей во всём формате. Помимо панорам, хранящихся как отдельные изображения, панорама может скрываться в самом облаке точек. Лазерный сканер не стреляет случайно — он проходит аккуратную сетку углов, строка за строкой, столбец за столбцом, как старый телевизор, рисующий экран. E57 может сохранить этот порядок: каждой точке присваиваются rowIndex и columnIndex, показывающие, из какой ячейки сетки она пришла. Скан, сохранённый таким образом, называется структурированным.

Когда панорама встроена в облако точек "структурированный" скан хранит свои точки на сетке — так что облако уже является изображением скан в том виде, как он хранится: строки × столбцы столбец → азимут (0° ... 360° вокруг) строка → угол места (вверх ... вниз) небо: лазер ничего не задел фиктивные точки-заполнители (дальность = 0 / "нет отражения") читать сетку по порядку = пиксели → мгновенная панорама 2:1, без перепроекции ширина сетки (columnMaximum + 1) = ширина панорамы Поскольку каждая точка помнит свои rowIndex и columnIndex, изображение и 3D-геометрия — это один и тот же объект. Фиктивные точки неба — это цена за то, чтобы сетка оставалась идеальным прямоугольником: настоящее ПО умеет их пропускать.
В структурированном скане облако и панорама — это один и тот же объект: изображение — не отдельная фотография, а сама структура расположения точек.

Преимущество в том, что если точки лежат на сетке, облако уже является изображением. Читайте его строка за строкой, и каждая точка попадает в пиксель — панорама возвращается вообще без хитрой перепроекции. Файл даже записывает размер сетки в indexBounds (columnMaximum, rowMaximum), так что программа заранее знает разрешение — наш синтезатор берёт ширину вывода прямо из columnMaximum + 1.

Но сетка должна быть идеальным прямоугольником, а реальный мир — нет. Что делать с направлениями, где луч ушёл в открытое небо и ничего не вернулось? Ответ прагматичен: заполнить эти ячейки фиктивными точками — очень часто с дальностью ровно 0, то есть "луч отправлен, ничего не попало". Они сохраняют целостность прямоугольника, но не являются реальной геометрией, поэтому внимательный читатель должен их отбрасывать. Наш просмотрщик помечает каждую точку с нулевой дальностью, уводит её на фиктивно далёкое расстояние, чтобы математика сетки продолжала работать, и никогда не принимает эти фантомные точки неба за реальные поверхности, когда строит карту глубины или экспортирует облако.

Превратить скан обратно в фотографию, в которую можно войти

Не каждый скан приходит в виде готовой сетки — некоторые представляют собой просто рыхлую, неструктурированную россыпь точек. Хорошая новость: панораму всё ещё можно восстановить, и именно здесь формат встречается с нашей собственной работой. Ведь скан — это по сути "полная сфера точек, измеренных как углы вокруг одной точки", так что его можно развернуть в плоскую панораму.

От облака точек к фотографии, в которой можно осматриваться хитрость этого проекта: развернуть сферу точек в плоскую панораму 1 · скан окружает вас у каждой точки есть угол от центра развернуть 2 · углы становятся плоской сеткой вверх ↕ вниз ← полный 360° слева направо → заполнить пробелы 3 · три изображения цветная панорама интенсивность (ч/б) карта глубины Облако точек — это панорама: измеренное в углах, оно разворачивается в плоское изображение 2:1. Цвет раскрашивает пиксели, интенсивность лазера даёт чёткое изображение в оттенках серого, а расстояние превращается в карту глубины.
Одно облако, три изображения: цвет раскрашивает пиксели, лазерная интенсивность даёт чёткую, безтеневую шкалу серого, а расстояние превращается в карту глубины — именно это делает плоскую панораму измеримой и проходимой.

Зафиксируйте угол каждой точки, пустите слева-направо по ширине изображения и сверху-вниз по его высоте, и каждая точка попадёт в пиксель — знакомую растянутую эквиректангулярную 2:1 панораму. Карта глубины — это магический ингредиент: когда за каждым пикселем есть расстояние, плоская на вид панорама становится измеримой и проходимой — щёлкните две точки на стене, и ПО узнает реальное расстояние, потому что оно никогда не забывает о лежащих под ней 3D-данных.

Так почему же E57 важен?

Потому что это нейтральная точка встречи. Геодезист сканирует мост оборудованием одной марки, инженер открывает его в другом ПО, а архитектор архивирует его на следующие двадцать лет — и E57 это единый файл, на который все трое могут положиться, без какого-либо вендора, держащего ключи. Он хранит цвет, интенсивность, геометрию, панорамы и особенно важные позиции датчика вместе в одном месте, как открытый стандарт, который может реализовать любой.

И ещё один любопытный факт: время съёмки внутри E57 считается в GPS-времени — в секундах с 6 января 1980 года, момента, когда включились часы спутников GPS, — а не от обычной компьютерной эпохи 1970 года. Ошибитесь здесь, и скан, сделанный сегодня, будет выглядеть так, будто он произошёл в 2013 году.

Хотите узнать больше?

  • libE57.org — эталонная библиотека с открытым исходным кодом и родной дом формата.
  • ASTM E2807 — официальный стандарт.
  • libE57Format · Image2D — точные определения сферического, точечного и визуально-справочного представлений.
  • Paul Bourke’s E57 notes — краткий технический разбор заголовка и структуры.
ИИ-ассистент
Здравствуйте! Задавайте любые вопросы о виртуальных турах, облаках точек, 3D Gaussian Splatting, 3D-моделях, использовании сайта, оплатах и не только. Я либо найду ответ, либо передам ваш вопрос нашей службе поддержки.
Наш ИИ не смог ответить на Ваш вопрос. Наша служба поддержки будет рада ответить на Ваш вопрос. Просто укажите Ваш адрес электронной почты. Мы не используем электронную почту для рассылки новостей. Только для того, чтобы ответить на Ваш вопрос.