NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
拓扑是 CAD 领域的一个常见主题,描述如何将几何基元组织成三维对象。拓扑实现在每个 CAD 内核中都是非常独特的。Open CASCADE Technology (OCCT) 是唯一可用的开源内核,我们的大部分经验都与它有关。这两个因素激发了我们写这篇文章的灵感。本说明与“几何建模简介”有一些共同之处,因此建议先阅读。
1、B-Rep拓扑简介
最流行的3D建模范式是边界表示(b-rep)。它的想法是使用“边界”关系构建封闭对象。实体由一组面限定。围成实体的面以边为界。围成面的边由顶点限定。与网格不同,b-rep 中的面和边可以弯曲,从而允许对自由形式的对象进行建模。
很容易看出,只有顶点、边和面包含底层几何图形。零维的顶点包含几何点;一维的边包含几何曲线;二维的面包含几何表面。在建模中,几何图形与拓扑分离。阻止使用几何体来满足建模需求的主要问题是什么?几何在OCCT中有两个主要问题:
- 几何对象只能存储矩形域。在 CAD 中,几何实体以参数形式存储,如 s(u,v)。此域在OCCT中是严格矩形的。非矩形域很容易作为布尔运算的结果或建模需求出现。
- 几何不允许邻接关系存储。样条几何体的微小缺陷可能会导致逻辑相邻曲面之间的间隙。OCCT 无法在几何图形中显式存储邻接关系。
这两个问题导致 OCCT 中存在拓扑。OCCT 人员在术语级别上将几何实体和拓扑实体分开,以便于区分它们:
几何 | 拓扑 |
---|---|
点 | 顶点 |
曲线 | 边 |
表面 | 面 |
除了这些保存几何的基本拓扑类型外,OCCT 还有其他拓扑对象。拓扑实体的逻辑分组和层次结构组织需要它们。拓扑实体的完整列表如下:
- 顶点(Vertex)在拓扑中是点(Point)的等效项。
- 边(Edge)在拓扑中是曲线(Curve)的等效项。
- 边框(Wire)是一组连接的边(Edge)。可以关闭或不关闭。在OCCT中,边框中断开的边被视为无效。
- 面(Face)在拓扑中是表面(Surface)的等效项。
- 壳(Shell)是一组连接的面(Face)。可以封闭或不封闭。壳中断开连接的面在 OCCT 中被视为无效。
- 实体(Solid)是 封闭壳(Shell)围成的3D 空间。
- 复合实体(Compsolid)是一组连接的实体(Solid)。复合实体中断开的实体在 OCCT 中被视为无效。
- 组合(Compound)是形状(包括嵌套组合)的集合。此类型对于层次结构组织非常有用。
在OCCT中,拓扑对象表示为定向图,其中链接表示“边界”关系:
上面介绍的连接术语需要准确的定义。拓扑允许确保在数据结构级别共享数据:
也就是说,当上层拓扑项包含指向该项的链接时,拓扑项(顶点、边或面)将被共享。两条边可以共享顶点,线框可以共享边,复合体可以共享面。上图揭示了一个更重要的主题 – 几何载体(顶点、边和面)中的公差。数据共享意味着模型具有共享对象的单个匹配项;事实上,相邻的物体不会相互接触,它们之间总是有很小的间隙。该间隙应覆盖标称位置周围的容差。在 b-rep 中,每项都以“容差”含义为界
顶点 v1 在边 e1、e2 和 e4 之间共享。每条边都有一条基础曲线,这些曲线不必在单个点上相交。同样,边的公差覆盖两个曲面之间的间隙。面的公差覆盖了复合实体中共享面之间的间隙。顶点中的容差是它周围的球体。边缘容差为管,面容差为薄偏移。此外,容差可以解释为标称位置和实际位置之间的差异。
在OCCT中,拓扑项称为形状(Shape)。它们继承自类TopoDS_Shape提供它们之间的公共接口。TopoDS_Shape类具有以下结构元素:
- TopoDS_TShape。此对象包含指向基础(“边界”关系)拓扑实体的链接。几何载体还存储与几何的链接。
- 位置。放置转换。在CAD中,数据共享可用于在建模空间中多次放置同一对象。经典的例子是螺钉、螺栓、螺母等。
- 朝向。该术语对于不同的实体具有不同的含义。曲线的几何方向是参数增加时沿曲线的方向。在OCCT中,闭合边框应遵循右手规则,即组成它的边的方向应一致。几何朝向不能保证一致的方向。因此,曲线可以反转以确保一致性:
让我们来看看拓扑如何解决非矩形域问题。
在OCCT中,曲线和曲面以其参数化形式存储。当边属于面时,3D 曲线有额外的表示。例如,边 e3 在面的参数化空间中具有 3D 曲线和 2D 曲线。同样,属于特定面的每个顶点将点存储在底层 (u,v) 参数空间中。其他表示法用于支持非矩形域。
边:
- 任何时候: 曲线 3D (c3d)
- 面中每个边使用一对:曲线 2D (c2d) + 曲面
顶点:
- 任何时候:点 3D (p)
- 边中每个顶点使用一对:参数 (t0) + 曲线 3D (c3d)
- 每个顶点在面上使用一个三元组:参数 (t0) + 曲线 2D (c2d) + 曲面
由于数值误差,这些方程无法实现。容忍也涵盖了这种差异。顶点中的容差应大于或等于边中的容差;边容差应大于或等于面容差。
顶点容差 > 边容差>面容差
此要求是模型接近的必要条件。CAD 中的一个经典问题是点隶属分类 (PMC)。该算法的思想是从兴趣点发射光线并检查交叉点的数量。当交叉点数为偶数时,点被标记为在外面。当交叉点数为奇数时,点被标记为在里面。
违反容差规则可能会破坏容差意义上的模型接近性,如下所示:
2、B-Rep拓扑方向
现在我们已经掌握了OCCT拓扑学的基本知识。是深入定位主题的好时机。一般来说,OCCT有四种方向,但我们只对其中两种感兴趣:
- 正向 (TopAbs_FORWARD)
- 反向 (TopAbs_REVERSED)
当低维拓扑实体用于高维拓扑实体中时,方向具有含义。当顶点属于边时,顶点方向获得次要意义。顶点的方向不是那么重要,但按照惯例,边中的第一个顶点被标记为正向,最后一个顶点被标记为反向。
线框内的边方向是正确链接所必需的。OCCT 中的曲线的方向由参数增加(几何方向)确定。当曲线转换为边时,正向意味着拓扑方向遵循几何方向,而反向方向意味着曲线实际上被翻转。
面内的线框方向根据右手规则确定物质所在的一侧。当拓扑实体被绕过时,物质在左边。在 OCCT 中,方向是嵌套的。当线框反转且导线内的边反转时,得到的底层曲线方向是向前的。
第一根导线由边 e1、e2、e3 和 e4 组成。相框的正向保持其边的方向,而线框的反向方向则交换它。外线 框(w1) 应按逆时针顺序,以保持物质在左侧。由单边 e2 组成的内线框 w5 应按顺时针顺序。边缘 e5 是向前的,因此这意味着 w2线框应该反转以表示面参数空间中的孔。实体内的面方向是OCCT中方向术语的最后一次用法。在OCCT中,实体是一个封闭的壳,具有指向物质外部的法线的一致方向。在数学上,给定点处垂直于曲面的法线是使用该点的第一偏导数的叉积计算的:
N(u,v) = s'_u(u,v) x s'_v(u,v)
法线计算得到一个符号,按照惯例,OCCT使用上述公式。有时,几何法线违反一致性规则,因此面上的方向可以反转。
OCCT有几种检查工具:
- TopoDS_Iterator – 接受形状并返回其直接子项。
- TopExp_Explorer – 接受形状和所需类型。这种类型的迭代器充当深度优先搜索。应该注意的是,此迭代器多次返回共享对象。例如,两个面之间的共享边将遍历两次。
- TopTools::MapShapes – 接受形状和所需的类型。此探索工具会过滤掉重复的对象,并仅返回唯一的子形状。
缺少从子拓扑类型到父拓扑类型的反向引用,促成了OCCT中可用的最后一个迭代器工具:
- TopExp::MapShapesAndAncestors – 接受形状、键拓扑类型和值拓扑类型。如果键类型为低级拓扑实体,并且值为高级拓扑实体,则此方法将构建存储回引用的映射。例如,如果键为TopAbs_Vertex,值为TopAbs_Edge,则生成的对象包含对<顶点、边列表>,指示哪些边共享键顶点。
OCCT 形状有三个元素。第一个元素是表示定向图TopoDS_TShape实例,如果适用,则保存几何图形的引用。第二个元素是表示对象在建模空间中的位置。最后一个形状的成分是方向。OCCT形状可以使用三种方法进行比较:
- IsPartner – 仅检查TopoDS_TShape的相等性。
- Issame – 检查TopoDS_TShape和位置的相等性。
- IsEqual – 检查TopoDS_TShape、位置和转换的相等性。
让我们通过查找两个形状之间的所有共享折点来说明探索工具的用法。共享对象的方向可以相等或相反,因此应使用 IsSame 进行比较。下面的代码片段找到常见的顶点并将它们放入复合中:
// OCCT's compound is a collection of shapes.
TopoDS_Compound commonVertices;
BRep_Builder bb;
bb.MakeCompound(commonVertices);
// Extract vertices from the first shape.
TopExp_Explorer exp1(shape1, TopAbs_VERTEX);
for (; exp1.More(); exp1.Next())
{
const TopoDS_Shape& vertex1 = exp1.Current();
// Extract vertices from the second shape.
TopExp_Explorer exp2(shape2, TopAbs_VERTEX);
for (; exp2.More(); exp2.Next())
{
const TopoDS_Shape& vertex2 = exp2.Current();
// Use IsSame because orientations can be different.
if (vertex1.IsSame(vertex2))
bb.Add(commonVertices, vertex1);
}
}
最后一个术语是周期性。OCCT 原生支持周期对象,边拆分周期跳转称为接缝边。这个边在单个面内使用两次(具有正向和反向)。接缝边在参数域中有两个原始部分,在周期区域中划分参数空间。
原文链接:Topology in OCCT
BimAnt翻译整理,转载请标明出处