Kako učitati 3D modele u .NET

Kako učitati 3D modele u .NET

Aspose.3D za .NET pruža jednostavan API za otvaranje 3D fajlova bez nativnih zavisnosti. Nakon učitavanja fajla u Scene objekat, možete preći kroz hijerarhiju čvorova i pročitati podatke o geometriji za svaki mesh.

Vodič korak po korak

Korak 1: Instalirajte paket

Dodajte NuGet paket u svoj projekat:

dotnet add package Aspose.3D --version 26.1.0

Verifikujte:

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

Korak 2: Uvezi klasu Scene

Klasa Scene je kontejner najvišeg nivoa za sve 3D podatke. Uvezite prostor imena:

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

Korak 3: Učitajte fajl

Koristite Scene.Open() za učitavanje bilo kog podržanog formata. Biblioteka otkriva format iz ekstenzije fajla:

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

Ili koristite statičku fabriku:

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

Oba podržavaju OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY i 3MF.


Korak 4: Prolazak kroz čvorove scene

Učitana scena je stablo objekata Node sa korenom u 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);

Svaki Node može nositi Entity (mesh, camera, light). Proverite node.Entity pre pristupa.


Korak 5: Pristup podacima o vrhovima i poligonima

Pretvorite entitet čvora u Mesh i pročitajte njegove kontrolne tačke i poligone:

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

Korak 6: Primeni opcije učitavanja specifične za format

Za detaljnu kontrolu, prosledite podklasu LoadOptions:

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

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

Ostale klase opcija: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Уобичајени проблеми и решења

ImportException prilikom poziva Scene.Open()

Datoteka može biti oštećena ili u nepodržanoj varijanti formata. Proverite da li se datoteka otvara u 3D pregledaču i da li je format na listi podržanih.

Nedostajući materijali nakon učitavanja OBJ

Postavite datoteku .mtl pored datoteke .obj i osigurajte ObjLoadOptions.EnableMaterials = true.

Neusklađenost koordinatnog sistema (model izgleda rotiran)

Postavi ObjLoadOptions.FlipCoordinateSystem = true ili primeni rotaciju na korenskog čvora Transform.

NullReferenceException pristupanje node.Entity

Nije svaki čvor nosi geometriju. Uvek proverite if (node.Entity is Mesh mesh) pre nego što pristupite svojstvima mreže.


Често постављана питања (FAQ)

Koje 3D formate mogu da učitam?

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

Mogu li učitati iz toka?

Da. Scene.Open() prihvata Stream:

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

Kako da dobijem površinske normale?

Nakon učitavanja, pozovite mesh.GetElement(VertexElementType.Normal) da pristupite sloju VertexElementNormal.

Da li je biblioteka thread‑safe?

Svaka Scene instanca je nezavisna. Učitavanje odvojenih fajlova u odvojene Scene instance iz odvojenih niti je sigurno.

 Српски