Introdução
O conteúdo 3D raramente permanece em um único formato durante todo o seu ciclo de vida. Um modelo pode originar como um arquivo OBJ exportado de um aplicativo de modelagem, percorrer um pipeline de impressão 3D como STL, aparecer em um aplicativo web como glTF e terminar em uma ferramenta de manufatura aditiva como 3MF. Cada formato atende a um público diferente e a uma ferramenta downstream distinta, e a conversão entre eles é algo que a maioria dos pipelines 3D precisa lidar de forma confiável.
Python é uma escolha natural para este trabalho: scripts de shell são muito frágeis, e integrações completas de ferramentas DCC (digital content creation) são muito pesadas para processamento em lote. O que você precisa é de uma biblioteca que possa carregar qualquer um desses formatos, fornecer um grafo de cena consistente e gravar de volta em qualquer formato de destino sem exigir uma GUI ou um driver gráfico.
Aspose.3D FOSS for Python (aspose-3d-foss, licença MIT) preenche essa lacuna. Este guia mostra os caminhos de conversão mais comuns com exemplos de código completos e executáveis.
Quais formatos o Aspose.3D FOSS suporta?
| Formato | Extensão(s) | Carregar | Salvar | Caso de Uso Comum |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Sim | Sim | Intercâmbio de ferramentas de modelagem; arquivos de material .mtl suportados |
| STL | .stl | Sim | Sim | Impressão 3D, exportação CAD; variantes binárias e ASCII |
| glTF 2.0 / GLB | .gltf, .glb | Sim | Sim | Visualizadores web, motores de jogo; GLB é a variante binária autônoma |
| COLLADA | .dae | Sim | Sim | Importação de ferramentas de animação; ColladaSaveOptions suporta exportação |
| 3MF | .3mf | Sim | Sim | Manufatura aditiva, metadados de impressão mais ricos que STL |
A detecção de formato é automática a partir da extensão do arquivo. Classes de opções específicas de formato (ObjLoadOptions, StlSaveOptions, GltfSaveOptions) estão disponíveis quando você precisa de controle granular.
Nota sobre FBX: A biblioteca inclui um tokenizador parcial de FBX para importação. FBX não é recomendado para fluxos de trabalho de conversão em produção nesta versão; use OBJ ou glTF como formatos intermediários.
OBJ para STL: Preparando um Modelo para Impressão 3D
OBJ é o formato de saída mais comum de ferramentas de modelagem e escultura. STL é a língua franca dos fatiadores de impressão 3D. Converter entre eles é uma única chamada.
from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
opts = StlSaveOptions()
scene.save("model.stl", opts)
STL codifica apenas faces triangulares. Se o seu arquivo OBJ contém faces quad ou n‑gon, o exportador triangula‑as automaticamente antes de gravar. Se você quiser controlar a triangulação explicitamente antes de salvar, chame mesh.triangulate() em cada malha na cena:
from aspose.threed import Scene
from aspose.threed.entities import Mesh
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
def triangulate_all(node):
if isinstance(node.entity, Mesh):
# entity setter clears existing entities and sets the new one
node.entity = node.entity.triangulate()
for child in node.child_nodes:
triangulate_all(child)
triangulate_all(scene.root_node)
scene.save("model_triangulated.stl", StlSaveOptions())
OBJ para glTF: Exportando para Web e Motores de Jogo
glTF 2.0 é o formato de intercâmbio preferido para renderizadores em tempo real, visualizadores WebGL e motores de jogo como Babylon.js, Three.js e Unity. GLB (a variante binária) empacota geometria, texturas e materiais em um único arquivo autônomo, que é mais fácil de servir via HTTP.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("model.obj")
##Save as JSON-based glTF (external buffer)
opts_gltf = GltfSaveOptions()
scene.save("model.gltf", opts_gltf)
##Save as self-contained GLB binary: preferred for web delivery
scene.save("model.glb", GltfSaveOptions())
O formato é inferido a partir da extensão do arquivo: .gltf produz o par JSON+buffer binário; .glb produz o binário de arquivo único. Os dados de material OBJ (LambertMaterial, PhongMaterial) são transportados para a representação de material PBR do glTF onde existe um equivalente.
STL para glTF: De Saída de Scanner ou CAD para Web
Arquivos STL de scanners 3D e sistemas CAD são entradas comuns que precisam ser tornados visualizáveis na web. STL contém apenas geometria de triângulos e nenhum dado de material, portanto a conversão é simples.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())
Se o STL foi produzido por uma ferramenta CAD com um sistema de coordenadas incomum (Z-up vs Y-up), você pode inspecionar e corrigir a transformação do nó raiz antes de salvar:
import math
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("cad_export.stl")
# Rotate -90 degrees around X to convert Z-up to Y-up
# set_euler_angles takes radians, not degrees
root = scene.root_node
root.transform.set_euler_angles(-math.pi / 2, 0.0, 0.0)
scene.save("cad_export_yup.glb", GltfSaveOptions())
glTF para 3MF: Preparando para Fabricação Aditiva
3MF é um formato moderno de impressão 3D apoiado pelo Consórcio 3MF. Ele suporta metadados mais ricos que o STL (cor, atribuições de material, instruções de construção) e é aceito por softwares de fatiamento como PrusaSlicer e Bambu Studio. Se você está entregando modelos de um visualizador web para um fluxo de trabalho de impressão, converter GLB para 3MF é uma etapa útil.
from aspose.threed import Scene
from aspose.threed import FileFormat
from aspose.threed.formats import SaveOptions
scene = Scene.from_file("model.glb")
scene.save("model.3mf")
O formato 3MF é detectado automaticamente a partir da extensão .3mf. Para controle explícito, passe uma instância SaveOptions configurada para 3MF.
Padrão de Conversão em Lote
Na prática, as tarefas de conversão operam em diretórios de arquivos em vez de arquivos individuais. O padrão a seguir lida com uma pasta de arquivos OBJ e converte cada um para GLB, com tratamento de erro por arquivo, de modo que um único arquivo defeituoso não interrompa toda a execução.
import os
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
input_dir = "./obj_files"
output_dir = "./glb_files"
os.makedirs(output_dir, exist_ok=True)
opts = GltfSaveOptions()
results = {"ok": [], "failed": []}
for filename in os.listdir(input_dir):
if not filename.lower().endswith(".obj"):
continue
src = os.path.join(input_dir, filename)
stem = os.path.splitext(filename)[0]
dst = os.path.join(output_dir, stem + ".glb")
try:
scene = Scene.from_file(src)
scene.save(dst, opts)
results["ok"].append(filename)
print(f"OK {filename} -> {stem}.glb")
except Exception as exc:
results["failed"].append((filename, str(exc)))
print(f"ERR {filename}: {exc}")
print(f"\n{len(results['ok'])} converted, {len(results['failed'])} failed.")
if results["failed"]:
for name, reason in results["failed"]:
print(f" {name}: {reason}")
Esse padrão se estende naturalmente a outros pares de formatos de origem/destino: altere o filtro de extensão e a classe SaveOptions para qualquer combinação na tabela de suporte acima.
Conclusão
Aspose.3D FOSS for Python torna a conversão de formatos simples: carregue com Scene.from_file, opcionalmente inspecione ou modifique o grafo de cena, então salve com o SaveOptions apropriado. A biblioteca lida com triangulação, normalização de coordenadas e peculiaridades específicas de cada formato internamente.
Para uma lista completa de classes e métodos, veja a Referência da API. Para aprofundar-se no modelo de grafo de cena (nós, malhas, transformações), veja:
- Classe Scene: carregamento, salvamento e metadados ao nível da cena
- Classe Node: hierarquia, transformações, anexação de entidade
- Classe Mesh: dados de vértices, polígonos, elementos de vértice
- Como Carregar Modelos 3D em Python
- PyPI: aspose-3d-foss