Uvod
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 prirodan izbor za ovaj posao: shell skripte su previše krhke, a potpune DCC (digital content creation) integracije alata su preteške za grupnu obradu. Ono što vam je potrebno je biblioteka koja može da učita bilo koji od ovih formata, da vam pruži dosledan graf scene i da ponovo upiše u bilo koji ciljni format bez potrebe za GUI‑jem ili grafičkim drajverom.
Aspose.3D FOSS za Python (aspose-3d-foss, MIT licenca) popunjava tu prazninu. Ovaj vodič prikazuje najčešće puteve konverzije sa kompletnim, izvršivim primerima koda.
Koje formate podržava Aspose.3D FOSS?
| Format | Extension(s) | Učitaj | Sačuvaj | Uobičajeni slučaj upotrebe |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Da | Da | Razmena iz alata za modeliranje; .mtl podržani fajlovi materijala |
| STL | .stl | Da | Da | 3D printing, CAD export; binary and ASCII variants |
| glTF 2.0 / GLB | .gltf, .glb | Da | Da | Web pregledači, game engine‑i; GLB je samostalna binarna varijanta |
| COLLADA | .dae | Da | Da | Uvoz iz alata za animaciju; ColladaSaveOptions podržava izvoz |
| 3MF | .3mf | Da | Da | Aditivna proizvodnja, bogatiji metapodaci za štampu od STL‑a |
Detekcija formata je automatska na osnovu ekstenzije fajla. Klase opcija specifičnih za format (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) su dostupne kada vam je potrebna detaljna kontrola.
Napomena o FBX-u: Biblioteka uključuje parcijalni FBX tokenizator za uvoz. FBX se ne preporučuje za proizvodne radne tokove konverzije u ovom izdanju; umesto toga koristite OBJ ili glTF kao međuformat.
OBJ u STL: Priprema modela za 3D štampu
OBJ je najčešći izlazni format iz alata za modelovanje i skulpturu. STL je lingua franca slicera za 3D štampu. Konverzija između njih se vrši jednim pozivom.
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 kodira samo trouglaste površine. Ako vaš OBJ fajl sadrži kvadrilatere ili n‑gon površine, izvoznik ih automatski triangulira pre upisa. Ako želite eksplicitno da kontrolišete triangulaciju pre čuvanja, pozovite mesh.triangulate() na svaki mesh u sceni:
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 u glTF: Izvoz za web i game engine‑e
glTF 2.0 je preferirani format za razmenu podataka u real‑time renderer‑ima, WebGL preglednicima i game engine‑ima kao što su Babylon.js, Three.js i Unity. GLB (binarna varijanta) pakira geometriju, teksture i materijale u jedan samostalni fajl, što je lakše za serviranje preko HTTP‑a.
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 se zaključuje iz ekstenzije fajla: .gltf generiše par JSON+binary-buffer; .glb proizvodi jedinstvenu binarnu datoteku. OBJ podaci o materijalu (LambertMaterial, PhongMaterial) se prenosi u glTF PBR reprezentaciju materijala gde postoji ekvivalent.
STL u glTF: Sa skenera ili CAD izlaza na web
STL fajlovi sa 3D skenera i CAD sistema su česti ulazi koji treba da budu prikazivi na webu. STL sadrži samo trouglastu geometriju i nema podatke o materijalu, pa je konverzija jednostavna.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())
Ako je STL proizveden CAD alatom sa neobičnim koordinatnim sistemom (Z-up naspram Y-up), možete pregledati i ispraviti transformaciju korenskog čvora pre nego što sačuvate:
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 u 3MF: Priprema za aditivnu proizvodnju
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 se automatski otkriva iz .3mf ekstenzije. Za eksplicitnu kontrolu, prosledite SaveOptions instancu konfigurisanu za 3MF.
Grupna konverzija
U praksi, zadaci konverzije rade na direktorijumima fajlova, a ne na pojedinačnim fajlovima. Sledeći obrazac obrađuje fasciklu OBJ fajlova i konvertuje svaki u GLB, uz obradu grešaka po fajlu kako jedan loš fajl ne bi prekinuo čitav proces.
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}")
Ovaj obrazac se prirodno proširuje na druge parove izvornog/odredišnog formata: promenite filter ekstenzija i SaveOptions klasu za bilo koju kombinaciju u tabeli podrške iznad.
Zaključak
Aspose.3D FOSS za Python čini konverziju formata jednostavnom: učitajte sa Scene.from_file, po želji pregledajte ili izmenite scene graph, zatim sačuvajte sa odgovarajućim SaveOptions. Biblioteka interno obrađuje triangulaciju, normalizaciju koordinata i specifične osobenosti formata.
Za potpuni spisak klasa i metoda, pogledajte API referencu. Da biste detaljnije istražili model scene graph (čvorovi, mreže, transformacije), pogledajte:
- Klasa Scene: učitavanje, čuvanje i metapodaci na nivou scene
- Klasa Node: hijerarhija, transformacije, prikačivanje entiteta
- Klasa Mesh: vršni podaci, poligoni, vršni elementi
- Uputstvo: Učitavanje fajlova: Kako učitati 3D modele u Python
- PyPI: aspose-3d-foss na PyPI