Cum să salvați scene 3D în Python

Cum să salvați scene 3D în Python

Aspose.3D FOSS pentru Python vă permite să salvați o Scene în orice format de ieșire acceptat folosind un singur apel Scene.save(). Detectarea formatului este automată atunci când transmiteți o cale de fișier; pentru opțiuni avansate, cum ar fi ieșirea binară sau încorporarea texturilor, furnizați un obiect de opțiuni de salvare specific formatului.

Ghid pas cu pas

Pasul 1: Instalarea pachetului

Instalați Aspose.3D FOSS din PyPI. Nu sunt necesare biblioteci native.

pip install aspose-3d-foss

Versiuni Python acceptate: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Pasul 2: Importarea claselor necesare

Aveți nevoie cel puțin de Scene. Importați exportatorul specific formatului sau clasa de opțiuni de salvare numai când aveți nevoie de un comportament non-implicit.

from aspose.threed import Scene

Pentru opțiuni specifice formatului:

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

Pasul 3: Încărcarea unei scene

Încărcați o scenă existentă de pe disc folosind Scene.from_file(). Biblioteca detectează automat formatul sursă din extensia fișierului. Pentru a construi o scenă de la zero, consultați Cum să construiți o plasă în Python.

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

Alternativ, deschideți o scenă cu opțiuni explicite prin Scene.open():

from aspose.threed import Scene

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

Pasul 4: Salvarea în STL

Apelați Scene.save() cu o cale .stl. În mod implicit, ieșirea este ASCII STL. Pentru a scrie un STL binar (fișier mai mic, fără antet lizibil de om), utilizați 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)

Pasul 5: Salvarea în glTF sau GLB

Fișierele GLTF 2.0 pot fi exportate folosind GltfExporter și GltfSaveOptions. Setați binary_mode = True pentru a produce un pachet binar .glb autoconținut; setați binary_mode = False pentru formatul .gltf bazat pe JSON.

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())

Pasul 6: Salvarea în FBX

Scenele FBX sunt exportate prin FbxExporter. Utilizați FbxSaveOptions pentru a activa compresia sau pentru a încorpora texturile în fișierul de ieșire.

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)

Pasul 7: Salvarea în OBJ sau Collada (DAE)

Pentru OBJ și Collada, transmiteți calea fișierului direct la Scene.save(). Biblioteca detectează formatul din extensie.

# 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)

Probleme frecvente și soluții

Fișier de ieșire gol după scene.save() Aceasta înseamnă de obicei că nodul rădăcină al scenei nu are noduri copil cu geometrie. Verificați că fiecare nod plasă a fost atașat la scene.root_node înainte de a apela save. Verificați len(scene.root_node.child_nodes) după construirea scenei.

AttributeError la construirea geometriei plasei Clasa Mesh stochează vârfurile ca o listă internă de puncte de control. Pentru modele detaliate de construcție a plasei, consultați articolul Cum să construiți o plasă în Python, care acoperă crearea poligoanelor, elementele de vârf și datele UV.

Ieșirea GLB este mai mare decât era de așteptat GLB binar încorporează toate datele de geometrie și textură. Dacă GltfSaveOptions.flip_tex_coord_v este setat la True, este inclus un pas suplimentar de inversare a coordonatelor. Setați-l la False dacă nu aveți nevoie de inversarea texturii pe axa V.

Ciclul de import/export FBX pierde materiale Exportul de material FBX este controlat de FbxSaveOptions.export_legacy_material_properties. Setați aceasta la True pentru a scrie blocuri de material FBX standard pe care instrumentele terțe le pot citi.

Collada DAE nu include materiale Setați ColladaSaveOptions.enable_materials = True (implicit este False) înainte de exportare.

Întrebări frecvente

Ce formate poate exporta Aspose.3D FOSS pentru Python?

Biblioteca acceptă exportul în: STL, glTF 2.0 (text și GLB binar), FBX, OBJ, Collada (DAE) și 3MF. Detectarea formatului este automată atunci când transmiteți un șir de cale de fișier la Scene.save(); biblioteca citește extensia pentru a selecta exportatorul corect.

Există un API de export prin streaming care evită scrierea pe disc?

Da. GltfExporter.export(scene, stream, options) scrie în orice io.BytesIO sau obiect asemănător unui fișier. Puteți transmite buffer-ul din memorie direct la un răspuns web sau la procesare ulterioară fără a atinge sistemul de fișiere.

Cum convertesc o scenă dintr-un format în altul?

Încărcați scena cu Scene.from_file("input.fbx") și salvați cu scene.save("output.gltf"). Biblioteca gestionează conversia în memorie; nu sunt necesare fișiere intermediare.

Pot salva mai multe sub-scene în fișiere separate?

Accesați scene.sub_scenes pentru a itera peste fiecare sub-scenă, creați un nou obiect Scene, atașați nodurile relevante și apelați save() pe fiecare.

Scene.save() suprascrie fișierele existente în mod silențios?

Da. Biblioteca nu generează o eroare dacă fișierul țintă există deja; îl suprascrie. Adăugați o verificare a existenței fișierului în codul dvs. dacă trebuie să vă protejați împotriva suprascrierilor accidentale.

Vezi și

 Română