Como salvar cenas 3D em Python
Aspose.3D FOSS para Python permite salvar uma Scene em qualquer formato de saída suportado com uma única chamada Scene.save(). A detecção do formato é automática quando você fornece um caminho de arquivo; para opções avançadas, como saída binária ou incorporação de texturas, você fornece um objeto de opções de salvamento específico do formato.
Guia passo a passo
Passo 1: Instalar o pacote
Instale o Aspose.3D FOSS do PyPI. Não são necessárias bibliotecas nativas.
pip install aspose-3d-fossVersões do Python suportadas: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Passo 2: Importar classes necessárias
No mínimo, você precisa de Scene. Importe o exportador específico do formato ou a classe de opções de salvamento apenas quando precisar de um comportamento não padrão.
from aspose.threed import ScenePara opções 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, ColladaSaveOptionsPasso 3: Carregar uma cena
Carregue uma cena existente do disco usando Scene.from_file(). A biblioteca detecta o formato de origem automaticamente a partir da extensão do arquivo. Para criar uma cena do zero, consulte Como construir uma malha em Python.
# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")Alternativamente, abra uma cena com opções explícitas via Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")Passo 4: Salvar em STL
Chame Scene.save() com um caminho .stl. Por padrão, a saída é ASCII STL. Para gravar um STL binário (arquivo menor, sem cabeçalho legível 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)Passo 5: Salvar em glTF ou GLB
Os arquivos GLTF 2.0 podem ser exportados usando GltfExporter e GltfSaveOptions. Defina binary_mode = True para produzir um pacote binário .glb autônomo; defina binary_mode = False para o formato .gltf baseado em 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: Salvar em FBX
As cenas FBX são exportadas via FbxExporter. Use FbxSaveOptions para habilitar a compressão ou incorporar texturas no arquivo de saída.
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: Salvar em OBJ ou Collada (DAE)
Para OBJ e Collada, passe o caminho do arquivo diretamente para Scene.save(). A biblioteca detecta o formato a partir da extensão.
# 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 comuns e soluções
Arquivo de saída vazio após scene.save()
Isso geralmente significa que o nó raiz da cena não tem nós filhos com geometria. Verifique se cada nó de malha foi anexado a scene.root_node antes de chamar save. Verifique len(scene.root_node.child_nodes) após construir a cena.
AttributeError ao construir geometria de malha
A classe Mesh armazena vértices como uma lista interna de pontos de controle. Para padrões detalhados de construção de malha, consulte o artigo Como construir uma malha em Python, que abrange criação de polígonos, elementos de vértice e dados UV.
A saída GLB é maior do que o esperado
O GLB binário incorpora todos os dados de geometria e textura. Se GltfSaveOptions.flip_tex_coord_v estiver definido como True, uma passagem adicional de inversão de coordenadas será incluída. Defina-o como False se você não precisar da inversão de textura no eixo V.
O round-trip de importação/exportação FBX perde materiais
A exportação de material FBX é controlada por FbxSaveOptions.export_legacy_material_properties. Defina isso como True para escrever blocos de material FBX padrão que ferramentas de terceiros possam ler.
Collada DAE não inclui materiais
Defina ColladaSaveOptions.enable_materials = True (o padrão é False) antes de exportar.
Perguntas frequentes
Quais formatos o Aspose.3D FOSS para Python pode exportar?
A biblioteca suporta exportação para: STL, glTF 2.0 (texto e GLB binário), FBX, OBJ, Collada (DAE) e 3MF. A detecção do formato é automática quando você passa uma string de caminho de arquivo para Scene.save(); a biblioteca lê a extensão para selecionar o exportador correto.
Existe uma API de exportação em streaming que evita a gravação em disco?
Sim. GltfExporter.export(scene, stream, options) grava em qualquer io.BytesIO ou objeto semelhante a um arquivo. Você pode passar o buffer em memória diretamente para uma resposta web ou processamento adicional sem tocar no sistema de arquivos.
Como converter uma cena de um formato para outro?
Carregue a cena com Scene.from_file("input.fbx") e salve com scene.save("output.gltf"). A biblioteca lida com a conversão em memória; nenhum arquivo intermediário é necessário.
Posso salvar várias subcenas em arquivos separados?
Acesse scene.sub_scenes para iterar sobre cada subcena, crie um novo objeto Scene, anexe os nós relevantes e chame save() em cada um.
Scene.save() sobrescreve arquivos existentes silenciosamente?
Sim. A biblioteca não gera um erro se o arquivo de destino já existir; ela o sobrescreve. Adicione uma verificação de existência de arquivo em seu código se precisar se proteger contra sobrescritas acidentais.