Come salvare scene 3D in Python

Come salvare scene 3D in Python

Aspose.3D FOSS per Python ti consente di salvare un Scene in qualsiasi formato di output supportato usando una singola chiamata Scene.save(). Il rilevamento del formato è automatico quando fornisci un percorso file; per opzioni avanzate come output binario o incorporamento delle texture, fornisci un oggetto di opzioni di salvataggio specifico per il formato.

Guida passo-passo

Passo 1: Installa il pacchetto

Installa Aspose.3D FOSS da PyPI. Non sono richieste librerie native.

pip install aspose-3d-foss

Versioni Python supportate: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Passo 2: Importa le classi necessarie

Al minimo hai bisogno di Scene. Importa la classe esportatore specifica del formato o le opzioni di salvataggio solo quando hai bisogno di un comportamento non predefinito.

from aspose.threed import Scene

Per le opzioni specifiche del formato:

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

Passo 3: Carica una scena

Carica una scena esistente dal disco usando Scene.from_file(). La libreria rileva automaticamente il formato di origine dall’estensione del file. Per creare una scena da zero, vedi Come creare una mesh in Python.

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

In alternativa, apri una scena con opzioni esplicite tramite Scene.open():

from aspose.threed import Scene

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

Passo 4: Salva in STL

Chiama Scene.save() con un percorso .stl. Per impostazione predefinita l’output è ASCII STL. Per scrivere un STL binario (file più piccolo, senza intestazione leggibile) usa 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)

Passo 5: Salva in glTF o GLB

I file GLTF 2.0 possono essere esportati usando GltfExporter e GltfSaveOptions. Imposta binary_mode = True per produrre un bundle binario .glb autonomo; imposta binary_mode = False per il formato .gltf basato su 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())

Passo 6: Salva in FBX

Le scene FBX vengono esportate tramite FbxExporter. Usa FbxSaveOptions per abilitare la compressione o incorporare le texture nel file di output.

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)

Passo 7: Salva in OBJ o Collada (DAE)

Per OBJ e Collada, passa il percorso del file direttamente a Scene.save(). La libreria rileva il formato dall’estensione.

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

Problemi comuni e soluzioni

File di output vuoto dopo scene.save()
Di solito ciò significa che il nodo radice della scena non ha nodi figlio con geometria. Verifica che ogni nodo mesh sia stato collegato a scene.root_node prima di chiamare save. Controlla len(scene.root_node.child_nodes) dopo aver costruito la scena.

AttributeError durante la costruzione della geometria della mesh
La classe Mesh memorizza i vertici come un elenco interno di punti di controllo. Per modelli dettagliati di costruzione della mesh, fare riferimento all’articolo Come creare una mesh in Python che copre la creazione di poligoni, gli elementi dei vertici e i dati UV.

L’output GLB è più grande del previsto
Il GLB binario incorpora tutti i dati di geometria e texture. Se GltfSaveOptions.flip_tex_coord_v è impostato su True, viene inclusa un’ulteriore passata di inversione delle coordinate. Impostalo su False se non hai bisogno dell’inversione della texture sull’asse V.

Il round‑trip di import/export FBX perde i materiali
L’esportazione dei materiali FBX è controllata da FbxSaveOptions.export_legacy_material_properties. Impostare questo su True per scrivere blocchi di materiale FBX standard che gli strumenti di terze parti possono leggere.

Collada DAE non include i materiali
Imposta ColladaSaveOptions.enable_materials = TrueFalse per impostazione predefinita) prima dell’esportazione.

Domande Frequenti

Quali formati può esportare Aspose.3D FOSS per Python?

La libreria supporta l’esportazione in: STL, glTF 2.0 (testo e binario GLB), FBX, OBJ, Collada (DAE) e 3MF. Il rilevamento del formato è automatico quando si passa una stringa di percorso file a Scene.save(); la libreria legge l’estensione per selezionare l’esportatore corretto.

Esiste un’API di esportazione in streaming che eviti di scrivere su disco?

Sì. GltfExporter.export(scene, stream, options) scrive su qualsiasi io.BytesIO o oggetto simile a un file. Puoi passare il buffer in memoria direttamente a una risposta web o a un’ulteriore elaborazione senza toccare il file system.

Come faccio a convertire una scena da un formato all’altro?

Carica la scena con Scene.from_file("input.fbx") e salva con scene.save("output.gltf"). La libreria gestisce la conversione in memoria; non sono necessari file intermedi.

Posso salvare più sotto‑scene in file separati?

Accedi a scene.sub_scenes per iterare su ogni sotto‑scena, crea un nuovo oggetto Scene, collega i nodi pertinenti e chiama save() su ciascuno.

Sovrascrive Scene.save() i file esistenti silenziosamente?

Sì. La libreria non genera un errore se il file di destinazione esiste già; lo sovrascrive. Aggiungi un controllo di esistenza del file nel tuo codice se devi proteggerti da sovrascritture accidentali.

Vedi anche

 Italiano