Wprowadzenie

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 jest naturalnym wyborem do tego zadania: skrypty powłokowe są zbyt kruche, a pełne integracje narzędzi DCC (digital content creation) są zbyt ciężkie dla przetwarzania wsadowego. Potrzebujesz biblioteki, która potrafi wczytać dowolny z tych formatów, zapewnić spójny graf sceny i zapisać go do dowolnego formatu docelowego bez wymogu interfejsu GUI ani sterownika graficznego.

Aspose.3D FOSS dla Python (aspose-3d-foss, licencja MIT) wypełnia tę lukę. Ten przewodnik pokazuje najczęstsze ścieżki konwersji z kompletnymi, uruchamialnymi przykładami kodu.


Jakie formaty obsługuje Aspose.3D FOSS?

FormatExtension(s)ZaładujZapiszTypowy przypadek użycia
Wavefront OBJ.objTakTakWymiana z narzędziami do modelowania; .mtl obsługiwane pliki materiałów
STL.stlTakTak3D printing, CAD export; binary and ASCII variants
glTF 2.0 / GLB.gltf, .glbTakTakPrzeglądarki internetowe, silniki gier; GLB jest samodzielną binarną wersją
COLLADA.daeTakTakImport z narzędzi animacji; ColladaSaveOptions obsługuje eksport
3MF.3mfTakTakProdukcja przyrostowa, bogatsze metadane druku niż STL

Wykrywanie formatu jest automatyczne na podstawie rozszerzenia pliku. Specyficzne dla formatu klasy opcji (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) są dostępne, gdy potrzebna jest precyzyjna kontrola.

Uwaga dotycząca FBX: Biblioteka zawiera częściowy tokenizator FBX do importu. FBX nie jest zalecany w przepływach konwersji produkcyjnej w tej wersji; zamiast tego użyj OBJ lub glTF jako formatów pośrednich.


OBJ do STL: przygotowanie modelu do druku 3D

OBJ jest najczęściej używanym formatem wyjściowym w narzędziach do modelowania i rzeźbienia. STL jest lingua franca programów cięcia do druku 3D. Konwersja między nimi wymaga jednego wywołania.

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 koduje tylko trójkątne powierzchnie. Jeśli Twój plik OBJ zawiera kwadraty lub wielokąty n‑gonalne, eksporter trianguluje je automatycznie przed zapisem. Jeśli chcesz ręcznie kontrolować triangulację przed zapisem, wywołaj mesh.triangulate() na każdym meshu w scenie:

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 do glTF: eksportowanie dla sieci i silników gier

glTF 2.0 jest preferowanym formatem wymiany dla rendererów czasu rzeczywistego, przeglądarek WebGL oraz silników gier takich jak Babylon.js, Three.js i Unity. GLB (wariant binarny) pakuje geometrię, tekstury i materiały w jeden samodzielny plik, co ułatwia jego udostępnianie przez 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())

Format jest wywnioskowany z rozszerzenia pliku: .gltf tworzy parę JSON+bufor binarny; .glb tworzy jednoplikowy plik binarny. Dane materiałów OBJ (LambertMaterial, PhongMaterial) jest przenoszone do reprezentacji materiału glTF PBR, gdzie istnieje odpowiednik.


STL do glTF: od skanera lub wyjścia CAD do sieci

Pliki STL pochodzące z skanerów 3D i systemów CAD są powszechnymi danymi wejściowymi, które muszą być udostępnione w przeglądarce. STL zawiera jedynie trójkątną geometrię i nie posiada danych o materiale, więc konwersja jest prosta.

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

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

Jeśli plik STL został wygenerowany przez narzędzie CAD z nietypowym układem współrzędnych (Z‑up vs Y‑up), możesz sprawdzić i skorygować transformację węzła głównego przed zapisaniem:

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 do 3MF: Przygotowanie do druku addytywnego

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")

Format 3MF jest wykrywany automatycznie z .3mf rozszerzenia. Aby uzyskać wyraźną kontrolę, przekaż SaveOptions instancję skonfigurowaną dla 3MF.


Wzorzec konwersji wsadowej

W praktyce zadania konwersji działają na katalogach plików, a nie na pojedynczych plikach. Poniższy wzorzec obsługuje folder z plikami OBJ i konwertuje każdy z nich do GLB, z obsługą błędów na poziomie pliku, tak aby pojedynczy uszkodzony plik nie przerywał całego procesu.

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}")

Ten wzorzec rozszerza się naturalnie na inne pary formatów źródło/docelowy: zmień filtr rozszerzeń i SaveOptions klasę dla dowolnej kombinacji w powyższej tabeli wsparcia.


Podsumowanie

Aspose.3D FOSS dla Python ułatwia konwersję formatów: wczytaj za pomocą Scene.from_file, opcjonalnie sprawdź lub zmodyfikuj graf sceny, a następnie zapisz przy użyciu odpowiedniego SaveOptions. Biblioteka obsługuje trójkątowanie, normalizację współrzędnych oraz specyficzne dla formatu niuanse wewnętrznie.

Aby uzyskać pełną listę klas i metod, zobacz Referencję API. Aby zagłębić się w model grafu sceny (węzły, siatki, przekształcenia), zobacz: