Як завантажити 3D моделі у .NET

Як завантажити 3D моделі у .NET

Aspose.3D for .NET забезпечує простий API для відкриття 3D‑файлів без нативних залежностей. Після завантаження файлу в об’єкт Scene ви можете пройти ієрархію вузлів і прочитати дані геометрії для кожної сітки.

Покроковий посібник

Крок 1: Встановити пакет

Додайте пакет NuGet до вашого проєкту:

dotnet add package Aspose.3D --version 26.1.0

Перевірте:

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

Крок 2: Імпорт класу Scene

Клас Scene є контейнером верхнього рівня для всіх 3D‑даних. Імпортуйте простір імен:

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

Крок 3: Завантажити файл

Використовуйте Scene.Open() для завантаження будь‑якого підтримуваного формату. Бібліотека визначає формат за розширенням файлу:

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

Або використайте статичну фабрику:

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

Обидва підтримують OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY та 3MF.


Крок 4: Перебір вузлів сцени

Завантажена сцена — це дерево об’єктів Node, коренем якого є 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);

Кожен Node може містити Entity (mesh, camera, light). Перевірте node.Entity перед доступом.


Крок 5: Доступ до даних вершин та полігонів

Приведіть сутність вузла до Mesh і прочитайте її контрольні точки та полігони:

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

Крок 6: Застосувати параметри завантаження, специфічні для формату

Для тонкого керування передайте підклас LoadOptions:

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

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

Інші класи опцій: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Поширені проблеми та виправлення

ImportException під час виклику Scene.Open()

Файл може бути пошкоджений або у непідтримуваному варіанті формату. Перевірте, чи файл відкривається у 3D‑переглядачі та чи формат входить до списку підтримуваних.

Відсутні матеріали після завантаження OBJ

Розмістіть файл .mtl поруч із файлом .obj і забезпечте ObjLoadOptions.EnableMaterials = true.

Несумісність системи координат (модель виглядає повернутою)

Встановити ObjLoadOptions.FlipCoordinateSystem = true або застосувати обертання до кореневого вузла Transform.

NullReferenceException доступ до node.Entity

Не кожен вузол містить геометрію. Завжди перевіряйте if (node.Entity is Mesh mesh) перед доступом до властивостей сітки.


Часті запитання (FAQ)

Які 3D формати я можу завантажити?

OBJ, STL (бінарний та ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY та 3MF.

Чи можу я завантажити з потоку?

Так. Scene.Open() приймає Stream:

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

Як отримати нормалі поверхні?

Після завантаження викличте mesh.GetElement(VertexElementType.Normal), щоб отримати доступ до шару VertexElementNormal.

Чи є бібліотека потокобезпечною?

Кожен Scene екземпляр є незалежним. Завантаження окремих файлів у окремі Scene екземпляри з окремих потоків безпечно.

 Українська