Jak načíst 3D modely v .NET

Jak načíst 3D modely v .NET

Aspose.3D for .NET poskytuje jednoduché API pro otevírání 3D souborů bez nativních závislostí. Po načtení souboru do objektu Scene můžete procházet hierarchii uzlů a číst geometrická data pro každý mesh.

Průvodce krok za krokem

Krok 1: Nainstalujte balíček

Přidejte balíček NuGet do svého projektu:

dotnet add package Aspose.3D --version 26.1.0

Ověřit:

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

Krok 2: Importovat třídu Scene

Třída Scene je kontejner nejvyšší úrovně pro všechna 3D data. Naimportujte jmenný prostor:

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

Krok 3: Načíst soubor

Použijte Scene.Open() k načtení libovolného podporovaného formátu. Knihovna detekuje formát podle přípony souboru:

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

Nebo použijte statickou továrnu:

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

Oba podporují OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY a 3MF.


Krok 4: Procházet uzly scény

Načtená scéna je strom objektů Node zakořeněný v 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);

Každý Node může nést Entity (síť, kamera, světlo). Zkontrolujte node.Entity před přístupem.


Krok 5: Přístup k datům vrcholů a polygonů

Přetypujte entitu uzlu na Mesh a přečtěte její řídicí body a polygony:

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

Krok 6: Použít specifické možnosti načítání formátu

Pro jemnozrnou kontrolu předávejte podtřídu LoadOptions:

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

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

Další třídy možností: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Běžné problémy a opravy

ImportException při volání Scene.Open()

Soubor může být poškozený nebo ve formátu, který není podporován. Ověřte, že se soubor otevře ve 3D prohlížeči a že formát je v seznamu podporovaných.

Chybějící materiály po načtení OBJ

Umístěte soubor .mtl vedle souboru .obj a zajistěte ObjLoadOptions.EnableMaterials = true.

Neshoda souřadnicových systémů (model se jeví jako otočený)

Nastavte ObjLoadOptions.FlipCoordinateSystem = true nebo aplikujte rotaci na Transform kořenového uzlu.

NullReferenceException přistupuje k node.Entity

Ne každý uzel nese geometrii. Vždy zkontrolujte if (node.Entity is Mesh mesh) před přístupem k vlastnostem meshe.


Často kladené otázky (FAQ)

Jaké 3D formáty mohu načíst?

OBJ, STL (binární a ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY a 3MF.

Mohu načíst ze streamu?

Ano. Scene.Open() přijímá Stream:

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

Jak získám povrchové normály?

Po načtení zavolejte mesh.GetElement(VertexElementType.Normal) pro přístup k vrstvě VertexElementNormal.

Je knihovna bezpečná pro vlákna?

Každá instance Scene je nezávislá. Načítání samostatných souborů do samostatných instancí Scene z oddělených vláken je bezpečné.

 Čeština