Como Carregar Modelos 3D no .NET
Aspose.3D for .NET fornece uma API simples para abrir arquivos 3D sem dependências nativas. Após carregar um arquivo em um objeto Scene, você pode percorrer a hierarquia de nós e ler os dados de geometria de cada malha.
Guia passo a passo
Etapa 1: Instalar o Pacote
Adicione o pacote NuGet ao seu projeto:
dotnet add package Aspose.3D --version 26.1.0Verificar:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Etapa 2: Importar a Classe Scene
A classe Scene é o contêiner de nível superior para todos os dados 3D. Importe o namespace:
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;Etapa 3: Carregar um Arquivo
Use Scene.Open() para carregar qualquer formato suportado. A biblioteca detecta o formato a partir da extensão do arquivo:
var scene = new Scene();
scene.Open("model.obj");Ou use a fábrica estática:
var scene = Scene.FromFile("model.obj");Ambos suportam OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY e 3MF.
Etapa 4: Percorrer nós da cena
Uma cena carregada é uma árvore de objetos Node com raiz em scene.RootNode:
void Walk(Node node, int depth = 0)
{
var indent = new string(' ', depth * 2);
Console.WriteLine($"{indent}Node: {node.Name}");
foreach (var child in node.ChildNodes)
Walk(child, depth + 1);
}
Walk(scene.RootNode);Cada Node pode conter um Entity (malha, câmera, luz). Verifique node.Entity antes de acessar.
Passo 5: Acessar Dados de Vértices e Polígonos
Converta a entidade de um nó para Mesh e leia seus pontos de controle e polígonos:
using Aspose.ThreeD.Entities;
foreach (var node in scene.RootNode.ChildNodes)
{
if (node.Entity is Mesh mesh)
{
Console.WriteLine($"Mesh '{node.Name}': " +
$"{mesh.ControlPoints.Count} vertices, " +
$"{mesh.PolygonCount} polygons");
if (mesh.ControlPoints.Count > 0)
{
var v = mesh.ControlPoints[0];
Console.WriteLine($" First vertex: ({v.X:F4}, {v.Y:F4}, {v.Z:F4})");
}
}
}Etapa 6: Aplicar Opções de Carregamento Específicas do Formato
Para controle granular, passe uma subclasse LoadOptions:
var options = new ObjLoadOptions
{
FlipCoordinateSystem = true,
Scale = 0.01,
EnableMaterials = true
};
var scene = new Scene();
scene.Open("model.obj", options);Outras classes de opção: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.
Problemas Comuns e Soluções
ImportException ao chamar Scene.Open()
O arquivo pode estar corrompido ou em uma variante de formato não suportada. Verifique se o arquivo abre em um visualizador 3D e se o formato está na lista de suportados.
Materiais ausentes após carregamento OBJ
Coloque o arquivo .mtl ao lado do arquivo .obj e garanta ObjLoadOptions.EnableMaterials = true.
Descompasso de sistema de coordenadas (modelo parece rotacionado)
Defina ObjLoadOptions.FlipCoordinateSystem = true ou aplique uma rotação ao Transform do nó raiz.
NullReferenceException acessando node.Entity
Nem todo nó contém geometria. Sempre verifique if (node.Entity is Mesh mesh) antes de acessar as propriedades da malha.
Perguntas Frequentes (FAQ)
Quais formatos 3D posso carregar?
OBJ, STL (binário e ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY e 3MF.
Posso carregar a partir de um fluxo?
Sim. Scene.Open() aceita um Stream:
using var stream = File.OpenRead("model.glb");
scene.Open(stream);Como obtenho normais de superfície?
Após o carregamento, chame mesh.GetElement(VertexElementType.Normal) para acessar a camada VertexElementNormal.
A biblioteca é thread‑safe?
Cada instância Scene é independente. Carregar arquivos separados em instâncias Scene separadas a partir de threads distintas é seguro.