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?

FormatExtension(s)UčitajSačuvajUobičajeni slučaj upotrebe
Wavefront OBJ.objDaDaRazmena iz alata za modeliranje; .mtl podržani fajlovi materijala
STL.stlDaDa3D printing, CAD export; binary and ASCII variants
glTF 2.0 / GLB.gltf, .glbDaDaWeb pregledači, game engine‑i; GLB je samostalna binarna varijanta
COLLADA.daeDaDaUvoz iz alata za animaciju; ColladaSaveOptions podržava izvoz
3MF.3mfDaDaAditivna 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: