百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

B-rep 和 隐式建模的基础知识(隐式建模技术)

toyiye 2024-07-06 00:29 34 浏览 0 评论

传统的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/

相关推荐

如何用 coco 数据集训练 Detectron2 模型?

随着最新的Pythorc1.3版本的发布,下一代完全重写了它以前的目标检测框架,新的目标检测框架被称为Detectron2。本教程将通过使用自定义coco数据集训练实例分割模型,帮助你开始使...

CICD联动阿里云容器服务Kubernetes实践之Bamboo篇

本文档以构建一个Java软件项目并部署到阿里云容器服务的Kubernetes集群为例说明如何使用Bamboo在阿里云Kubernetes服务上运行RemoteAgents并在agents上...

Open3D-ML点云语义分割实验【RandLA-Net】

作为点云Open3D-ML实验的一部分,我撰写了文章解释如何使用Tensorflow和PyTorch支持安装此库。为了测试安装,我解释了如何运行一个简单的Python脚本来可视化名为...

清理系统不用第三方工具(系统自带清理软件效果好不?)

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

【信创】联想开先终端开机不显示grub界面的修改方法

原文链接:【信创】联想开先终端开机不显示grub界面的修改方法...

如意玲珑成熟度再提升,三大发行版支持教程来啦!

前期,我们已分别发布如意玲珑在deepinV23与UOSV20、openEuler24.03发行版的操作指南,本文,我们将为大家详细介绍Ubuntu24.04、Debian12、op...

118种常见的多媒体文件格式(英文简写)

MP4[?mpi?f??]-MPEG-4Part14(MPEG-4第14部分)AVI[e?vi??a?]-AudioVideoInterleave(音视频交错)MOV[m...

密码丢了急上火?码住7种console密码紧急恢复方式!

身为攻城狮的你,...

CSGO丨CS2的cfg指令代码分享(csgo自己的cfg在哪里?config文件位置在哪?)

?...

使用open SSL生成局域网IP地址证书

某些特殊情况下,用户内网访问多可文档管理系统时需要启用SSL传输加密功能,但只有IP,没有域名和证书。这种情况下多可提供了一种免费可行的方式,通过openSSL生成免费证书。此方法生成证书浏览器会提示...

Python中加载配置文件(python怎么加载程序包)

我们在做开发的时候经常要使用配置文件,那么配置文件的加载就需要我们提前考虑,再不使用任何框架的情况下,我们通常会有两种解决办法:完整加载将所有配置信息一次性写入单一配置文件.部分加载将常用配置信息写...

python开发项目,不得不了解的.cfg配置文件

安装软件时,经常会见到后缀为.cfg、.ini的文件,一般我们不用管,只要不删就行。因为这些是程序安装、运行时需要用到的配置文件。但对开发者来说,这种文件是怎么回事就必须搞清了。本文从.cfg文件的创...

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统,本次使用的是开源鸿蒙主板,搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件,包括核心板、开发板、嵌入式主板,工控整机等...

Python9:图像风格迁移-使用阿里的接口

先不多说,直接上结果图。#!/usr/bin/envpython#coding=utf-8importosfromaliyunsdkcore.clientimportAcsClient...

Python带你打造个性化的图片文字识别

我们的目标:从CSV文件读取用户的文件信息,并将文件名称修改为姓名格式的中文名称,进行规范资料整理,从而实现快速对多个文件进行重命名。最终效果:将原来无规律的文件名重命名为以姓名为名称的文件。技术点:...

取消回复欢迎 发表评论:

请填写验证码