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