Как да заредите 3D модели в .NET
Aspose.3D for .NET предоставя прост API за отваряне на 3D файлове без native dependencies. След зареждане на файл в обект Scene можете да обхождате йерархията на възлите и да четете geometry data за всеки mesh.
Ръководство стъпка по стъпка
Стъпка 1: Инсталирайте пакета
Добавете NuGet пакета към вашия проект:
dotnet add package Aspose.3D --version 26.1.0Провери:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Стъпка 2: Импортиране на Scene Class
Класът 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 (мрежа, камера, светлина). Проверете 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 инстанции от отделни нишки е безопасно.