Обновлено 13 сентября 2026 г.
Что сохраняет 3D-конвертация и во что это оборачивается
Преобразование сетки не бывает бесплатным и не является операцией без потерь. GLB и glTF сохраняют всё. OBJ сохраняет отдельные объекты и их названия материалов, но отбросит цвет по вершине. STL сохраняет только треугольники. PLY сохраняет цвет по вершине, но объединяет сцену в одну сетку. USDZ сохранил оба объекта и UV, потерял цвет по вершине и названия материалов при повторном чтении, и записывает zip-файл USDA. Числа ниже измерялись, а не оценивались.
Каждое число на этой странице получено путем выполнения того же конвертера, который использует этот сайт, с реальными файлами, и путем чтения атрибутов непосредственно из байтов, которые он записал. Измерено с 13 сентября 2026 г. с помощью three.js r179. Метод описан в конце страницы, а скрипт находится в репозитории.

Что сохраняет каждый формат?#
Сцена для справки с двумя кубами с разными именами, каждый с собственным металлическим материалом с именем, цветом по вершинам, UV-координатами и нормалями, была конвертирована в шесть форматов. GLB и glTF вернулись полностью. Все остальные форматы что-то потеряли, и каждый потерял что-то разное.
| Назначение | Два объекта | UV-координаты | Цвет по вершине | Названия материалов | Количество вершин |
|---|---|---|---|---|---|
| GLB | Сохраняются 2 | Сохраняется | Сохраняется | Сохраняется | 48 вершины |
| glTF | Сохраняются 2 | Сохраняется | Сохраняется | Сохраняется | 48 вершины |
| OBJ | Сохраняются 2 | Сохраняется | Теряется | Сохраняется | 72 вершины |
| STL | Объединены в 1 | Теряется | Теряется | Теряется | 72 вершины |
| PLY | Объединены в 1 | Сохраняется | Сохраняется | Теряется | 48 вершины |
| USDZ | Сохраняются 2 | Сохраняется | Теряется | Теряется | 72 вершины |
Почему STL и PLY объединяют сцену в одну сетку?#
Ни один из этих форматов не имеет графа сцены. GLB, glTF и OBJ могут описывать несколько объектов с именами в одном файле; STL описывает единое тело, а PLY — единственный список элементов, поэтому оба куба приходят как одна сетка, и нет способа разделить их обратно.
Это потеря, которая больше всего удивляет, потому что её не видно. Преобразованная модель выглядит идентичной в просмотрщике. Только когда пытаешься выбрать, поменять материал или анимировать одну из её частей, обнаруживаешь, что частей больше нет.
Если модель должна оставаться разделяемой, местом назначения должно быть GLB, glTF или OBJ. Если же она идёт на ламинатор или на печать одним материалом, объединение ничего не стоит.
На сколько растет файл?#
Больше, чем большинство ожидает. В реально сгенерированной сетке OBJ занимал 5,6 раз больше, чем исходный GLB, а PLY 1,4 раз. У обоих одна и та же геометрия.
| Конвертация | Источник | Результат | Пропорция | Записанные вершины |
|---|---|---|---|---|
| mug.glb a GLB | 880 KB | 1 173 KB | 1,3x | 25 000 |
| mug.glb a glTF | 880 KB | 1 564 KB | 1,8x | 25 000 |
| mug.glb a OBJ | 880 KB | 4 928 KB | 5,6x | 150 000 |
| mug.glb a STL | 880 KB | 2 441 KB | 2,8x | 150 000 |
| mug.glb a PLY | 880 KB | 1 221 KB | 1,4x | 25 000 |
| mug.glb a USDZ | 880 KB | 2 927 KB | 3,3x | 150 000 |
| lion.glb a GLB | 8 768 KB | 11 690 KB | 1,3x | 249 369 |
| lion.glb a glTF | 8 768 KB | 15 587 KB | 1,8x | 249 369 |
| lion.glb a OBJ | 8 768 KB | 51 880 KB | 5,9x | 1 496 202 |
| lion.glb a STL | 8 768 KB | 24 352 KB | 2,8x | 1 496 202 |
| lion.glb a PLY | 8 768 KB | 12 176 KB | 1,4x | 249 369 |
| lion.glb a USDZ | 8 768 KB | 30 487 KB | 3,5x | 1 496 202 |
Почему OBJ и STL умножают количество вершин?#
Потому что ни один из них не делит вершины между треугольниками. Хорошо индексированная сетка сохраняет каждый угол только один раз и ссылается на него из всех треугольников, которые его касаются; OBJ и STL, как они здесь написаны, сохраняют по отдельности три угла каждого треугольника. В тесте с lion.glb это превратило 249 369 вершин в 1 496 202, некоторые 6 раз больше.
Геометрия не меняется. Та же поверхность, те же треугольники, тот же силуэт; только бухгалтерия становится дороже, а архив растет примерно в той же пропорции.
PLY — это полезный контрпример. Он сохраняет индекс, так что та же сетка записывается с размером, близким к исходному, и продолжает нести цвет по вершинам. Для большой сетки, где нужно сохранить только геометрию, PLY — это самый дешевый честный вариант из этого списка.
Текст по сравнению с бинарным усугубляет ситуацию. glTF — это JSON с буферами, закодированными в base64, что стоит примерно на 33 процент больше, чем идентичный GLB, потому что base64 превращает каждые три байта в четыре.
Почему файл вырос даже при конвертации из GLB в GLB?#
Потому что конвертер вычисляет нормали вершин любой сетки, которая приходит без них, а затем их записывает. Сгенерированная сетка часто не имеет никаких нормальных атрибутов, поэтому обратный маршрут добавляет по одному полному вектору на вершину.
Тест с mug.glb является наглядным примером: входят 880 KB и выходят 1 173 KB, без каких-либо изменений в геометрии. Добавленные нормали и есть разница.
Это осознанное решение, а не дефект. Сетка без нормалей отображается с плоской затененностью и имеет фасеточный вид во многих просмотрщиках, поэтому конвертер вычисляет их сразу при загрузке, вместо того чтобы позволять каждой последующей программе гадать их.
Меняет ли конвертация форму?#
Нет. Каждое назначение было преобразовано, а затем прочитано снова, и поверхность оказалась идентичной: то же количество треугольников и та же общая площадь поверхности, вплоть до предела измерения, в сетке из 498 734 треугольников. Геометрия — это та часть 3D-файла, которая сохраняется неизменной после конверсии.
| Назначение | Треугольники после | Ошибка площади поверхности | Как сохраняются координаты |
|---|---|---|---|
| GLB | без изменений | 0% | float32 бинарный |
| glTF | без изменений | 0% | буфер в base64 |
| OBJ | без изменений | 0% | текст с 17 десятичные |
| STL | без изменений | 0% | float32 бинарный |
| PLY | без изменений | 0% | float32 бинарный |
| USDZ | без изменений | 0% | zip из USDA |
Итак, 3D-конвертация приводит к потерям или нет?#
И то, и другое, и различие полезно. Геометрия ничего не теряет: форма, которая входит, — это форма, которая выходит. Все, что окружает геометрию, действительно теряется, и какие части вы теряете, полностью зависит от выбранного вами назначения.
Здесь ничто не обрезает координаты. GLB, STL и PLY записывают 32-битные бинарные числа с плавающей запятой. glTF внедряет тот же бинарный буфер в формате base64 внутри своего JSON. USDZ записывает zip-файл от USDA. OBJ — единственный, кто записывает позиции в виде десятичных чисел, и делает это с полной точностью, а не округляет, что является частью причины, почему его файлы намного больше.
Это означает, что обычная озабоченность, что каждая конверсия немного ухудшает модель, например, при повторном сохранении JPEG, не применяется. Преобразование из GLB в OBJ и обратно не сглаживает сетку.
Что он действительно делает, так это отбрасывает то, что указано выше на этой странице: граф сцены в STL и PLY, цвет вершин в OBJ, STL и USDZ, имена материалов в STL, PLY и USDZ, и UV в STL. Эти потери постоянны, в том смысле, что повторное преобразование не сможет их восстановить.
Какой формат следует выбрать?#
Выбирайте формат в зависимости от того, что должно сохраниться, а не по расширению, которое инструмент получателя ставит первым в своем списке. Ниже приведены обоснованные выборы на основе приведенных выше измерений.
| Если нужно | Выберите | Почему |
|---|---|---|
| Все сохранено, в одном файле | GLB | Единственная цель, которая сохранила вместе граф сцены, имена материалов, UV и цвет по вершинам, с наименьшим размером среди полных форматов. |
| Всё сохранено, читаемо человеком | glTF | То же самое содержимое, что у GLB, примерно на 33 процент больше, потому что буферы находятся в base64 внутри JSON. |
| Разделенные объекты с именем в настольной программе | OBJ | Сохранил оба объекта и оба имени материалов. Отбрасывает цвет по вершинам и записывает самый большой файл из шести. |
| 3D-печать | STL | Только треугольники, больше ничего, что и всё, что читает слайсер. Наименьшая из целей, которые не являются glTF в реальной сетке. |
| Геометрия и цвет по вершинам, с малым весом | PLY | Единственный формат назначения, который не является glTF, сохранил цвет по вершинам и индекс, так что его размер остается близким к исходному. |
| Quick Look от Apple / AR на iPhone | USDZ | Сохранил оба объекта и UV на эталонной сцене. Потерял цвет по вершинам и имена материалов при повторном чтении. Zip-файл USDA, который может открыть телефон. |
Что определяет эти форматы#
Измерения выше — наши; мы не решаем, что каждый формат может содержать. Эти спецификации и эталонные форматы решают это, чтобы можно было проверить информацию на этой странице у источника, а не верить ей без доказательств.
- Спецификация glTF 2.0The Khronos Group
Определите сценограф, материалы и аксессуары, которые несут GLB и glTF, и объясните, почему они были единственными объектами, которые сохранились здесь целыми.
- Тип носителя model/gltf-binaryIANA
Зарегистрированный тип для GLB, бинарного контейнера, измеренного выше.
- Тип носителя model/stlIANA
STL как зарегистрировано: треугольники и нормали граней, без каких-либо полей для цвета, UV, материалов или имен объектов.
- Формат файла Wavefront OBJПауль Бурк
Постоянная ссылка для OBJ, который не имеет собственного поля для цветa на вершине, что совпадает с тем, что было отброшено при конверсии.
- Формат файла полигонов PLYПауль Бурк
Документируйте свойства по вершине, включая цвет, которые делают PLY единственным местом назначения, которое не является glTF, где он сохраняется здесь.
- Спецификация формата файла USDZPixar / OpenUSD
USDZ — это zip, первая запись которого является сценой USDA. Это пакет, который этот конвертер записывает и читает.
Как измерялось#
Измерение выполняет продукт, а не описание его. Скрипт импортирует те же загрузчики и экспортеры, что и конвертер браузера, с теми же опциями, и находится в репозитории, чтобы цифры можно было воспроизвести или обсудить.
- Построить эталонную сцену с двумя кубами с именами, каждый с металлическим материалом с именем, цветом по вершине, UV-координатами и нормалями.
- Загружать реально сгенерированные меши тем же способом, которым конвертер загружает файл, который вы ему даёте, включая шаг, который рассчитывает нормали вершин, когда меш приходит без них.
- Экспортировать в GLB, glTF, OBJ, STL, PLY и USDZ теми же экспортерами, которые вызывает конвертер, и с теми же бинарными настройками.
- Регистрировать размер в байтах каждого результата.
- Считывать атрибуты напрямую из записанных байтов, а не из повторно загруженной сцены, потому что загрузчик придумывает то, чего нет в файле: OBJ без линий vn всё равно будет перезагружен с синтезированным атрибутом нормалей.
- Публиковать таблицу напрямую из этого результата. Измерено 13 сентября 2026 г. с помощью three.js r179.
Вопросы
- Потеря качества при конвертации 3D файла?
- Форма нет. Каждый объект назначения был преобразован и повторно прочитан, и количество треугольников и общая площадь поверхности оказались идентичными в сетке из 498 734 треугольники, без усечения координат в каком-либо формате. Теряется все, что окружает геометрию, и это зависит от формата назначения: STL отбрасывает UV, цвет, материалы и граф сцены; OBJ отбрасывает цвет по вершинам; PLY отбрасывает имена материалов и объединяет сцену; USDZ отбрасывает цвет по вершинам и имена материалов при повторном чтении; GLB и glTF сохраняли все.
- Какой 3D-формат занимает меньше всего?
- GLB, в реальной сетке. В этих тестах GLB написал 1 173 KB где OBJ написал 4 928 KB для той же модели, потому что GLB является бинарным и поддерживает индекс общих вершин, тогда как получаемый OBJ является текстовым и хранит отдельно каждый угол каждого треугольника.
- Почему мой OBJ занимает гораздо больше места, чем GLB, из которого он получен?
- По двум причинам, обе меры: OBJ текстовый, а не бинарный, и OBJ, который здесь записывается, не делит вершины между треугольниками, поэтому количество вершин умножается примерно на 6 в хорошо индексированной сетке. Поверхность идентична; учет нет.
- Сохраняет ли STL цвет?
- Нет. Бинарный STL хранит нормаль грани и три вершины на треугольник и не имеет полей для цвета, UV, материалов или названий объектов. Это соблюдалось во всех STL, записанных в этих тестах.
- Могу ли я сохранить цвет по вершинам, не используя GLB?
- Да, с PLY. В этих тестах это была единственная цель, не являющаяся glTF, которая заявляла свойство цвета в своем заголовке. Правда, она объединяет сцену из нескольких объектов в одну сетку, так что вы сохраняете цвет и теряете части.
- Разрушает ли многократное преобразование 3D-модели качество?
- Нет. В отличие от повторного сохранения JPEG, 3D-преобразование не накапливает ошибки: координаты копируются как бинарные числа с плавающей запятой или, в случае OBJ, записываются как десятичные числа с полной точностью. Путешествие туда и обратно через любой из этих форматов возвращало идентичную поверхность. То, что не возвращается, — это информация о материалах и сцене, которую цель изначально не могла перенести.
- Могу ли я воспроизвести эти цифры?
- Да. Скрипт измерения находится в репозитории, в scripts/measure-conversions.mjs, и записывает JSON, который читает эта страница. Он был выполнен в последний раз 13 сентября 2026 г. с помощью three.js r179.