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