Cómo cargar modelos 3D en .NET

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

Verificar:

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.

 Español