如何在 Aspose.3D 中通过半空间分割网格
Contents
[
Hide
]
使用半空间分割网格
本教程演示如何使用 Aspose.3D 执行使用半空间平面的网格分割操作。此技术可用于根据空间标准提取 3D 模型的部分。
理解半空间操作
半空间表示由平面分割的无限空间。结合 Aspose.3D 的布尔运算,它可以允许您提取相对于定义的平面的一侧的网格部分。
关键概念:
- 半空间: 表示由平面分割的无限空间
- 布尔运算: 用于相对于半空间提取网格部分
- 平面方程: 定义为 ax + by + cz + d = 0,其中 (a,b,c) 是法向量
- 正侧: 平面法向量指向的空间部分
代码示例:使用半空间分割网格
以下 C# 代码演示如何创建简单的盒状网格并使用半空间平面分割它:
using System;
using Aspose.ThreeD;
using Aspose.ThreeD.Entities; // Contains HalfSpace and BooleanOperator classes
using Aspose.ThreeD.Utilities; // Contains Vector3 and Plane utilities
class MeshBooleanWithHalfSpace
{
public static void Execute()
{
// 创建新的 3D 场景
Scene scene = new Scene();
// 创建盒状网格(默认尺寸为 2x2x2)
Mesh boxMesh = (new Box()).ToMesh();
Node boxNode = scene.RootNode.CreateChildNode("Box", boxMesh);
// 创建半空间切割平面
HalfSpace halfSpace = new HalfSpace();
// 定义平面方程:ax + by + cz + d = 0
// 使用法向量指向 Z 方向
halfSpace.Plane = new Plane(new Vector3(0, 0, 1), 0);
// 放置半空间(创建节点和变换)
Node halfSpaceNode = scene.RootNode.CreateChildNode("HalfSpace", halfSpace);
halfSpaceNode.Transform.Translation = new Vector3(0, 0, 0.5); // 放置在 z=0.5 处
// 执行布尔分割操作
Node splitResult = BooleanOperator.Split(boxNode, halfSpaceNode);
// 将结果添加到场景并保存
scene.RootNode.CreateChildNode("SplitResult", splitResult.Entity);
scene.Save("halfspace_split_result.obj", FileFormat.WavefrontOBJ);
Console.WriteLine("使用半空间分割网格完成成功。");
}
}
代码说明
命名空间要求
using Aspose.ThreeD;
using Aspose.ThreeD.Entities; // Contains HalfSpace and BooleanOperator classes
using Aspose.ThreeD.Utilities; // Contains Vector3 and Plane utilities
创建几何体
- 场景初始化:
Scene scene = new Scene();
- 盒状创建:
(new Box()).ToMesh()
创建一个标准立方体 - 节点层次结构: 网格通过子节点添加到场景中
定义切割平面
-
平面定义:
halfSpace.Plane = new Plane(new Vector3(0, 0, 1), 0);
- 创建 XY 水平平面在 z=0 处
- 法向量 (0,0,1) 指向上方
-
放置:
halfSpaceNode.Transform.Translation = new Vector3(0, 0, 0.5);
- 将切割平面移动到 z=0.5
- 影响保留的网格部分的哪一部分
执行操作
Node splitResult = BooleanOperator.Split(boxNode, halfSpaceNode);
- 返回平面正侧的网格部分
- 结果添加到场景层次结构中
保存结果
scene.Save("halfspace_split_result.obj", FileFormat.WavefrontOBJ);
- 支持的格式包括 OBJ、STL、FBX、GLTF 等
- 仅保存分割片段,而不是原始网格
可视化操作
原始盒状尺寸:
- 从 (-1,-1,-1) 到 (1,1,1) 跨越
- 位于原点
具有在 z=0.5 处的平面:
- 保留 z > 0.5 处的部分(盒子的顶部)
- 丢弃 z < 0.5 处的部分(盒子的底部)
高级用法
获取切割的两个侧面
// 原始分割(正侧)
Node positiveFragment = BooleanOperator.Split(boxNode, halfSpaceNode);
// 反转平面以获取负侧
halfSpace.Plane = new Plane(new Vector3(0, 0, -1), 0);
Node negativeFragment = BooleanOperator.Split(boxNode, halfSpaceNode);
调整切割平面
// 不同的方向 - 倾斜切割
halfSpace.Plane = new Plane(new Vector3(0.707, 0, 0.707), 0);
halfSpaceNode.Transform.Translation = new Vector3(0, 0, 1);
此实现演示了 Aspose.3D 的网格分割功能的关键功能,使用半空间平面,允许根据空间标准精确提取 3D 几何体。