我们很高兴地宣布已可用 Aspose.3D FOSS for .NET – 一个免费、开源的库,用于在 .NET 应用中处理 3D 文件格式。该库以纯 C# 方案构建,无本机依赖,目标平台为 .NET 10.0 及更高版本,使其能够适用于广泛的项目和环境。.
本文将逐步介绍库的功能、如何入门以及后续的方向。.
Aspose.3D FOSS for .NET 是什么??
Aspose.3D FOSS for .NET 是一个轻量级的 3D 文件处理库,发布于 MIT license. 它提供了一个场景图 API,允许您加载、检查、转换并保存跨多种常用格式的 3D 模型。该库完全使用 C# 编写,无需外部本机二进制文件或平台特定配置。.
源代码可在 GitHub 上获取:: https://github.com/aspose-3d-foss/Aspose.3D-FOSS-for-NET
关键亮点
- 纯 C# – 无 P/Invoke,无本机库,无平台限制。.
- .NET 10.0+ 兼容。.
- MIT 许可证 – 在个人、商业或专有项目中使用,无任何限制。.
- 场景图架构 – 一个熟悉的节点、网格、相机和材质树。.
- 多格式支持 – 读取和写入 OBJ、STL、glTF 2.0、GLB、FBX、Collada 和 3MF 文件。.
快速入门
NuGet 安装
将 NuGet 包添加到您的项目中::
dotnet add package Aspose.3D.Converter --version 1.0.0
您的首次转换
最简单的用例是将一种格式的 3D 文件加载后保存为另一种格式。下面是一个将 OBJ 转换为 STL 的两行代码示例::
using Aspose.ThreeD;
var scene = new Scene();
scene.Open("cube.obj");
scene.Save("output.stl");
该 Scene 类是核心入口点。调用 scene.Open() 使用文件路径加载模型,然后调用 Save() 使用目标路径。库会根据文件扩展名推断格式。.
从头构建场景
您也可以通过编程方式构建场景::
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
var scene = new Scene();
var box = new Box(2, 2, 2);
var node = scene.RootNode.CreateChildNode("Box", box);
node.Transform.Translation = new FVector3(1, 2, 3);
scene.Save("scene.gltf");
这将创建一个新场景,在根节点下添加一个盒子原语作为子节点,将其定位在坐标 (1, 2, 3),并将结果导出为 glTF 文件。.
使用特定格式选项加载
当您需要对加载过程进行更细致的控制时,每种格式都提供专用的选项类。例如,使用显式选项加载 STL 文件::
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;
var scene = new Scene();
var opts = new StlLoadOptions();
scene.Open("part.stl", opts);
// Inspect the loaded scene
Console.WriteLine("Root children: " + scene.RootNode.ChildNodes.Count);
// Re-export as OBJ
scene.Save("part.obj");
该 scene.Open() 方法接受任意加载选项类型:: ObjLoadOptions, StlLoadOptions, GltfLoadOptions, FbxLoadOptions,,或 TmfLoadOptions.
遍历场景图
场景加载后,您可以遍历节点树以检查或修改其内容::
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
var scene = new Scene();
scene.Open("model.gltf");
foreach (var child in scene.RootNode.ChildNodes)
{
Console.WriteLine("Node: " + child.Name);
Console.WriteLine(" Translation: " + child.Transform.Translation);
if (child.Entity is Mesh mesh)
{
Console.WriteLine(" Vertices: " + mesh.ControlPoints.Count);
}
}
此模式对于调试、生成模型内容报告,或在重新导出前有选择地修改场景的部分内容非常有用。.
应用变换
在三维空间中定位节点是通过 Transform 每个的属性 Node:
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
var scene = new Scene();
var parent = scene.RootNode.CreateChildNode("Parent");
parent.Transform.Translation = new FVector3(10, 0, 0);
var child = parent.CreateChildNode("Child");
child.Transform.Translation = new FVector3(5, 0, 0);
child.Transform.Scale = new FVector3(2, 2, 2);
// Child's world position is (15, 0, 0) due to
// parent-child transform inheritance
scene.Save("transformed.gltf");
变换遵循标准的父子继承模型:子节点的世界空间位置是其本地变换与所有祖先节点(直至根节点)变换的组合。.
包含内容
该库提供了一套围绕 3D 场景图模型设计的核心功能。.
场景图
场景图是 API 的骨干。每个 3D 文件都以树形结构表示::
| 类 | 角色 |
|---|---|
Scene | 顶层容器;场景图的根节点 |
Node | 树中的命名位置;保存变换和子节点 |
Entity | 附加到节点的可视对象的抽象基类 |
Mesh | 多边形几何——顶点、面、法线 |
Camera | 虚拟相机定义 |
Transform | 节点的局部平移、旋转和缩放 |
GlobalTransform | 计算得到的世界空间变换 |
内置基元
该 .NET 版包括可直接附加到节点或转换为的参数化形状类 Mesh:
- Box – 轴对齐的盒子,宽度、高度和深度可配置。.
- Sphere – 参数化球体,半径可配置。.
- Cylinder – 参数化圆柱体,半径和高度可配置。.
var sphere = new Sphere(1);
var mesh = sphere.ToMesh();
Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
材质
库提供多种材质类型::
- LambertMaterial – 经典的仅漫反射材质,具有环境光、漫反射、发光和反射颜色分量。.
- PhongMaterial – 在 Lambert 基础上扩展了镜面高光和光泽度。.
- PbrMaterial – 基于物理渲染的材质,包含基色、金属度、粗糙度、遮蔽以及纹理槽。.
数学工具
该 Aspose.ThreeD 命名空间包括基本的数学原语::
- FVector3 – 单精度 3 分量向量,用于位置、方向和缩放。被用于
Transform.Translation和Transform.Scale. - Vector4 – 单精度 4 分量向量,用于控制点和法线。.
- Matrix4 – 4x4 变换矩阵。.
- Quaternion – 旋转表示。用于
Transform.Rotation. - BoundingBox – 用于空间查询的轴对齐包围盒。.
var a = new FVector3(1, 0, 0);
var b = new FVector3(0, 1, 0);
// Vector operations for spatial computations
加载和保存选项
每种格式都有专用的选项类,允许您控制导入和导出行为::
| 格式 | 加载选项 | 保存选项 |
|---|---|---|
| OBJ | ObjLoadOptions | ObjSaveOptions |
| STL | StlLoadOptions | StlSaveOptions |
| glTF / GLB | GltfLoadOptions | GltfSaveOptions |
| FBX | FbxLoadOptions | FbxSaveOptions |
| 3MF | TmfLoadOptions | TmfSaveOptions |
例如,要加载一个带有坐标翻转和法线归一化的 OBJ 文件::
var opts = new ObjLoadOptions();
opts.FlipCoordinateSystem = true;
opts.NormalizeNormal = true;
scene.Open("model.obj", opts);
支持的格式
下表概述了 Aspose.3D FOSS for .NET 能够读取和写入的格式。.
| 格式 | 扩展 | 导入 | 导出 | 备注 |
|---|---|---|---|---|
| OBJ | .obj | 是 | 是 | 带 MTL 材质 |
| STL | .stl | 是 | 是 | 二进制 + ASCII |
| glTF 2.0 | .gltf | 是 | 是 | JSON 格式 |
| GLB | .glb | 是 | 是 | Binary glTF |
| FBX | .fbx | 是 | 是 | ASCII 和 binary 模式 |
| Collada | .dae | 是 | 是 | |
| 3MF | .3mf | 是 | 是 | ZIP-based 3D 制造格式 |
格式选择指南
选择合适的格式取决于您的使用场景::
- OBJ 在需要在各种 3D 工具之间实现最大兼容性时,它是理想的选择。几乎所有建模应用程序都可以读取和写入 OBJ。它非常适合网格数据交换,但仅通过伴随的 MTL 文件携带基本的材质信息。.
- STL 是 3D 打印工作流的首选格式。它存储原始的三角网格几何体,不包含材质或场景层次结构,这正是切片软件所期望的。.
- glTF 是现代的网络和实时3D标准。它支持PBR材质、完整的场景层次结构,并且旨在高效传输。在构建基于网页的查看器或面向任何实时渲染管线时,请使用glTF。.
- FBX 深度集成于游戏开发和数字内容创作工作流中。它支持包括层次结构和材质在内的丰富场景数据。Aspose.3D FOSS for .NET 支持 FBX 导入和导出 支持 ASCII 和二进制模式。.
- 3MF 是一种现代的3D打印格式,支持丰富的元数据、材质以及在单个基于ZIP的包中的多对象场景。.
已知限制
Scene.Render() 是 不受支持 在 FOSS 版中。调用此方法将抛出一个 NotImplementedException. 该库旨在用于基于文件的 3D 处理——加载、操作、转换和保存模型——而非实时渲染到显示器。.
开源与许可
Aspose.3D FOSS for .NET 在以下许可下发布 MIT 许可证. 这意味着您可以自由地::
- 在商业和专有应用中使用该库。.
- 修改源代码以满足您的需求。.
- 将库作为您自己软件的一部分进行分发。.
没有版税费用、使用限制,也没有除 MIT 许可证规定之外的署名要求。.
完整的源代码托管在 GitHub 上,欢迎贡献:: https://github.com/aspose-3d-foss/Aspose.3D-FOSS-for-NET
系统要求
| 需求 | 细节 |
|---|---|
| .NET 版本 | 10.0 or later |
| 依赖项 | 无(纯 C#) |
| 平台 | 任何运行 .NET 的平台 |
| 包管理器 | NuGet |
入门指南
以下资源可帮助您快速上手::
- 文档 – 综合指南和 API 演练可在 Aspose.3D 文档站点.
- 知识库 – 实用操作指南和故障排除技巧在 Aspose.3D KB.
- API 参考 – 详细的类和方法参考位于 Aspose.3D API 参考.
- 源代码 – 浏览并在 GitHub.
- NuGet – 包已发布为
Aspose.3D.Converter在 NuGet 上。.
常见使用场景
以下是 Aspose.3D FOSS for .NET 适用的一些实际场景::
格式转换流水线
许多团队收到的 3D 资产是某种格式,但需要转换为另一种格式。设计团队可能使用 FBX,而 Web 团队需要 glTF。该库可帮助您构建自动化的转换流水线::
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;
// Convert all incoming FBX assets to GLB for the web team
var scene = new Scene();
scene.Open("asset.fbx");
scene.Save("asset.glb");
3D Model Inspection and Validation
在将 3D 资产集成到您的应用程序之前,您可能需要验证其内容——检查节点数量、验证几何体,或确认预期元素是否存在::
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
var scene = new Scene();
scene.Open("model.obj");
int nodeCount = scene.RootNode.ChildNodes.Count;
Console.WriteLine("Top-level nodes: " + nodeCount);
foreach (var child in scene.RootNode.ChildNodes)
{
if (child.Entity is Mesh mesh)
{
Console.WriteLine(child.Name + ": "
+ mesh.ControlPoints.Count + " vertices");
}
}
场景组装
您可以加载多个模型并将它们组合成一个场景::
using Aspose.ThreeD;
var scene = new Scene();
var part1 = new Scene();
part1.Open("chassis.obj");
var part2 = new Scene();
part2.Open("wheels.obj");
// Add nodes from each part into the combined scene
foreach (var child in part1.RootNode.ChildNodes)
{
scene.RootNode.ChildNodes.Add(child);
}
foreach (var child in part2.RootNode.ChildNodes)
{
scene.RootNode.ChildNodes.Add(child);
}
scene.Save("assembled.gltf");
下一步
在接下来的文章中,我们将介绍::
- 深入探讨 scene-graph API、材质和数学工具的关键特性。.
- 实用指南,帮助您使用每种受支持的 3D 格式 – OBJ、STL、glTF、FBX 和 3MF – 包括加载/保存选项和批量转换模式。.
敬请关注,随时探索该库并在 GitHub 上分享您的反馈。.