Com desar escenes 3D a Python

Com desar escenes 3D a Python

Aspose.3D FOSS per a Python us permet desar un Scene a qualsevol format de sortida compatible mitjançant una única crida Scene.save(). La detecció del format és automàtica quan proporciones una ruta de fitxer; per a opcions avançades com ara sortida binària o incrustació de textures, proporciones un objecte save‑options específic del format.

Guia pas a pas

Pas 1: Instal·la el paquet

Instal·la Aspose.3D FOSS des de PyPI. No es requereixen biblioteques natives.

pip install aspose-3d-foss

Versions de Python compatibles: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Pas 2: Importa les classes necessàries

Com a mínim necessites Scene. Importa l’exportador específic del format o la classe d’opcions de desament només quan necessitis un comportament no predeterminat.

from aspose.threed import Scene

Per a opcions específiques del 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

Pas 3: Carrega una escena

Carrega una escena existent des del disc utilitzant Scene.from_file(). La biblioteca detecta el format d’origen automàticament a partir de l’extensió del fitxer. Per crear una escena des de zero, consulta How to Build a Mesh in Python.

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

Alternativament, obre una escena amb opcions explícites via Scene.open():

from aspose.threed import Scene

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

Pas 4: Desar a STL

Crida Scene.save() amb un camí .stl. Per defecte la sortida és STL ASCII. Per escriure un STL binari (fitxer més petit, sense capçalera llegible per a humans) utilitza 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)

Pas 5: Desa a glTF o GLB

Els fitxers GLTF 2.0 es poden exportar mitjançant GltfExporter i GltfSaveOptions. Estableix binary_mode = True per produir un paquet binari autocontingut .glb; estableix binary_mode = False per al format .gltf basat en 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())

Pas 6: Desar a FBX

Les escenes FBX s’exporten mitjançant FbxExporter. Utilitzeu FbxSaveOptions per habilitar la compressió o incrustar textures al fitxer de sortida.

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)

Pas 7: Desar a OBJ o Collada (DAE)

Per a OBJ i Collada, passeu la ruta del fitxer directament a Scene.save(). La biblioteca detecta el format a partir de l’extensió.

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

Problemes comuns i solucions

Fitxer de sortida buit després de scene.save()
Això sol significar que el node arrel de l’escena no té nodes fills amb geometria. Verifiqueu que cada node de malla s’hagi adjuntat a scene.root_node abans de cridar save. Comproveu len(scene.root_node.child_nodes) després de construir l’escena.

AttributeError en construir geometria de malla
La classe Mesh emmagatzema vèrtexs com una llista interna de punts de control. Per a patrons detallats de construcció de malla, consulteu l’article Com construir una malla en Python que cobreix la creació de polígons, elements de vèrtex i dades UV.

La sortida GLB és més gran del que s’esperava
El GLB binari incorpora totes les dades de geometria i textura. Si GltfSaveOptions.flip_tex_coord_v està configurat a True, s’inclou una passada addicional de gir de coordenades. Configureu-lo a False si no necessiteu gir de textura a l’eix V.

El viatge d’anada i tornada d’importació/exportació FBX perd materials
L’exportació de material FBX està controlada per FbxSaveOptions.export_legacy_material_properties. Configura això a True per escriure blocs de material FBX estàndard que les eines de tercers puguin llegir.

Collada DAE no inclou materials
Estableix ColladaSaveOptions.enable_materials = True (és False per defecte) abans d’exportar.

Preguntes freqüents

Quins formats pot exportar Aspose.3D FOSS per a Python?

La biblioteca admet l’exportació a: STL, glTF 2.0 (text i binari GLB), FBX, OBJ, Collada (DAE) i 3MF. La detecció del format és automàtica quan passeu una cadena de ruta de fitxer a Scene.save(); la biblioteca llegeix l’extensió per seleccionar l’exportador correcte.

Existeix una API d’exportació en streaming que eviti escriure al disc?

Sí. GltfExporter.export(scene, stream, options) escriu a qualsevol io.BytesIO o objecte similar a un fitxer. Podeu passar el buffer en memòria directament a una resposta web o a un processament posterior sense tocar el sistema de fitxers.

Com puc convertir una escena d’un format a un altre?

Carrega l’escena amb Scene.from_file("input.fbx") i desa amb scene.save("output.gltf"). La biblioteca gestiona la conversió en memòria; no calen fitxers intermedis.

Puc desar diverses subescenes en fitxers separats?

Accediu a scene.sub_scenes per iterar sobre cada subescena, creeu un nou objecte Scene, adjunteu els nodes rellevants i crideu save() a cadascun.

Sobreescriu Scene.save() els fitxers existents silenciosament?

Sí. La biblioteca no genera cap error si el fitxer de destinació ja existeix; el sobreescriu. Afegeix una comprovació d’existència del fitxer al teu codi si necessites protegir-te contra sobrescripcions accidentals.

Vegeu també

 Català