如何在 .NET 中加载 3D 模型

如何在 .NET 中加载 3D 模型

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:遍历场景节点

已加载的场景是一个以 scene.RootNode 为根的 Node 对象树:

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 实例中是安全的。

 中文