Como salvar cenas 3D em Python

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-foss

Versõ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 Scene

Para 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, ColladaSaveOptions

Passo 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.

Veja também

 Português