Wie man 3D-Modelle in .NET lädt
Aspose.3D für .NET bietet eine unkomplizierte API zum Öffnen von 3D-Dateien ohne native Abhängigkeiten. Nachdem Sie eine Datei in ein Scene-Objekt geladen haben, können Sie die Knotenhierarchie durchlaufen und Geometriedaten für jedes Mesh auslesen.
Schritt-für-Schritt-Anleitung
Schritt 1: Paket installieren
Fügen Sie das NuGet-Paket zu Ihrem Projekt hinzu:
dotnet add package Aspose.3D --version 26.1.0Überprüfen:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Schritt 2: Importieren der Scene‑Klasse
Die Scene‑Klasse ist der oberste Container für alle 3D‑Daten. Importieren Sie den Namensraum:
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;Schritt 3: Datei laden
Verwenden Sie Scene.Open(), um ein beliebiges unterstütztes Format zu laden. Die Bibliothek erkennt das Format anhand der Dateierweiterung:
var scene = new Scene();
scene.Open("model.obj");Oder verwenden Sie die statische Fabrik:
var scene = Scene.FromFile("model.obj");Beide unterstützen OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY und 3MF.
Schritt 4: Szenen‑Knoten durchlaufen
Eine geladene Szene ist ein Baum von Node‑Objekten, der bei scene.RootNode verwurzelt ist:
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);Jedes Node kann ein Entity (Mesh, Kamera, Licht) tragen. Überprüfen Sie node.Entity, bevor Sie darauf zugreifen.
Schritt 5: Zugriff auf Scheitel‑ und Polygon‑Daten
Wandle die Entität eines Knotens in Mesh um und lese seine Kontrollpunkte und Polygone:
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})");
}
}
}Schritt 6: Formatbezogene Ladeoptionen anwenden
Für eine feinkörnige Steuerung übergeben Sie eine LoadOptions Unterklasse:
var options = new ObjLoadOptions
{
FlipCoordinateSystem = true,
Scale = 0.01,
EnableMaterials = true
};
var scene = new Scene();
scene.Open("model.obj", options);Andere Optionsklassen: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.
Häufige Probleme und Lösungen
ImportException bei Aufruf von Scene.Open()
Die Datei ist möglicherweise beschädigt oder in einer nicht unterstützten Formatvariante. Überprüfen Sie, ob die Datei in einem 3D‑Betrachter geöffnet wird und ob das Format in der unterstützten Liste steht.
Fehlende Materialien nach OBJ-Laden
Platzieren Sie die .mtl Datei neben der .obj Datei und stellen Sie sicher ObjLoadOptions.EnableMaterials = true.
Koordinatensystem-Fehlanpassung (Modell erscheint rotiert)
Setzen Sie ObjLoadOptions.FlipCoordinateSystem = true oder wenden Sie eine Drehung auf das Transform des Wurzelknotens an.
NullReferenceException Zugriff auf node.Entity
Nicht jeder Knoten enthält Geometrie. Überprüfen Sie immer if (node.Entity is Mesh mesh), bevor Sie auf Mesh‑Eigenschaften zugreifen.
Häufig gestellte Fragen (FAQ)
Welche 3D-Formate kann ich laden?
OBJ, STL (binär und ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY und 3MF.
Kann ich aus einem Stream laden?
Ja. Scene.Open() akzeptiert ein Stream:
using var stream = File.OpenRead("model.glb");
scene.Open(stream);Wie bekomme ich Oberflächennormalen?
Nach dem Laden rufen Sie mesh.GetElement(VertexElementType.Normal) auf, um auf die VertexElementNormal‑Ebene zuzugreifen.
Ist die Bibliothek thread‑sicher?
Jede Scene Instanz ist unabhängig. Das Laden separater Dateien in separate Scene Instanzen aus separaten Threads ist sicher.