Вступ
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 природно підходить для цього завдання: shell‑скрипти надто крихкі, а повні інтеграції DCC (digital content creation) інструментів занадто важкі для пакетної обробки. Вам потрібна бібліотека, яка може завантажити будь‑який із цих форматів, надати послідовний граф сцени та записати його у будь‑який цільовий формат без потреби у GUI чи графічному драйвері.
Aspose.3D FOSS для Python (aspose-3d-foss, MIT license) заповнює цю прогалину. Цей посібник показує найпоширеніші шляхи конвертації з повними, виконуваними прикладами коду.
Які формати підтримує 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+бінарний буфер; .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 проти 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 Reference. Щоб глибше зануритися в модель графа сцени (вузли, сітки, трансформації), дивіться:
- Class Scene: завантаження, збереження та метадані рівня сцени
- Class Node: ієрархія, трансформації, приєднання сутності
- Клас Mesh: дані вершин, полігони, елементи вершин
- Як завантажити 3D‑моделі в Python
- PyPI: aspose-3d-foss на PyPI