Cum să încărcați modele 3D în .NET

Cum să încărcați modele 3D în .NET

Aspose.3D for .NET oferă un API simplu pentru deschiderea fișierelor 3D fără dependențe native. După încărcarea unui fișier într-un obiect Scene poți parcurge ierarhia nodurilor și citi datele geometrice pentru fiecare mesh.

Ghid pas cu pas

Pasul 1: Instalați pachetul

Adăugați pachetul NuGet în proiectul dvs.:

dotnet add package Aspose.3D --version 26.1.0

Verificați:

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

Pasul 2: Importă clasa Scene

Clasa Scene este containerul de nivel superior pentru toate datele 3D. Importaţi spaţiul de nume:

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

Pasul 3: Încarcă un fișier

Utilizați Scene.Open() pentru a încărca orice format acceptat. Biblioteca detectează formatul din extensia fișierului:

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

Sau folosiți fabrica statică:

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

Ambele suportă OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY și 3MF.


Pasul 4: Parcurge nodurile scenei

O scenă încărcată este un arbore de obiecte Node cu rădăcina la 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);

Fiecare Node poate transporta un Entity (mesh, cameră, lumină). Verificați node.Entity înainte de a accesa.


Pasul 5: Accesarea datelor de vârf și poligon

Transformă entitatea unui nod în Mesh și citește punctele de control și poligoanele:

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

Pasul 6: Aplică opțiunile de încărcare specifice formatului

Pentru un control fin, transmiteţi o subclasă LoadOptions:

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

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

Alte clase de opțiuni: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Probleme comune și soluții

ImportException când se apelează Scene.Open()

Fișierul poate fi corupt sau într-o variantă de format nesuportată. Verificați că fișierul se deschide într-un vizualizator 3D și că formatul se află în lista de formate suportate.

Materiale lipsă după încărcarea OBJ

Plasaţi fişierul .mtl alături de fişierul .obj şi asiguraţi ObjLoadOptions.EnableMaterials = true.

Neconcordanță a sistemului de coordonate (modelul pare rotit)

Setați ObjLoadOptions.FlipCoordinateSystem = true sau aplicați o rotație la Transform al nodului rădăcină.

NullReferenceException accesând node.Entity

Nu fiecare nod conține geometrie. Verificați întotdeauna if (node.Entity is Mesh mesh) înainte de a accesa proprietățile mesh-ului.


Întrebări frecvente (FAQ)

Ce formate 3D pot încărca?

OBJ, STL (binare și ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY și 3MF.

Pot încărca dintr-un flux?

Da. Scene.Open() acceptă un Stream:

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

Cum obțin normalele suprafeței?

După încărcare, apelaţi mesh.GetElement(VertexElementType.Normal) pentru a accesa stratul VertexElementNormal.

Este biblioteca thread-safe?

Fiecare instanță Scene este independentă. Încărcarea fișierelor separate în instanțe separate Scene din fire de execuție separate este sigură.

 Română