Úvod
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 je pro tuto práci přirozeně vhodný: shell skripty jsou příliš křehké a plné integrace DCC (digital content creation) nástrojů jsou příliš těžké pro hromadné zpracování. Co potřebujete, je knihovna, která dokáže načíst kterýkoli z těchto formátů, poskytne vám konzistentní graf scény a zapíše zpět do libovolného cílového formátu bez nutnosti GUI nebo grafického ovladače.
Aspose.3D FOSS pro Python (aspose-3d-foss, licence MIT) tuto mezeru zaplňuje. Tento průvodce ukazuje nejčastější konverzní cesty s kompletními, spustitelnými ukázkami kódu.
Jaké formáty podporuje Aspose.3D FOSS?
| Formát | Extension(s) | Načíst | Uložit | Běžný případ použití |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Ano | Ano | Výměna z modelovacích nástrojů; .mtl podporovány soubory materiálů |
| STL | .stl | Ano | Ano | 3D printing, CAD export; binary and ASCII variants |
| glTF 2.0 / GLB | .gltf, .glb | Ano | Ano | Webové prohlížeče, herní enginy; GLB je samostatná binární varianta |
| COLLADA | .dae | Ano | Ano | Import z animačních nástrojů; ColladaSaveOptions podporuje export |
| 3MF | .3mf | Ano | Ano | Additivní výroba, bohatší metadata tisku než STL |
Detekce formátu je automatická na základě přípony souboru. Třídy možností specifické pro formát (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) jsou k dispozici, když potřebujete jemnozrnnou kontrolu.
Poznámka k FBX: Knihovna obsahuje částečný tokenizér FBX pro import. FBX není v tomto vydání doporučeno pro produkční konverzní workflow; místo toho použijte OBJ nebo glTF jako meziformáty.
OBJ na STL: Příprava modelu pro 3D tisk
OBJ je nejčastějším výstupním formátem z modelovacích a sochařských nástrojů. STL je lingua franca slicerů pro 3D tisk. Převod mezi nimi je jedním voláním.
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 kóduje pouze trojúhelníkové plochy. Pokud váš OBJ soubor obsahuje čtyřúhelníky nebo n-úhelníky, exportér je automaticky trianguluje před zápisem. Pokud chcete triangulaci explicitně řídit před uložením, zavolejte mesh.triangulate() na každém meshi ve scéně:
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 na glTF: Export pro web a herní enginy
glTF 2.0 je preferovaný výměnný formát pro renderery v reálném čase, WebGL prohlížeče a herní enginy jako Babylon.js, Three.js a Unity. GLB (binární varianta) balí geometrii, textury a materiály do jediného samostatného souboru, což je snazší nasadit přes 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())
Formát je odvozen z přípony souboru: .gltf vytváří dvojici JSON+binární buffer; .glb vytváří jednosouborový binární soubor. OBJ materiálová data (LambertMaterial, PhongMaterial) jsou přenesena do reprezentace materiálu glTF PBR, kde existuje ekvivalent.
STL na glTF: Z výstupu skeneru nebo CAD do webu
Soubory STL z 3D skenerů a CAD systémů jsou běžné vstupy, které je třeba zpřístupnit pro web. STL obsahuje pouze trojúhelníkovou geometrii a žádná data o materiálech, takže převod je přímočarý.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())
Pokud byl STL vytvořen CAD nástrojem s neobvyklým souřadnicovým systémem (Z‑up vs Y‑up), můžete před uložením zkontrolovat a opravit transformaci kořenového uzlu:
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 na 3MF: Příprava pro aditivní výrobu
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")
Formát 3MF je detekován automaticky z .3mf přípony. Pro explicitní kontrolu předávejte a SaveOptions instance nakonfigurovaná pro 3MF.
Vzor hromadné konverze
V praxi konverzní úlohy pracují s adresáři souborů spíše než s jednotlivými soubory. Následující vzor zpracuje složku souborů OBJ a převede každý z nich na GLB, s ošetřením chyb na úrovni jednotlivých souborů, takže jeden špatný soubor neukončí celý běh.
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}")
Tento vzor se přirozeně rozšiřuje na další páry formátů zdroj/cíl: změňte filtr rozšíření a SaveOptions třídu pro libovolnou kombinaci v tabulce podpory výše.
Závěr
Aspose.3D FOSS pro Python usnadňuje konverzi formátů: načtěte pomocí Scene.from_file, volitelně prohlédněte nebo upravte graf scény a poté uložte s vhodným SaveOptions. Knihovna interně zpracovává triangulaci, normalizaci souřadnic a specifické zvláštnosti formátu.
Pro úplný seznam tříd a metod viz API Reference. Pro podrobnější informace o modelu grafu scény (uzly, sítě, transformace) viz:
- Třída Scene: načítání, ukládání a metadata na úrovni scény
- Třída Node: hierarchie, transformace, připojení entit
- Třída Mesh: data vrcholů, polygonů, prvky vrcholů
- Jak na to: Načítání souborů: Jak načíst 3D modely v Python
- PyPI: aspose-3d-foss na PyPI