Cómo cargar modelos 3D en .NET
Aspose.3D para .NET proporciona una API sencilla para abrir archivos 3D sin dependencias nativas. Después de cargar un archivo en un objeto Scene, puedes recorrer la jerarquía de nodos y leer los datos de geometría de cada malla.
Guía paso a paso
Paso 1: Instalar el paquete
Agrega el paquete NuGet a tu proyecto:
dotnet add package Aspose.3D --version 26.1.0Verificar:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Paso 2: Importar la clase Scene
La clase Scene es el contenedor de nivel superior para todos los datos 3D. Importe el espacio de nombres:
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;Paso 3: Cargar un archivo
Utilice Scene.Open() para cargar cualquier formato compatible. La biblioteca detecta el formato a partir de la extensión del archivo:
var scene = new Scene();
scene.Open("model.obj");O use la fábrica estática:
var scene = Scene.FromFile("model.obj");Ambos admiten OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY y 3MF.
Paso 4: Recorrer nodos de escena
Una escena cargada es un árbol de objetos Node con raíz en 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 puede llevar un Entity (malla, cámara, luz). Verifique node.Entity antes de acceder.
Paso 5: Acceder a los datos de vértices y polígonos
Convierta la entidad de un nodo a Mesh y lea sus puntos de control y 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})");
}
}
}Paso 6: Aplicar opciones de carga específicas del formato
Para un control granular, pase una subclase LoadOptions:
var options = new ObjLoadOptions
{
FlipCoordinateSystem = true,
Scale = 0.01,
EnableMaterials = true
};
var scene = new Scene();
scene.Open("model.obj", options);Otras clases de opción: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.
Problemas comunes y soluciones
ImportException al llamar a Scene.Open()
El archivo puede estar dañado o en una variante de formato no compatible. Verifique que el archivo se abra en un visor 3D y que el formato esté en la lista de formatos compatibles.
Materiales faltantes después de cargar OBJ
Coloque el archivo .mtl junto al archivo .obj y asegúrese de ObjLoadOptions.EnableMaterials = true.
Desajuste del sistema de coordenadas (el modelo parece rotado)
Establezca ObjLoadOptions.FlipCoordinateSystem = true o aplique una rotación al Transform del nodo raíz.
NullReferenceException accediendo node.Entity
No todos los nodos llevan geometría. Siempre verifica if (node.Entity is Mesh mesh) antes de acceder a las propiedades de la malla.
Preguntas Frecuentes (FAQ)
¿Qué formatos 3D puedo cargar?
OBJ, STL (binario y ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY y 3MF.
¿Puedo cargar desde un flujo?
Sí. Scene.Open() acepta un Stream:
using var stream = File.OpenRead("model.glb");
scene.Open(stream);¿Cómo obtengo las normales de superficie?
Después de cargar, llame a mesh.GetElement(VertexElementType.Normal) para acceder a la capa VertexElementNormal.
¿La biblioteca es segura para subprocesos?
Cada instancia Scene es independiente. Cargar archivos separados en instancias Scene separadas desde hilos separados es seguro.