Sådan indlæses 3D‑modeller i .NET

Sådan indlæses 3D‑modeller i .NET

Aspose.3D for .NET leverer et enkelt API til at åbne 3D-filer uden native afhængigheder. Efter at have indlæst en fil i et Scene-objekt kan du gennemløbe nodehierarkiet og læse geometridata for hver mesh.

Trin-for-trin guide

Trin 1: Installer pakken

Tilføj NuGet-pakken til dit projekt:

dotnet add package Aspose.3D --version 26.1.0

Verificer:

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

Trin 2: Importér Scene-klassen

Klassen Scene er den øverste container for alle 3D‑data. Importér navneområdet:

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

Trin 3: Indlæs en fil

Brug Scene.Open() til at indlæse ethvert understøttet format. Biblioteket registrerer formatet ud fra filendelsen:

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

Eller brug den statiske fabrik:

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

Begge understøtter OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY og 3MF.


Trin 4: Gennemløb scenenoder

En indlæst scene er et træ af Node-objekter med rod i 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);

Hver Node kan bære en Entity (mesh, kamera, lys). Tjek node.Entity før du får adgang.


Trin 5: Få adgang til Vertex- og polygondata

Kast en nodes enhed til Mesh og læs dens kontrolpunkter og polygoner:

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

Trin 6: Anvend format‑specifikke indlæsningsindstillinger

For finjusteret kontrol, videregiv en LoadOptions underklasse:

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

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

Andre valgmulighedsklasser: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Almindelige problemer og løsninger

ImportException ved kald af Scene.Open()

Filen kan være beskadiget eller i en ikke‑understøttet formatvariant. Verificer, at filen åbnes i en 3D‑fremviser, og at formatet er på den understøttede liste.

Manglende materialer efter OBJ-indlæsning

Placér .mtl-filen ved siden af .obj-filen og sørg for ObjLoadOptions.EnableMaterials = true.

Koordinatsystem uoverensstemmelse (model ser roteret ud)

Indstil ObjLoadOptions.FlipCoordinateSystem = true eller anvend en rotation på rotnodens Transform.

NullReferenceException tilgår node.Entity

Ikke hver node bærer geometri. Kontroller altid if (node.Entity is Mesh mesh), før du får adgang til mesh‑egenskaber.


Ofte stillede spørgsmål (FAQ)

Hvilke 3D‑formater kan jeg indlæse?

OBJ, STL (binær og ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY og 3MF.

Kan jeg indlæse fra en strøm?

Ja. Scene.Open() accepterer en Stream:

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

Hvordan får jeg overfladenormaler?

Efter indlæsning, kald mesh.GetElement(VertexElementType.Normal) for at få adgang til VertexElementNormal laget.

Er biblioteket trådsikkert?

Hver Scene-instans er uafhængig. Indlæsning af separate filer i separate Scene-instanser fra separate tråde er sikkert.

 Dansk