数据结构中将 B-Rep 转换为树
1 B-rep 流
明确规定要设置一个生产者进程,该进程导入一个 B-rep,外部由某些标准多边形格式定义,例如 wavefront 或 java3D obj 文件,将其导入到我们几何管道的输入流中。多边形和法线提供的边界表示必须具有连贯的方向。对于主要在计算机图形学中实现的通常存档的几何模型,可能需要对输入文件进行过滤以应对非平面多边形和其他几何不准确性。然后,将连贯定向三角形的输出流通过以下描述的算法步骤转换为我们的双重渐进 BSP(二叉空间划分)树。
2 B-rep 到 BSP 算法概述
我们方法的基本过程是通过收缩每个三角形的预计算惯性来计算三角形子集的惯性,以及对三角形子集的惯性进行特征分解,从而最佳地递归地限制其形状。
在 d 维情况下,通过为欧拉矩阵的每个 d 个特征向量实现 2 个极端切线超平面来获得形状限制。相应 2d 超空间的交集创建了当前单元格中包含的边界子集的最佳拟合(超)平行六面体。在 3 维中,存在 6=2×3 个这样的平面。
初始化
- 首先计算每个输入三角形的仿射扩展欧拉张量(线性时间)。
- 将所有输入三角形与 BSP 根节点连接。
- 将整个 E3 空间(它是凸的)连接到根节点。
- 将根节点标签设置为 FUZZY。
递归情况
- 当前 FUZZY 单元格最多被 6 个正交超平面划分,这些超平面垂直于当前三角形子集的欧拉张量的矩阵表示的特征向量。
- 这些平面是通过在当前三角形子集的顶点 v 上计算的线性函数 w = a • v 的最小值和最大值来计算的,其中 a 表示当前特征向量。
- 对于每个特征向量,通过两个最大-最小平行超平面最多产生三个凸单元格,这些单元格是 {OUT,FUZZY,IN} 或 {OUT,FUZZY,OUT}。
- 每个 FUZZY 单元格将被与最大特征向量相关的 principal 超平面进一步划分。
- 通过对其顶点的包含性测试,将较小的三角形子集加入到每个划分单元格。
- 穿过划分平面的三角形将被划分,并且(子)三角形将加入到节点子树。
基本情况
当当前单元格仅包含少量边界三角形时,基于惯性的递归划分停止。通过实现边界三角形的平面执行最终单元格划分。
广告