大家好,欢迎来到IT知识分享网。
传统的B-rep(边界表示)和基于网格的建模技术,尽管在过去几十年中推动了创新,但在面对高级制造复杂性时已显现出局限性。
常见的建模操作,如倒角、偏移甚至布尔运算,经常会面临失败,需要有经验的CAD用户进行特别处理。
相比之下,隐式3D模型基于不同的数学原理,能够做到零出错,从而使得高级零件的完全自动化成为可能。
此外,隐式模型能够直接与仿真结果和环境测量等抽象输入数据结合,生成具有可变厚度和复杂几何形状的设计,这也是传统工具难以实现的。
B-rep
B-Rep 通过一组几何实体(点、曲线和曲面)和拓扑实体(顶点、边、面、壳、实体)定义 3D 实体。
前者提供车身边界的几何定义(例如船体表面、车身等),而后者修剪几何形状(理论上可以是无限的)并存储连接信息。
B-rep(边界表示)精确的实体模型是目前大多数流行的机械设计工具的基础,因为它们是最早能够以微米精度表示名义几何形状的技术。
B-rep通过将固体表示为由边界分隔的面片拼接在一起的方式,区分内外。
每个面都可以由适合其边界贡献的几何形状组成,例如平面、圆柱面或样条曲面。
在B-rep范式中,面、边和其他拓扑元素是大多数CAD用户交互的主要对象。
B-rep存在2个问题:
- 处理 B-Rep 是计算密集型的
- 精确的 B-Rep 定义并不总是可用的。
虽然B-rep在低到中等复杂度的CAD模型中表现良好,但对于制造特征如倒角、薄壁和拔模角度等的建模可能具有挑战性,导致模型变得复杂,从而影响性能和可用性。
特别是在涉及高度详细设计、有机形状、扫描数据、晶格和多孔结构、空间变化材料以及增材制造零件时,B-rep的能力显然不足。
B-reps通常通过中性格式(如STEP)或组件建模引擎(如Parasolid或ACIS)的本地格式进行交换。
当 B-rep 模型面孔数量达到数千甚至数万时,它们变得难以处理。
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d importPoly3DCollection import numpy as np # 设置字体和中文字体 plt.rcParams['font.sans-serif']=['Microsoft YaHei']# 用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号 # 定义八面体的顶点和面 vertices =[ (1,0,0),(-1,0,0),(0,1,0),(0,-1,0),(0,0,1),(0,0,-1) ] faces =[ [vertices[0], vertices[2], vertices[4]], [vertices[0], vertices[3], vertices[4]], [vertices[0], vertices[2], vertices[5]], [vertices[0], vertices[3], vertices[5]], [vertices[1], vertices[2], vertices[4]], [vertices[1], vertices[3], vertices[4]], [vertices[1], vertices[2], vertices[5]], [vertices[1], vertices[3], vertices[5]] ] # 绘图 fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(111, projection='3d') # 绘制八面体的每个面 ax.add_collection3d(Poly3DCollection(faces, facecolors='cyan', linewidths=1, edgecolors='r', alpha=.25)) # 设置坐标轴范围 ax.set_xlim([-1.5,1.5]) ax.set_ylim([-1.5,1.5]) ax.set_zlim([-1.5,1.5]) # 设置标签和标题 ax.set_xlabel('X 轴') ax.set_ylabel('Y 轴') ax.set_zlabel('Z 轴') ax.set_title('八面体的 B-rep 表示') plt.show()
输出:
网格Meshes
为了简化计算,网格模型是B-rep的一种简化形式,其中每个精确边界(面对面和曲线上的边缘)都被一组面(三角形和线性段)替换。
随着模型曲率的增加,需要更密集的三角形来准确表示它。这种数据结构通常更简单,部分原因是每个多边形面的平面几何和边界都由三角形描述。
与B-rep不同的是,网格模型通常缺乏区域或独立壳体的概念,而是依靠三角形的环方向来指定面的方向。
常见的网格格式包括STL、OBJ和VRML。
在制造领域,当网格的面数达到数千万时,它们往往变得不切实际。
尽管将B-rep转换为网格通常比较简单,但由于网格数据分辨率较低,将网格转换回B-rep往往比重新建模更加困难和不可行。
有符号距离场SDF
除了逐块表示固体边界外,还可以使用有符号距离场(Signed Distance Fields,SDF)来建模。
SDF是一种数学表达形式,用于描述空间中各点到某一对象表面的最短距离。它通常以标量场的形式存在,其中每个点的值表示该点到最近表面的距离。
与简单的开关体素表示不同,SDF通过将内部距离值设为负来区分对象内外,这使得边界定义在零交叉点处连续且可微。
这种方式不仅可以实现平滑的表面,而且减少了体素化所需的数量,因此在较少体素的情况下也能保持高质量的表面,这在传统的 B-rep 建模中是不容易实现的。
主要的优点之一是,距离场能够提供对几何形状更精确的表示,尤其是在处理复杂曲面和高度变化的形状时,比传统的多边形网格更为高效和精确。
它可以有效地用于计算形状的几何特征,如法线方向和曲率,以及执行诸如碰撞检测、体积计算和形状变换等操作。
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d importAxes3D from skimage import measure # 导入 skimage 中的 measure 模块 def signed_distance(x, y, z, center, radius): return np.sqrt((x - center[0])2+(y - center[1])2+(z - center[2])2)- radius def create_signed_distance_field(shape, center, radius): x = np.linspace(0, shape[0]-1, shape[0]) y = np.linspace(0, shape[1]-1, shape[1]) z = np.linspace(0, shape[2]-1, shape[2]) X, Y, Z = np.meshgrid(x, y, z, indexing='ij') SDF = signed_distance(X, Y, Z, center, radius) return SDF, X, Y, Z def plot_isosurface(SDF, X, Y, Z, isovalue=0.0): fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 根据等值面绘制球体的形状 verts, faces, _, _ = measure.marching_cubes(SDF, isovalue, spacing=(1,1,1)) ax.plot_trisurf(verts[:,0], verts[:,1], faces, verts[:,2], cmap='coolwarm') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_title('Isosurface of Signed Distance Field') plt.show() # 定义球体的参数 shape =(50,50,50)# 网格尺寸 center =(25,25,25)# 球心坐标 radius =15# 球体半径 # 创建有符号距离场 SDF, X, Y, Z = create_signed_distance_field(shape, center, radius) # 绘制等值面(球体的形状) plot_isosurface(SDF, X, Y, Z)
效果是这样子的:
可视化距离场
R 的 B-rep 版本类似于通过草图或在 CAD 中绘制的二维轮廓,它由曲线段表示。
然后,我们可以将该形状转换为像素网格或更丰富的距离场表示方式:
1、像素网格表示:将轮廓转换为像素网格,其中每个像素要么在形状内部,要么在外部。这种表示方式简单直观,但可能会导致边界的走样,特别是在边缘处。
2、距离场表示:使用距离场,我们可以为每个像素或网格点计算到最近边界的有符号距离。这种方法提供了平滑的边界表示,允许更精确地描述形状的几何特征,如曲率和法线方向。
另一种可视化距离场的方法是将其比作地形图,这样可以更生动地理解其表示的形状。
距离场的线条就像是地形图上的等高线,它们描述了在平坦海面上的R形状岛屿。
海平面可以被看作是形状的零距离轮廓,即形状的边界。
距离场中的正值代表离形状边界的距离,负值表示位于形状内部。
通过这种方式,距离场不仅编码了形状的几何特征,还提供了一种直观的方式来理解形状的偏移和表面细节。
在距离场的概念中,确实可以通过调整零距离面(海平面)的高度来实现形状的偏移。这种偏移可以被类比为潮汐影响海平面的变化,从而使得形状的边界随之调整。
如果将零距离面视为海平面,形状的内部和外部可以根据距离场中的正负值来区分。当零距离面上升时,形状内部会收缩(形状向内偏移),当零距离面下降时,形状则会扩展(形状向外偏移)。
在三维情况下,距离场也同样适用,并且可以被视为一种描述三维实体的方法。形状的表面特征可以通过距离场的斜率来表示,这使得在平滑表面变化和几何特征描述方面具有优势。
隐式表示 vs 距离场
在计算几何建模中,场的概念不一定必须基于距离。
通常情况下,我们使用术语“隐式”来指代任何标量场,这些场通过非正值来定义形状。
例如,水平集和SIMP等拓扑优化方法可以使用距离场或任意标量场来描述形状。
在nTop中,隐式建模方法可以将拓扑优化和模拟结果转换为更方便的距离场表示。
隐式和距离场的扩展方法包括多种技术,例如函数表示、类似于体素的数据结构、有限元结构以及其他先进的技术。
这些方法使得隐式建模能够生成CAD、CAE和CAM所需的高精度输出,为复杂的工程设计提供了有效的解决方案。
一个简单的例子
如何将 B-rep 和网格模型转换为距离场,并通过一个 2D 的例子(一个带衬线的大写 R 字母)来说明如何可视化距离场。
这些不同的表示实际上是什么样子?来看一个简单的例子,一个位于原点的二维圆。
将圆表示为边界时,我们使用参数曲线来描述边界。这意味着在一个参数范围内,单个参数会沿着圆的边界轨迹移动,并且起点和终点是匹配的。对于简单的圆形,这种方法非常直观,因为我们只需跟踪一个点即可。然而,对于更复杂的二维形状,每条曲线的起始点必须与下一条曲线的终点匹配,以确保形状的完整闭合。
相比之下,隐式表示的圆形通过计算到圆心的距离减去半径来定义形状。这个函数有正确的符号,并且实际上是一个距离场。在隐式表示中,空间中每个点都精确地知道它离表面的距离,因此提供了更完整的形状视图。
因此,这两种方法的主要实际差异在于信息的定义方式:
- B-rep仅在圆形的边界轮廓上定义信息,空间中每个其他点的信息需要额外计算。
- 隐式建模直接在空间中的每一点定义了其到表面的距离,从而提供了更全面的形状描述,特别是在复杂形状和几何操作中更为强大。
小结
下面这个表格展示了B-rep和隐式模型在各个方面的区别。
特性 |
B-rep(精确边界表示) |
隐式模型 |
表示方式 |
基于面、边和顶点的几何表示方法。 |
基于整个空间中的距离场来表示几何形状。 |
将实体的边界表示为一系列连接的面,每个面由边界的曲线定义。 |
每个点在空间中的值表示该点到形状边界的距离。 |
|
数学基础 |
使用参数化的曲面和曲线来定义几何形状的边界。 |
使用标量场(如有符号距离场,SDF),其中场的值定义了点是否属于实体内部。 |
处理复杂度 |
随着模型复杂度的增加,如面数的增加,B-rep 模型的处理变得越来越困难,甚至不可行。 |
能够更好地处理复杂的几何形状,不受表面细节数量的限制。 |
自动化和稳定性 |
常见的 CAD 操作(如圆角、偏移和布尔运算)在 B-rep 模型中可能会失败,需要专业的 CAD 用户进行特殊处理。 |
由于其数学基础,隐式模型能够实现更加稳定和可靠的自动化几何操作。 |
与输入数据的耦合 |
不利于与仿真结果或环境测量数据等非几何输入直接耦合。 |
可以直接与各种输入数据耦合,生成变厚和细微几何形状,这在传统工具中几乎难以实现。 |
应用场景 |
适用于传统的机械设计和制造,尤其是低到中等复杂度的零件。 |
适用于高度复杂的细节、有机形状、扫描数据、晶格和多孔结构,以及加工和 CAM 的精确几何和工具路径数据生成。 |
参考
https://www.ntop.com/resources/blog/understanding-the-basics-of-b-reps-and-implicits/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/98018.html