Введение

3D content rarely stays in a single format for its entire lifetime. A model may originate as an OBJ file exported from a modelling application, travel through a 3D printing pipeline as STL, appear in a web application as glTF, and end up in an additive manufacturing tool as 3MF. Each format serves a different audience and a different downstream tool, and conversion between them is something most 3D pipelines need to handle reliably.

Python естественно подходит для этой задачи: оболочечные скрипты слишком хрупки, а полные интеграции DCC (digital content creation) инструментов слишком тяжёлые для пакетной обработки. Вам нужна библиотека, способная загружать любой из этих форматов, предоставлять согласованный граф сцены и записывать обратно в любой целевой формат без необходимости GUI или графического драйвера.

Aspose.3D FOSS для Python (aspose-3d-foss, лицензия MIT) закрывает этот пробел. Это руководство показывает наиболее распространённые пути конвертации с полными, исполняемыми примерами кода.


Какие форматы поддерживает Aspose.3D FOSS?

ФорматExtension(s)ЗагрузитьСохранитьТипичный сценарий использования
Wavefront OBJ.objДаДаОбмен из инструментов моделирования; .mtl файлы материалов поддерживаются
STL.stlДаДа3D printing, CAD export; binary and ASCII variants
glTF 2.0 / GLB.gltf, .glbДаДаВеб‑просмотрщики, игровые движки; GLB — это автономный бинарный вариант
COLLADA.daeДаДаИмпорт из анимационных инструментов; ColladaSaveOptions поддерживает экспорт
3MF.3mfДаДаАддитивное производство, более богатые метаданные печати, чем у STL

Определение формата происходит автоматически по расширению файла. Классы параметров, специфичные для формата (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) доступны, когда требуется тонкая настройка.

Примечание по FBX: Библиотека включает частичный токенизатор FBX для импорта. FBX не рекомендуется использовать в производственных конверсионных процессах в этом выпуске; вместо него используйте OBJ или glTF в качестве промежуточных форматов.


OBJ в STL: подготовка модели к 3D‑печати

OBJ — самый распространённый формат вывода из инструментов моделирования и скульптинга. STL — lingua franca слайсеров 3D‑печати. Конвертация между ними выполняется одной командой.

from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions

scene = Scene.from_file("model.obj")

opts = StlSaveOptions()
scene.save("model.stl", opts)

STL кодирует только треугольные грани. Если ваш файл OBJ содержит квадраты или n‑угольные грани, экспортер автоматически триангулирует их перед записью. Если вы хотите явно управлять триангуляцией перед сохранением, вызовите mesh.triangulate() для каждой сетки в сцене:

from aspose.threed import Scene
from aspose.threed.entities import Mesh
from aspose.threed.formats import StlSaveOptions

scene = Scene.from_file("model.obj")

def triangulate_all(node):
    for entity in list(node.entities):
        if isinstance(entity, Mesh):
            tri_mesh = entity.triangulate()
            # Attach the triangulated mesh via add_entity
            node.add_entity(tri_mesh)
    for child in node.child_nodes:
        triangulate_all(child)

triangulate_all(scene.root_node)
scene.save("model_triangulated.stl", StlSaveOptions())

OBJ в glTF: экспорт для веба и игровых движков

glTF 2.0 — предпочтительный формат обмена для рендереров в реальном времени, WebGL‑просмотрщиков и игровых движков, таких как Babylon.js, Three.js и Unity. GLB (бинарный вариант) упаковывает геометрию, текстуры и материалы в один автономный файл, что упрощает его доставку по HTTP.

from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

scene = Scene.from_file("model.obj")

##Save as JSON-based glTF (external buffer)
opts_gltf = GltfSaveOptions()
scene.save("model.gltf", opts_gltf)

##Save as self-contained GLB binary: preferred for web delivery
scene.save("model.glb", GltfSaveOptions())

Формат выводится из расширения файла: .gltf создаёт пару JSON+binary-buffer; .glb создает однофайловый бинарный файл. Данные материалов OBJ (LambertMaterial, PhongMaterial) передаются в представление материалов glTF PBR, где существует эквивалент.


STL в glTF: от сканера или вывода CAD к вебу

STL‑файлы от 3D‑сканеров и CAD‑систем являются обычными входными данными, которые нужно сделать доступными для просмотра в вебе. STL содержит только треугольную геометрию и не имеет данных о материалах, поэтому преобразование простое.

from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())

Если STL был создан CAD‑инструментом с необычной системой координат (Z‑up vs Y‑up), вы можете проверить и исправить трансформацию корневого узла перед сохранением:

from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

scene = Scene.from_file("cad_export.stl")

##Rotate 90 degrees around X to convert Z-up to Y-up
root = scene.root_node
root.transform.set_euler_angles(-90.0, 0.0, 0.0)

scene.save("cad_export_yup.glb", GltfSaveOptions())

glTF в 3MF: подготовка к аддитивному производству

3MF is a modern 3D printing format backed by the 3MF Consortium. It supports richer metadata than STL (colour, material assignments, build instructions) and is accepted by slicer software such as PrusaSlicer and Bambu Studio. If you are delivering models from a web viewer into a printing workflow, converting GLB to 3MF is a useful step.

from aspose.threed import Scene
from aspose.threed import FileFormat
from aspose.threed.formats import SaveOptions

scene = Scene.from_file("model.glb")
scene.save("model.3mf")

Формат 3MF определяется автоматически по .3mf расширению. Для явного управления передайте SaveOptions экземпляр, настроенный для 3MF.


Пакетное преобразование

На практике задачи конвертации работают с каталогами файлов, а не с отдельными файлами. Ниже приведён шаблон, который обрабатывает папку с OBJ‑файлами и конвертирует каждый из них в GLB, с обработкой ошибок для каждого файла, чтобы один испорченный файл не прерывал весь процесс.

import os
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

input_dir = "./obj_files"
output_dir = "./glb_files"

os.makedirs(output_dir, exist_ok=True)

opts = GltfSaveOptions()
results = {"ok": [], "failed": []}

for filename in os.listdir(input_dir):
    if not filename.lower().endswith(".obj"):
        continue
    src = os.path.join(input_dir, filename)
    stem = os.path.splitext(filename)[0]
    dst = os.path.join(output_dir, stem + ".glb")
    try:
        scene = Scene.from_file(src)
        scene.save(dst, opts)
        results["ok"].append(filename)
        print(f"OK  {filename} -> {stem}.glb")
    except Exception as exc:
        results["failed"].append((filename, str(exc)))
        print(f"ERR {filename}: {exc}")

print(f"\n{len(results['ok'])} converted, {len(results['failed'])} failed.")
if results["failed"]:
    for name, reason in results["failed"]:
        print(f"  {name}: {reason}")

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


Заключение

Aspose.3D FOSS для Python упрощает конвертацию форматов: загрузите с Scene.from_file, при желании просмотрите или измените граф сцены, затем сохраните с соответствующим SaveOptions. Библиотека обрабатывает триангуляцию, нормализацию координат и особенности, специфичные для формата, внутри.

Для полного списка классов и методов см. Справочник API. Чтобы подробнее изучить модель графа сцены (узлы, меши, трансформации), см.: