Com carregar models 3D a .NET

Com carregar models 3D a .NET

Aspose.3D per a .NET ofereix una API senzilla per obrir fitxers 3D sense dependències natives. Després de carregar un fitxer en un objecte Scene, podeu recórrer la jerarquia de nodes i llegir les dades de geometria de cada malla.

Guia pas a pas

Pas 1: Instal·la el paquet

Afegeix el paquet NuGet al teu projecte:

dotnet add package Aspose.3D --version 26.1.0

Verifica:

using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");

Pas 2: Importa la classe Scene

La classe Scene és el contenidor de nivell superior per a totes les dades 3D. Importa l’espai de noms:

using Aspose.ThreeD;
using Aspose.ThreeD.Formats;

Pas 3: Carrega un fitxer

Utilitzeu Scene.Open() per carregar qualsevol format compatible. La biblioteca detecta el format a partir de l’extensió del fitxer:

var scene = new Scene();
scene.Open("model.obj");

O utilitzeu la fàbrica estàtica:

var scene = Scene.FromFile("model.obj");

Ambdós admeten OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY i 3MF.


Pas 4: Recórrer nodes d’escena

Una escena carregada és un arbre d’objectes Node arrelat a 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 pot portar un Entity (malla, càmera, llum). Comproveu node.Entity abans d’accedir.


Pas 5: Accedir a les dades de vèrtex i polígon

Converteix l’entitat d’un node a Mesh i llegeix els seus punts de control i polígons:

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})");
        }
    }
}

Pas 6: Aplica les opcions de càrrega específiques del format

Per a un control de gran detall, passa una subclasse LoadOptions:

var options = new ObjLoadOptions
{
    FlipCoordinateSystem = true,
    Scale = 0.01,
    EnableMaterials = true
};

var scene = new Scene();
scene.Open("model.obj", options);

Altres classes d’opció: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Problemes comuns i solucions

ImportException en cridar Scene.Open()

El fitxer pot estar corrupte o en una variant de format no compatible. Verifiqueu que el fitxer s’obre en un visualitzador 3D i que el format estigui a la llista de formats compatibles.

Materials que falten després de carregar OBJ

Col·loca el fitxer .mtl al costat del fitxer .obj i assegura’t que ObjLoadOptions.EnableMaterials = true.

Desajust del sistema de coordenades (el model sembla girat)

Estableix ObjLoadOptions.FlipCoordinateSystem = true o aplica una rotació al Transform del node arrel.

NullReferenceException accedint a node.Entity

No tots els nodes contenen geometria. Comproveu sempre if (node.Entity is Mesh mesh) abans d’accedir a les propietats de la malla.


Preguntes freqüents (FAQ)

Quins formats 3D puc carregar?

OBJ, STL (binari i ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY i 3MF.

Puc carregar des d’un flux?

Sí. Scene.Open() accepta un Stream:

using var stream = File.OpenRead("model.glb");
scene.Open(stream);

Com puc obtenir les normals de superfície?

Després de carregar, crida mesh.GetElement(VertexElementType.Normal) per accedir a la capa VertexElementNormal.

És la biblioteca segura per a fils?

Cada instància Scene és independent. Carregar fitxers separats en instàncies separades Scene des de fils separats és segur.

 Català