Come caricare modelli 3D in .NET

Come caricare modelli 3D in .NET

Aspose.3D per .NET fornisce un’API semplice per aprire file 3D senza dipendenze native. Dopo aver caricato un file in un oggetto Scene è possibile attraversare la gerarchia dei nodi e leggere i dati geometrici di ogni mesh.

Guida passo-passo

Passo 1: Installa il pacchetto

Aggiungi il pacchetto NuGet al tuo progetto:

dotnet add package Aspose.3D --version 26.1.0

Verifica:

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

Passo 2: Importa la classe Scene

La classe Scene è il contenitore di livello superiore per tutti i dati 3D. Importa lo spazio dei nomi:

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

Passo 3: Carica un file

Usa Scene.Open() per caricare qualsiasi formato supportato. La libreria rileva il formato dall’estensione del file:

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

Oppure usa la factory statica:

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

Entrambi supportano OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY e 3MF.


Passo 4: Attraversa i nodi della scena

Una scena caricata è un albero di oggetti Node con radice 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);

Ogni Node può contenere un Entity (mesh, camera, light). Controlla node.Entity prima di accedere.


Passo 5: Accedi ai dati dei vertici e dei poligoni

Esegui il cast dell’entità di un nodo a Mesh e leggi i suoi punti di controllo e i poligoni:

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

Passo 6: Applica le opzioni di caricamento specifiche del formato

Per un controllo più dettagliato, passa una sottoclasse LoadOptions:

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

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

Altre classi di opzione: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Problemi comuni e soluzioni

ImportException quando si chiama Scene.Open()

Il file potrebbe essere corrotto o in una variante di formato non supportata. Verifica che il file si apra in un visualizzatore 3D e che il formato sia nella lista supportata.

Materiali mancanti dopo il caricamento OBJ

Posiziona il file .mtl accanto al file .obj e assicurati ObjLoadOptions.EnableMaterials = true.

Disallineamento del sistema di coordinate (il modello appare ruotato)

Imposta ObjLoadOptions.FlipCoordinateSystem = true o applica una rotazione al Transform del nodo radice.

NullReferenceException accede a node.Entity

Non tutti i nodi contengono geometria. Controlla sempre if (node.Entity is Mesh mesh) prima di accedere alle proprietà della mesh.


Domande Frequenti (FAQ)

Quali formati 3D posso caricare?

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

Posso caricare da un flusso?

Sì. Scene.Open() accetta un Stream:

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

Come ottengo le normali di superficie?

Dopo il caricamento, chiama mesh.GetElement(VertexElementType.Normal) per accedere al livello VertexElementNormal.

La libreria è thread‑safe?

Ogni istanza Scene è indipendente. Caricare file separati in istanze separate Scene da thread separati è sicuro.

 Italiano