Hoe 3D-modellen te laden in .NET

Hoe 3D-modellen te laden in .NET

Aspose.3D for .NET biedt een eenvoudige API voor het openen van 3D‑bestanden zonder native afhankelijkheden. Na het laden van een bestand in een Scene‑object kun je door de knooppunt‑hiërarchie lopen en geometrie‑gegevens lezen voor elke mesh.

Stapsgewijze handleiding

Stap 1: Installeer het pakket

Voeg het NuGet‑pakket toe aan uw project:

dotnet add package Aspose.3D --version 26.1.0

Verifiëren:

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

Stap 2: Importeer de Scene-klasse

De Scene-klasse is de bovenste container voor alle 3D-gegevens. Importeer de namespace:

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

Stap 3: Een bestand laden

Gebruik Scene.Open() om elk ondersteund formaat te laden. De bibliotheek detecteert het formaat aan de hand van de bestandsextensie:

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

Of gebruik de statische fabriek:

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

Beiden ondersteunen OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY en 3MF.


Stap 4: Doorloop sceneknooppunten

Een geladen scène is een boom van Node objecten met wortel 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);

Elke Node kan een Entity (mesh, camera, licht) dragen. Controleer node.Entity voordat u toegang krijgt.


Stap 5: Toegang tot Vertex‑ en Polygon‑gegevens

Cast een node’s entiteit naar Mesh en lees de controlepunten en polygonen:

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

Stap 6: Toepassen van formaat‑specifieke laadopties

Voor fijnmazige controle, geef een LoadOptions subklasse door:

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

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

Andere optieklassen: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Veelvoorkomende problemen en oplossingen

ImportException bij het aanroepen van Scene.Open()

Het bestand kan beschadigd zijn of in een niet‑ondersteunde formaatvariant. Controleer of het bestand opent in een 3D‑viewer en dat het formaat in de ondersteunde lijst staat.

Ontbrekende materialen na OBJ laden

Plaats het .mtl bestand naast het .obj bestand en zorg ervoor ObjLoadOptions.EnableMaterials = true.

Coördinatensysteem mismatch (model lijkt gedraaid)

Stel ObjLoadOptions.FlipCoordinateSystem = true in of pas een rotatie toe op de Transform van de hoofdnode.

NullReferenceException toegang krijgen tot node.Entity

Niet elke node bevat geometrie. Controleer altijd if (node.Entity is Mesh mesh) voordat u mesh‑eigenschappen benadert.


Veelgestelde vragen (FAQ)

Welke 3D-formaten kan ik laden?

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

Kan ik laden vanuit een stream?

Ja. Scene.Open() accepteert een Stream:

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

Hoe krijg ik oppervlaknormaalvectoren?

Na het laden, roep mesh.GetElement(VertexElementType.Normal) aan om de VertexElementNormal laag te benaderen.

Is de bibliotheek thread-safe?

Elke Scene instantie is onafhankelijk. Het laden van afzonderlijke bestanden in afzonderlijke Scene instanties vanuit afzonderlijke threads is veilig.

 Nederlands