Cómo guardar escenas 3D en Python

Cómo guardar escenas 3D en Python

Aspose.3D FOSS for Python le permite guardar un Scene en cualquier formato de salida compatible mediante una única llamada Scene.save(). La detección de formato es automática cuando se proporciona una ruta de archivo; para opciones avanzadas como salida binaria o incrustación de texturas, se suministra un objeto de opciones de guardado específico del formato.

Guía paso a paso

Paso 1: Instalar el paquete

Instale Aspose.3D FOSS desde PyPI. No se requieren bibliotecas nativas.

pip install aspose-3d-foss

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


Paso 2: Importar clases requeridas

Al menos necesitas Scene. Importa la clase exportadora o de opciones de guardado específica del formato solo cuando necesites un comportamiento no predeterminado.

from aspose.threed import Scene

Para opciones específicas de 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

Paso 3: Cargar una escena

Cargue una escena existente desde el disco usando Scene.from_file(). La biblioteca detecta el formato de origen automáticamente a partir de la extensión del archivo. Para crear una escena desde cero, consulte Cómo crear una malla en Python.

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

Alternativamente, abra una escena con opciones explícitas mediante Scene.open():

from aspose.threed import Scene

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

Paso 4: Guardar en STL

Llame a Scene.save() con una ruta .stl. Por defecto, la salida es ASCII STL. Para escribir un STL binario (archivo más pequeño, sin encabezado legible por humanos) use 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)

Paso 5: Guardar en glTF o GLB

Los archivos GLTF 2.0 pueden exportarse usando GltfExporter y GltfSaveOptions. Configure binary_mode = True para producir un paquete binario .glb autocontenido; configure binary_mode = False para el formato .gltf basado 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())

Paso 6: Guardar en FBX

Las escenas FBX se exportan a través de FbxExporter. Utilice FbxSaveOptions para habilitar la compresión o incrustar texturas en el archivo de salida.

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)

Paso 7: Guardar como OBJ o Collada (DAE)

Para OBJ y Collada, pase la ruta del archivo directamente a Scene.save(). La biblioteca detecta el formato a partir de la extensión.

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

Problemas comunes y soluciones

Archivo de salida vacío después de scene.save()
Esto generalmente significa que el nodo raíz de la escena no tiene nodos hijos con geometría. Verifique que cada nodo de malla esté adjunto a scene.root_node antes de llamar a save. Revise len(scene.root_node.child_nodes) después de construir la escena.

AttributeError al construir geometría de malla
La clase Mesh almacena los vértices como una lista interna de puntos de control. Para patrones detallados de construcción de mallas, consulte el artículo Cómo crear una malla en Python que cubre la creación de polígonos, elementos de vértices y datos UV.

GLB output is larger than expected Binary GLB incrusta todos los datos de geometría y textura. Si GltfSaveOptions.flip_tex_coord_v está configurado en True, se incluye una pasada adicional de inversión de coordenadas. Establécelo en False si no necesitas invertir la textura en el eje V.

El recorrido de importación/exportación de FBX pierde materiales
La exportación de materiales FBX está controlada por FbxSaveOptions.export_legacy_material_properties. Configúrelo a True para escribir bloques de material FBX estándar que las herramientas de terceros puedan leer.

Collada DAE no incluye materiales
Establezca ColladaSaveOptions.enable_materials = True (es False por defecto) antes de exportar.

Preguntas Frecuentes

¿Qué formatos puede exportar Aspose.3D FOSS para Python?

La biblioteca admite la exportación a: STL, glTF 2.0 (texto y GLB binario), FBX, OBJ, Collada (DAE) y 3MF. La detección de formato es automática cuando pasa una cadena de ruta de archivo a Scene.save(); la biblioteca lee la extensión para seleccionar el exportador correcto.

¿Existe una API de exportación en streaming que evite escribir en disco?

Sí. GltfExporter.export(scene, stream, options) escribe en cualquier io.BytesIO u objeto similar a un archivo. Puedes pasar el búfer en memoria directamente a una respuesta web o a un procesamiento posterior sin tocar el sistema de archivos.

¿Cómo convierto una escena de un formato a otro?

Cargue la escena con Scene.from_file("input.fbx") y guárdela con scene.save("output.gltf"). La biblioteca maneja la conversión en memoria; no se necesitan archivos intermedios.

¿Puedo guardar varias subescenas en archivos separados?

Acceda scene.sub_scenes para iterar sobre cada subescena, cree un nuevo objeto Scene, adjunte los nodos relevantes y llame a save() en cada uno.

¿Scene.save() sobrescribe los archivos existentes silenciosamente?

Sí. La biblioteca no genera un error si el archivo de destino ya existe; lo sobrescribe. Añade una verificación de existencia de archivo en tu código si necesitas protegerte contra sobrescrituras accidentales.

Ver también

 Español