DXF → GLB: 3D-модели из чертежей без моделлера
У дилера спринклерного оборудования был каталог с фотографиями и архивами чертежей. Чертежи лежали на сайте как файлы для скачивания: их открывает проектировщик в своей программе, а покупатель на странице видит только ссылку «Архив (ZIP)». Мы собрали конвейер, который берёт эти же заводские чертежи и делает из них 3D-модели, которые можно покрутить прямо в карточке товара. Моделлера в процессе не было. Ниже рассказываем, как это устроено, где автомат ошибался и когда такой подход стоит затевать.
Зачем модель в B2B-каталоге
Ороситель — мелкая деталь, но покупатель выбирает его по конструкции: вертикальный или горизонтальный, со стеклянной колбой или без неё (спринклер или дренчер), как выглядит розетка. На фото это видно с одного ракурса. Модель можно повернуть и рассмотреть со всех сторон.
Второй довод практический: чертежи у производителя уже есть. Если модель получается из них автоматически, она не требует съёмки и не расходится с документацией, потому что сделана из того же исходника.
Что было на входе
На входе были DXF-файлы. DXF — открытый формат чертежей, его выгружают почти все инженерные программы. В нашем случае это были трёхмерные чертежи из архивов производителя: геометрия разбита на отдельные куски (в терминах формата — меши), но без цвета и материала. Чертёж знает форму детали, а из чего она сделана, он не знает.
Для пилота взяли два файла:
- дренчер: около 22 тысяч вершин, 3 меша, колбы нет;
- спринклер: около 30 тысяч вершин, 7 мешей, колба есть.
Ориентиром по цвету служили фотографии реальных изделий: латунный корпус и красная стеклянная колба у спринклера.
Конвейер по шагам
Всё работает в Blender, бесплатной программе для 3D, только без окна: скрипт запускается из командной строки и сам проходит все шаги.
blender --background --python build_glb.py -- model.dxf model.glb sprinkler briz_s
Последние три аргумента: куда сохранить результат, тип изделия (спринклер или дренчер) и короткое имя модели, о котором ниже.
Импорт чертежа. Blender читает DXF штатным дополнением. На части файлов оно падало на мешах с повторяющимися гранями, поэтому мы встроили в скрипт обходной путь: такие грани пропускаются, и импорт идёт дальше.
Выравнивание поверхности. После импорта у части граней «изнанка» смотрит наружу, и на экране деталь выглядит рваной. Скрипт разворачивает все грани в одну сторону и сглаживает затенение.
Материалы. Мы завели два основных материала. Латунь: металл с умеренным блеском. Колба: красное полупрозрачное стекло. Позже добавились белый пластик и нержавеющая сталь для изделий из нескольких материалов.
Раскраска. Это самый сложный шаг: нужно решить, какой кусок геометрии колба, а какой корпус. У дренчера колбы нет, он целиком латунный. У спринклера скрипт ищет колбу по форме: длинный тонкий кусок (длина хотя бы в 3 раза больше ширины), который стоит по центру изделия.
Экспорт и сжатие. Результат сохраняется в GLB. Это формат 3D для веба, его понимают браузеры и встроенные в страницу просмотрщики. Затем файл сжимается алгоритмом Draco, который упаковывает геометрию. Встроенное в Blender сжатие в нашей версии не работало, поэтому сжатие идёт отдельным инструментом после экспорта. Пилотные модели весят 60 и 44 КБ, примерно в 7 раз меньше несжатых.
Показ на сайте. Модель открывается в просмотрщике model-viewer. Библиотека и файл освещения лежат на сервере сайта, а не на внешнем CDN, и подгружаются только на страницах, где модель есть.
Где автомат ошибался
На пилоте ошибся первый вариант правила для колбы. Он искал один тонкий кусок и нашёл цоколь, маленькую деталь под колбой. Сама колба при этом осталась латунной. Выяснилось, что колба в чертеже состоит из нескольких кусков: стекло, столб жидкости внутри и кончик. Правило переписали: красным становится каждый тонкий кусок на оси изделия. Цоколь недостаточно вытянут (около 2,1 против порога 3), поэтому остался латунным. На двух пилотных моделях это сработало.
На следующей партии правило по форме оказалось ненадёжным. У части моделей тонкими были детали корпуса, и скрипт красил их как стекло. Мы не стали подбирать порог под каждый случай. Для каждой модели мы глазами сверили куски с фотографией производителя и записали в скрипт явный список: какие куски этой модели колба.
OVERRIDES = {
"briz_s": {"bulb_meshes": ["POLYFACE.002", "POLYFACE.003"]},
"sobr25v": {"bulb_meshes": ["POLYFACE.005"]},
}
Если для модели есть такая запись, автоматический поиск колбы отключается. Перед публикацией каждую модель принимали глазами. Ручная работа здесь — эта сверка: посмотреть на модель, найти колбу, записать номера её кусков.
Два изделия в этой партии не прошли. Ороситель скрытого монтажа сделан из нескольких материалов: белая чашка корпуса, латунный ороситель, красная колба, стальные клипсы. Для него понадобилась отдельная карта материалов по каждому куску. У второго изделия на источнике лежал битый архив, и его нужно было скачать заново. Оба мы вынесли из основной партии в отдельный хвост и не задерживали из-за них остальные модели.
Что получилось на сайте
После пилота на двух моделях прошла основная партия: 17 моделей из 13 DXF-документов. Из них 6 дренчеров, полностью латунных, и 11 спринклеров с красной колбой. Все они опубликованы на сайте.
Модель видна в трёх местах:
- на странице документа вкладка «3D-модель» стоит вместо пустого окна просмотра чертежа;
- в разделе «CAD / 3D» рядом со ссылкой на архив появилась ссылка «Просмотр 3D»;
- в галерее серии рядом с фотографиями есть 3D-слайд, причём каждая серия показывает только свою модель.
Модели хранятся как отдельные записи с подписью и привязкой к серии, поэтому редактор может поправить их в обычной админке без разработчика. Две из готовых моделей потом пригодились для заставки главной страницы: там два оросителя вращаются в 3D-сцене.
Для сравнения: каталог пожарных шкафов
У производителя пожарных шкафов задача была похожей, но исходники другие. DXF там не понадобились: у производителя был архив готовых файлов Blender. Из 120 страниц шкафов модели получили 36.
Остальные 84 страницы распределились так. 12 крашеных шкафов одного семейства есть в каталоге, но их исходников в архиве нет. Это реальный пробел, и его можно закрыть, только получив файлы или собрав модели перекраской соседних исполнений. Ещё три группы мы не считаем дефицитом: напольные подставки (это не шкафы), шкафы из нержавеющей стали (другой материал, исходников нет) и около 40 повторных «премиум»-карточек тех же шкафов, куда можно подставить уже готовые модели.
Вывод из сравнения простой: количество моделей в каталоге определяет набор исходников, который есть у производителя. Скрипт его не увеличит.
Когда это имеет смысл, а когда нет
Подход окупается, когда у производителя уже есть трёхмерные чертежи или модели, изделий много и они похожи друг на друга. Тогда один скрипт обрабатывает всю линейку, а ручная работа сводится к проверке каждой модели по фотографии. Подходит и тем, у кого покупатель выбирает по конструкции: ороситель или шкаф.
Не стоит затевать, если чертежи только двухмерные. Плоский чертёж (например, DWG с видами и размерами) не содержит объёма, и модель из него автоматически не получится. Такие файлы мы оставили для скачивания. Не стоит и тогда, когда товар продаётся внешним видом: фактурой, цветом ткани, отделкой. Модель из чертежа показывает форму, а за внешний вид отвечает фотография.
И ещё одно условие: сразу закладывайте время на проверку глазами. Автомат хорошо справляется с геометрией и сжатием, а решение «этот кусок — стекло» на наших данных надёжно принимал только человек, сверяясь с фотографией.