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 grupno procesiranje. Ono što vam treba je biblioteka koja može učitati bilo koji od ovih formata, pružiti vam dosljedni graf scene i zapisati natrag u bilo koji ciljni format bez potrebe za GUI-jem ili grafičkim driverom.

Aspose.3D FOSS za Python (aspose-3d-foss, MIT licenca) premošćuje taj jaz. Ovaj vodič prikazuje najčešće putanje konverzije s potpunim, izvršivim primjerima koda.


Koje formate podržava Aspose.3D FOSS?

FormatExtension(s)UčitajSpremiUobičajeni slučaj upotrebe
Wavefront OBJ.objDaDaRazmjena iz alata za modeliranje; .mtl podržane datoteke materijala
STL.stlDaDa3D printing, CAD export; binary and ASCII variants
glTF 2.0 / GLB.gltf, .glbDaDaWeb preglednici, game enginei; GLB je samostalna binarna varijanta
COLLADA.daeDaDaUvoz iz alata za animaciju; ColladaSaveOptions podržava izvoz
3MF.3mfDaDaAditivna proizvodnja, bogatiji metapodaci ispisa od STL-a

Detekcija formata je automatska na temelju ekstenzije datoteke. Klase opcija specifične za format (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) su dostupne kada trebate finu kontrolu.

Napomena o FBX-u: Biblioteka uključuje djelomični FBX tokenizator za uvoz. FBX se ne preporučuje za proizvodne radne tokove konverzije u ovom izdanju; umjesto toga koristite OBJ ili glTF kao međuformate.


OBJ u STL: Priprema modela za 3D ispis

OBJ je najčešći izlazni format iz alata za modeliranje i skulptiranje. STL je lingua franca slicera za 3D ispis. Pretvaranje između njih je jedan poziv.

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 trokutne površine. Ako vaša OBJ datoteka sadrži četverokutne ili n-gon površine, izvoznik ih automatski triangulira prije zapisivanja. Ako želite izričito kontrolirati triangulaciju prije spremanja, pozovite mesh.triangulate() na svakom mrežnom objektu 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 engineove

glTF 2.0 je preferirani format za razmjenu u real-time renderera, WebGL preglednicima i game engineovima poput Babylon.js, Three.js i Unity. GLB (binarna varijanta) pakira geometriju, teksture i materijale u jednu samostalnu datoteku, što je lakše poslužiti putem 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 datoteke: .gltf generira par JSON+binarnog bafera; .glb generira jedinstvenu binarnu datoteku. OBJ podaci o materijalu (LambertMaterial, PhongMaterial) prenosi se u glTF PBR prikaz materijala gdje postoji ekvivalent.


STL u glTF: Od skenera ili CAD izlaza do weba

STL datoteke iz 3D skenera i CAD sustava su uobičajeni ulazi koji trebaju biti prikazani na webu. STL sadrži samo trokutnu 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 s neobičnim koordinatnim sustavom (Z-up naspram Y-up), možete pregledati i ispraviti transformaciju korijenskog čvora prije spremanja:

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 izričitu kontrolu, proslijedite a SaveOptions instanca konfigurirana za 3MF.


Uzorak za grupnu konverziju

U praksi, zadaci konverzije rade na direktorijima datoteka, a ne na pojedinačnim datotekama. Sljedeći uzorak obrađuje mapu OBJ datoteka i pretvara svaku u GLB, uz obradu grešaka po datoteci kako jedan loš fajl ne bi prekinuo cijeli 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 uzorak prirodno se proširuje na druge parove izvornog/ciljnog formata: promijenite filter ekstenzija i SaveOptions klasu za bilo koju kombinaciju u tablici podrške iznad.


Zaključak

Aspose.3D FOSS za Python čini konverziju formata jednostavnom: učitajte s Scene.from_file, po želji pregledajte ili izmijenite graf scene, zatim spremite s odgovarajućim SaveOptions. Biblioteka interno obrađuje triangulaciju, normalizaciju koordinata i specifične osobitosti formata.

Za potpuni popis klasa i metoda, pogledajte API referencu. Za dublje razumijevanje modela grafa scene (čvorovi, mreže, transformacije), pogledajte: