Kako spremiti 3D scene u Pythonu

Kako spremiti 3D scene u Pythonu

Aspose.3D FOSS for Python omogućuje vam spremanje Scene u bilo koji podržani izlazni format pomoću jednog Scene.save() poziva. Otkrivanje formata je automatsko kada proslijedite putanju datoteke; za napredne opcije poput binarnog izlaza ili ugrađivanja tekstura, pružate objekt s opcijama spremanja specifičnim za format.

Vodič korak po korak

Korak 1: Instalirajte paket

Instalirajte Aspose.3D FOSS s PyPI-ja. Nativne biblioteke nisu potrebne.

pip install aspose-3d-foss

Podržane Python verzije: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Korak 2: Uvezi potrebne klase

U najmanju ruku trebate Scene. Uvezite format‑specifični exporter ili save‑options class samo kada vam je potrebno ne‑zadano ponašanje.

from aspose.threed import Scene

Za opcije specifične za format:

from aspose.threed.formats.gltf import GltfSaveOptions, GltfExporter
from aspose.threed.formats.stl import StlFormat, StlSaveOptions
from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptions

Korak 3: Učitaj scenu

Učitajte postojeću scenu s diska koristeći Scene.from_file(). Biblioteka automatski otkriva izvorni format iz ekstenzije datoteke. Za izgradnju scene od početka, pogledajte Kako izraditi mrežu u Pythonu.

# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")

Alternativno, otvorite scenu s eksplicitnim opcijama putem Scene.open():

from aspose.threed import Scene

scene = Scene()
scene.open("input.fbx")

Korak 4: Spremi u STL

Pozovite Scene.save() s .stl putanjom. Zadano je da je izlaz ASCII STL. Za pisanje binarnog STL‑a (manja datoteka, bez čitljivog zaglavlja) upotrijebite StlSaveOptions.

# ASCII STL — format detected from the .stl extension
scene.save("output.stl")

# Binary STL — smaller file size
from aspose.threed.formats.stl import StlFormat, StlSaveOptions

stl_format = StlFormat()
options = stl_format.create_save_options()
options.binary_mode = True
scene.save("output_binary.stl", options)

Korak 5: Spremi u glTF ili GLB

GLTF 2.0 datoteke mogu se izvesti pomoću GltfExporter i GltfSaveOptions. Postavite binary_mode = True da biste proizveli samostalni .glb binarni paket; postavite binary_mode = False za JSON‑bazirani .gltf format.

import io
from aspose.threed.formats.gltf import GltfExporter, GltfSaveOptions

# Text glTF
options = GltfSaveOptions()
options.binary_mode = False
options.file_name = "output.gltf"

exporter = GltfExporter()
with open("output.gltf", "wb") as f:
    stream = io.BytesIO()
    exporter.export(scene, stream, options)
    f.write(stream.getvalue())

# Binary GLB
options_glb = GltfSaveOptions()
options_glb.binary_mode = True
options_glb.file_name = "output.glb"

stream_glb = io.BytesIO()
exporter.export(scene, stream_glb, options_glb)
with open("output.glb", "wb") as f:
    f.write(stream_glb.getvalue())

Korak 6: Spremi u FBX

FBX scene se izvoze putem FbxExporter. Upotrijebite FbxSaveOptions za omogućavanje kompresije ili umetanje tekstura u izlaznu datoteku.

from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions

options = FbxSaveOptions()
options.enable_compression = True
options.embed_textures = False  # keep textures as separate files

exporter = FbxExporter()
exporter.save(scene, "output.fbx", options)

Korak 7: Spremi u OBJ ili Collada (DAE)

Za OBJ i Collada, proslijedite putanju datoteke izravno u Scene.save(). Biblioteka otkriva format iz ekstenzije.

# OBJ — format auto-detected from .obj extension
scene.save("output.obj")

# Collada DAE — with material and coordinate-system options
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptions

options = ColladaSaveOptions()
options.enable_materials = True
options.flip_coordinate_system = False
options.indented = True

exporter = ColladaExporter()
exporter.export(scene, open("output.dae", "wb"), options)

Uobičajeni problemi i rješenja

Prazna izlazna datoteka nakon scene.save() Ovo obično znači da korijenski čvor scene nema podčvorove s geometrijom. Provjerite je li svaki čvor mreže pričvršćen na scene.root_node prije pozivanja save. Provjerite len(scene.root_node.child_nodes) nakon izgradnje scene.

AttributeError pri izgradnji geometrije mreže
Klasa Mesh pohranjuje vrhove kao internu listu kontrolnih točaka. Za detaljne obrasce izgradnje mreže, pogledajte članak How to Build a Mesh in Python koji pokriva stvaranje poligona, elemente vrhova i UV podatke.

GLB izlaz je veći od očekivanog
Binarni GLB ugrađuje sve geometrijske i teksturne podatke. Ako je GltfSaveOptions.flip_tex_coord_v postavljen na True, uključena je dodatna faza preokretanja koordinata. Postavite ga na False ako ne trebate preokretanje teksture po V‑osi.

FBX import/export round-trip loses materials
Izvoz FBX materijala kontrolira FbxSaveOptions.export_legacy_material_properties. Postavite ovo na True kako biste zapisali standardne FBX blokove materijala koje mogu čitati alati trećih strana.

Collada DAE ne uključuje materijale
Postavite ColladaSaveOptions.enable_materials = True (zadano je False) prije izvoza.

Često postavljana pitanja

Koje formate Aspose.3D FOSS za Python može izvesti?

Biblioteka podržava izvoz u: STL, glTF 2.0 (tekst i binarni GLB), FBX, OBJ, Collada (DAE) i 3MF. Detekcija formata je automatska kada proslijedite string putanje datoteke u Scene.save(); biblioteka čita ekstenziju kako bi odabrala ispravan izvoznik.

Postoji li streaming API za izvoz koji izbjegava pisanje na disk?

Da. GltfExporter.export(scene, stream, options) zapisuje u bilo koji io.BytesIO ili objekt sličan datoteci. Možete proslijediti međuspremnik u memoriji izravno u web odgovor ili daljnju obradu bez dodirivanja datotečnog sustava.

Kako pretvoriti scenu iz jednog formata u drugi?

Učitaj scenu s Scene.from_file("input.fbx") i spremi s scene.save("output.gltf"). Biblioteka upravlja pretvorbom u memoriji; nisu potrebni međufajlovi.

Mogu li spremiti više pod‑scena u odvojene datoteke?

Pristupite scene.sub_scenes kako biste iterirali kroz svaku pod‑scenu, stvorili novi Scene objekt, priložili relevantne čvorove i pozvali save() na svakom.

Prepisuje li Scene.save() postojeće datoteke tiho?

Da. Biblioteka ne podiže pogrešku ako odredišna datoteka već postoji; ona je prepisuje. Dodajte provjeru postojanja datoteke u svoj kod ako trebate zaštitu od slučajnih prepisivanja.

Vidi također

 Hrvatski