3DModelConvertToGltf — инструмент для преобразования моделей в унифицированный формат
Английский | 中文
Основная причина создания этого проекта заключается в том, что я столкнулся со сценарием, когда модели STEP и IGES необходимо отобразить в Интернете, но библиотеки web3d на рынке не поддерживают этот формат, а прямое отображение файлов STL, загруженных пользователями, будет потреблять много трафика или CDN-трафика. Преобразование в сжатый gltf было бы более подходящим.
Сравнение эффектов модели демонстрационных активов:
Тип модели | Путь к файлу | Время конвертации | Исходный размер | После конвертации |
---|---|---|---|---|
STL | assets/test.stl | 2368,890 мс | 7,6 МБ | 86 КБ |
IGES | assets/test.iges | 1641,226 мс | 1 МБ | 111 КБ |
STP | assets/test.stp | 2969,200 мс | 5,1 МБ | 217 КБ |
FBX | assets/Samba Dancing.fbx | <1000 мс | 3,7 МБ | 614 КБ |
Поддержка входных форматов: STL/IGES/STP/OBJ/FBX
Поддержка выходных форматов: GLTF/GLB
Я изложил свои мысли в блоге: Модели STEP и IGES преобразуются в удобный для Интернета формат GLB.
PS: Мой блог написан на китайском языке, если вы не являетесь носителем китайского языка, вам следует воспользоваться инструментом Google Translate.
Статус проекта: стабильный
Вы можете отсканировать следующий qrcode через Wechat, это полезно для 3d-печати и предварительного просмотра везде.
convert.sh поддерживает опцию no-draco.
Меньшие образы docker, с 4,42 ГБ до 1,87 ГБ, исправлены проблемы с запуском docker.
Исправлены некоторые ошибки, поддерживается преобразование без draco.
Поддерживается GRPC, код преобразования переработан, исправлены ошибки.
Добавлен английский документ, исправлены ошибки.
Базовая фиксация, основные функции завершены, поддерживается оболочка convert.
Я попытался использовать assimp, но результат теста на преобразование stl/iges/obj
оказался не очень хорошим. Я использовал https://hub.docker.com/r/dylankenneally/assimp среду docker для тестирования, вы можете попробовать её.
Преобразование моделей — это услуга, требующая больших затрат производительности и времени. Загрузка и скачивание модели будут потреблять трафик. Если он развёрнут непосредственно на вашем собственном сервере, это будет задача, которая требует больших затрат трафика и ресурсов процессора. Для наиболее распространённого метода загрузки и скачивания больших файлов необходимо внедрить OSS и CDN с динамическим расширением очередей и серверных служб, но затраты на развёртывание и реализацию будут относительно высокими.
Из-за проблем с настройкой среды и по другим причинам командный режим всё ещё должен полагаться на docker. Командный режим подходит для простого вызова на стороне сервера. Процесс преобразования блокирует синхронизацию процессов и не может быть развёрнут распределённым образом для увеличения Параллелизм
Наиболее рекомендуемый способ — использовать grpc с развёртыванием docker, чтобы сделать rpc, который может быть синхронным или асинхронным и будет легко расширяться.
PS:Когда в режиме командной строки слишком много одновременных моделей преобразования или одна модель слишком велика, существует риск того, что сервер, предоставляющий веб-сервис, зависнет.
Вы можете преобразовать модель онлайн (<100 МБ) на основе modelbox-sdk, ссылка для предварительного просмотра: https://wangerzi.gitee.io/modelbox-sdk/examples/index.html.
На основе GRPC будет удобнее создавать динамически расширяемый сервисный кластер. Мы поддерживаем загрузку zip/исходных файлов модели, для совместимости каждой модели все файлы ответов находятся в zip, вам нужно распаковать его после получения.
Вам следует запустить серверный RPC-сервис с помощью docker, убедитесь, что порт 8999 доступен, а образ wj2015/3d-model-convert-to-gltf:latest
актуален, команда:
$ docker pull wj2015/3d-model-convert-to-gltf:latest
$ docker run -d -p 8999:8999 wj2015/3d-model-convert-to-gltf:latest
При использовании grpc в этом проекте скопируйте server/rpc/protos/converter.proto
и сгенерируйте шаблон кода в соответствии с языком вызывающей стороны и наслаждайтесь им. Официальный документ: Поддержка языков.
Если этот проект вам полезен, вы можете зафиксировать другие примеры и PR, например, примеры вызовов php/golang/Nodejs rpc.
name | code | comments |
---|---|---|
Пример использования клиента Python rpc | server/examples/python/rpc_client.py | конвертировать и сохранить |
Скачайте convert.sh
, предоставьте права на выполнение и выполните следующую команду, второй параметр должен быть выбран в stl|stp|iges|obj|fbx
, пожалуйста, определите в зависимости от типа файла.
Скрипт зависит от среды docker, поэтому сначала необходимо подготовить среду Docker. Командный режим не поддерживает преобразование zip-файлов, поскольку объём данных docker автоматически синхронизирует изображения или активы mtl с контейнером docker.
convert.sh stl inputpath.stl outputpath.glb # преобразовать в один файл glb
convert.sh stl inputpath.stl outputpath.gltf # создать файл gltf
В каталоге assets
есть четыре тестовых файла: test.stl
, test.stp
, test.igs
, E 45 Aircraft_obj.obj
, Samba Dancing.fbx
. Скопируйте их в путь проекта, и вы увидите результат преобразования.
Если вы получили эту ошибку при использовании php-fpm или другого языка исполнителя для выполнения convert.sh, вы можете добавить своего пользователя-исполнителя в группу docker, чтобы избежать этой проблемы.
usermod -a -G docker nginx
docker: Получил отказ в доступе при попытке подключения к сокету демона Docker по адресу unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: разрешение отклонено.
Используя вызовы на других языках, вы можете синхронно определить, существует ли выходной файл, чтобы определить, успешно ли выполнено преобразование, например:
<?php
$out = 'out.glb';
$input = 'test.stl';
$type = 'stl';
// будьте осторожны с атаками выполнения
shell_exec('convert.sh '.$type.' '.$input.' '.$out);
if (file_exists($out)) {
echo "результат конвертирования:" . $out;
} else {
echo "преобразование не удалось";
}
Под хост-машиной docker установите docker и выполните следующую команду для извлечения образа (около 4 ГБ).
docker pull wj2015/3d-model-convert-to-gltf
Внутри контейнера выполните conda run -n pythonocc python convert.py [stl|step|iges|obj|fbx] input.stl out.glb
, чтобы синхронно преобразовать модель.
Если требуется многомашинная загрузка, можно использовать nginx proxy / контейнер docker с rpc для простой балансировки нагрузки или использовать очередь сообщений с производителем и потребителем. HTTP API или очереди должны Реализуйте собственную логику.
Присоединяйтесь к нам.
Сначала установите docker и docker-compose, обратитесь к официальным документам: Docker Desktop.
Затем перейдите в документы environment/, выполните команду docker-compose up, результат выполнения будет следующим, что указывает на успех.
user@MacBook-Pro environment % docker-compose up
Recreating 3d-model-convert-to-gltf-app ... done
Starting 3d-model-convert-to-gltf-redis ... done
Attaching to 3d-model-convert-to-gltf-redis, 3d-model-convert-to-gltf-app
3d-model-convert-to-gltf-redis | 1:C 09 Oct 2020 03:03:29.150 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3d-model-convert-to-gltf-redis | 1:C 09 Oct 2020 03:03:29.150 # Redis version=6.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
3d-model-convert-to-gltf-redis | 1:C 09 Oct 2020 03:03:29.150 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
3d-model-convert-to-gltf-redis | 1:M 09 Oct 2020 03:03:29.152 * Running mode=standalone, port=6379.
3d-model-convert-to-gltf-redis | 1:M 09 Oct 2020 03:03:29.152 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3d-model-convert-to-gltf-redis | 1:M 09 Oct 2020 03:03:29.152 # Server initialized
Если возникают конфликты портов, сбои инициализации и другие ненормальные ситуации, пожалуйста, проверьте и найдите информацию в соответствии с информацией об ошибке.
Создайте новый терминал, выполните docker ps для этого текущего выполнения контейнеров docker, результат выполнения следующий, что указывает на успех.
user@MacBook-Pro 3d-model-convert-to-gltf % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69b684ed7755 wj2015/3d-model-convert-to-gltf "conda run -n python…" 3 seconds ago Up 2 seconds 3d-model-convert-to-gltf-app
Далее войдите в контейнер, чтобы выполнить команду, и войдите в среду conda pythonocc. Выполнение скрипта в этой среде может облегчить изменение кода и отладку.
wangjie@MacBook-Pro 3d-model-convert-to-gltf % docker exec -it 3d-model-convert-to-gltf-app /bin/bash
(base) root@5efd6ef96814:/opt/3d-model-convert-to-gltf# conda activate pythonocc
(pythonocc) root@69b684ed7755:/opt/3d-model-convert-to-gltf# python server/convert.py
Params not found, format: python convert.py [type] [file path] [out file path]
В основном для разработчиков, которые не могут запустить docker, вы можете попробовать использовать этот метод для создания среды разработки.
Создайте виртуальную среду conda:
conda create -n 3d-model-convert-to-gltf-pythonocc -c dlr-sc -c pythonocc pythonocc-core=7.4.0rc1
conda activate 3d-model-convert-to-gltf-pythonocc
pip install -r server/requirements.txt
Ваш локальный узел версии должен быть 12.0.0, иначе вы получите ошибку при запуске команды gltf-pipeline, и вам следует установить пакеты gltf-pipeline и obj2gltf.
Установите nvm с помощью этого скрипта (MacOs или Linux), вы можете загрузить исполняемый файл .exe из https://github.com/coreybutler/nvm-windows.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
Установите и используйте узел 12.0.0 с другими пакетами.
nvm install 12.0.0
nvm use 12.0.0
npm install -g gltf-pipeline obj2gltf
Затем загрузите FBX2glTf из https://github.com/facebookincubator/FBX2glTF и поместите его в каталог среды.
PS: вы должны переименовать FBX2Gltf в fbx2gltf для унифицированного вызова.
Разберитесь в коде и структуре файлов, отправьте PR после внесения изменений. Добро пожаловать на электронную почту admin@wj2015.com.
3DModelConvertToGltf лицензирован под... Apache License, версия 2.0. Полный текст лицензии смотрите в LICENSE.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )