图1.我们提供了一个以网格文件(左)为输入并输出其构造实体几何(CSG)表示形式的系统。 这三个关键思想是:a)使用精心设计的点样本来引导纯离散搜索问题(点,左中),b)分治算法来分割问题以确保成功(颜色,左中),以及 c)使用程序综合技术来解决每个段中的硬离散搜索问题。 输出的CSG结构(右中)可以正确推断出50多个实体图元和18个布尔运算符。 提取一部分解决方案(红色框)以进行演示(右)。
摘要
尽管计算机辅助设计是许多现代生产流水线的主要部分,但通常生成的设计文件却描述了原始几何形状。在这种表示方式中丢失的是生成这些设计的过程。在本文中,我们提出了一种以构造实体几何(CSG)语言对工程3D模型进行逆向工程的方法。观察到CSG是形式语法,我们将此逆CSG问题公式化为程序综合问题。我们的解决方案是一种将几何处理与最新程序合成技术结合在一起的算法。在此方案中,使用几何处理将CSG树的混合离散域和连续域转换为现代程序合成器擅长的纯离散域。我们在几个不同的示例上演示了我们算法的效率和可扩展性,其中包括超过100个原始部分的示例。我们证明了我们的算法能够找到接近基本事实的简单程序,并证明了该方法在网格重新编辑中的适用性。最后,我们将该方法与现有技术进行了比较。我们证明,在产生的CSG紧凑性和运行时方面,我们的算法在以前的方法中占主导地位,并且可以处理比任何以前的方法复杂得多的输入网格。
1.介绍
在过去的几十年中,计算机辅助设计(CAD)软件已成为许多现代大规模生产流水线设计的关键部分。 CAD工具在设计上是参数化的,允许设计人员创建易于修改的形状。 这使工程师可以遍历设计参数以提高对象的性能或适应现有设计,以便可以在新方案中重用它们。 因此,对于将参数化CAD表示法用于面向制造的设计探索和优化算法,人们越来越感兴趣[Schulz et al. 2017; Shugrina et al. 2015]。
不幸的是,发布的模型很少能使用CAD程序。建设性的参数表示是CAD系统的内部功能,通常仅允许将设计导出为3D网格或边界表示(B-Rep)。 结果,存在大量重要的传统模型,这些模型自创建以来的几年中就失去了原始的过程定义(procedural definitions )。 此外,许多工艺品根本不是在CAD系统中最初设计的,并且更多产品在车间进行更改(undergo shop floor changes),使原始CAD文件不准确。 对于此类模型,唯一可用的形状表示形式是制造设计的3D扫描,由于扫描过程中的瑕疵,该3D扫描必然会包含噪声。
从3D形状逆向工程CAD模型的新技术,诸如蒙特卡洛采样方法和遗传算法等吸引了许多研究人员的兴趣。 任何技术的核心都是表达力和简洁的表现形式。 参数表示法的自然选择是构造实体几何(CSG),因为它是现代CAD系统中众所周知的,广为接受的主要产品,并且其表示形式紧凑。 CSG将几何形状编码为树,这些树是通过将布尔运算符递归地应用于原始形状而构建的[Requicha and Rossignac 1992]。 在过去的20年中,将3D模型自动转换为CSG树的理论得到了广泛的研究。
但是,当前的领先技术无法很好地扩展对于大问题[Fayolle and Pasko 2016]或无法产生紧凑表示([Buchele and Crawford 2004]。 此外,与可能来自低分辨率网格或嘈杂的3D扫描的3D模型相反,这些方法假定输入形状是精确的B-Rep。 在本文中,我们基于CSG只是计算机程序的一个类,提出了一种可逆的CAD模型的新的可扩展方法。 这意味着生成CSG树的过程可被视为程序综合问题。
程序合成是一个过程,通过该过程可以从计算机预期行为的描述中生成计算机程序。这些技术试图生成不仅满足其规范的程序,而且尽可能地做到这一点。事实证明,程序综合在许多问题领域均有效,包括综合数据库的实体匹配规则[Singh等。 2017],推导excel公式[Gulwani等。 2012],以及生物学实验设计[Koksal等。 2013]。我们的工作基于基于约束的综合(constraint-based synthesis,),这是综合算法的一个特殊的类,其工作方式是象征性地表示候选程序的空间,并将在该空间中寻找正确程序固定为约束满足问题[Solar-Lezama 2008]。通过利用现代约束求解器的功能,基于约束的方法可以扩展到较大的搜索空间,并且可以通过简单地将其包含在搜索空间中而轻松扩展为覆盖不同的形状基元集。这与单纯的演绎方法相反,后者从幼稚的有效解决方案开始,并应用演绎规则来提高程序的质量(通常以程序的长度来衡量)。在没有为每个原语(primitive)量身定制的规则的帮助下,这些方法很难找到最佳解决方案。
应用基于约束的程序综合技术的来完成逆向工程CAD模型的任务有三个主要挑战。首先,最具可扩展性的基于约束的综合系统通过将问题简化为布尔可满足性(SAT)(纯离散问题)来工作。这非常适合发现CSG模型的布尔结构,但是CAD模型还涉及连续参数(例如,原始形状的位置和范围)。其次,要合成的程序的正确性自然地定义为几何约束,因为由合成的CSG程序描述的3D形状必须在空间上占据与输入网格内部包含的体积相同的体积。但是,此要求太复杂而不能用作程序合成的基础,因此我们需要将此高级要求转换为对程序行为的一组约束,合成器可以使用这些约束来有效地修剪可能的程序的空间。第三,嘈杂的输入(例如,从扫描生成的网格)会在规范方面(specification)与我们限制的原始形状产生不一致,这可能导致无法满足的矛盾约束。
在本文中,我们针对这些挑战提供了完整的以及可扩展的流水线(pipeline),用于从可以在各个级别进行近似的噪声数据生成紧凑的CSG树。通过将搜索分为两个步骤,我们解决了混合连续和离散搜索问题以及噪声问题:首先,我们使用基于RANSAC和图割的健壮原始检测方法来推断原始形状的位置和方向,它解决了有噪声输入的情况下的连续搜索问题。固定基元(primitives)的位置和方向后,剩下的搜索问题将完全是离散的,我们可以使用Sketch(基于SAT解决方案的最先进的程序合成工具)解决此问题[Solar-Lezama 2008]。为了产生适合程序综合的约束,我们利用规范的相交项[Shapiro and Vossler 1991]。我们使用由50个模型组成的CAD库进行了广泛的实验。数据集,CAD文件和源代码可随本文公开获得。
在这项工作中,我们贡献了以下内容:
- 一种将逆CSG问题的连续方面与组合方面相分离的公式,使我们能够利用成熟的程序综合技术。
- 实施完整的流水线(pipeline),该流水线以不同的近似级别从嘈杂的输入生成CSG树。
- 经验证据表明,我们的方法可以为几种复杂的模型合成CSG程序,证明了我们算法的效率,可扩展性和鲁棒性,以及其在网格重新编辑中的直接应用。
2.相关工作
我们的工作借鉴了先前有关参数化CAD建模,逆过程建模,逆向工程CAD,程序合成和图元(primitive)检测的工作思路。
使用参数化CAD建模。参数化CAD系统允许设计人员将几何定义为一系列依赖于一组参数值的程序的执行[Farin et al. 2002]。该参数表示法定义并限制了修改形状的方式,从而使其可以保留结构和其他有意义的特征,例如制造考虑因素。 Koyama et al. [2015]使用CAD参数化可制造连接器的空间。同样,Shugrina等。 [2015]和Schulz等。 [2017]使用参数化CAD模型进行面向制造的设计优化。这些最新的研究认为,直接使用CAD模型而不是对输入3D网格进行自动参数化的算法具有优势[Bokeloh等,2003年。 2012; Jacobson等。 2011;郑等。 2011]包括:(1)更大和更有意义的几何变化(相对于某些尺寸),以及(2)自动显示关系约束,这些关系约束可用于理解功能并支持多种制造方法。但是,在这些工作中,将参数模型作为输入,并假定由专家工程师精心指定。
最近有一些提取可编辑3D的工作结构或显示不包含CAD结构的输入的约束。 Chen等。 [2013]允许从图像进行几何重新编辑。 同样,徐等。 [2016]提出了一种交互式方法,用于从多视图图像中提取机制的功能信息。 但是,在这两种技术中,都使用了详细的用户草图来提取有关形状组件及其关系的信息。 在这项工作中,我们提出了一种无需任何其他用户帮助即可自动从形状生成CSG树的方法。 这种方法确定了整个结构,并提供了一种可行的方法,可以通过该方法实例化几何形状。
逆过程建模。恢复重建3D形状的几何过程列表的问题是逆过程建模的特殊情况。多年来,已经开发出两种主要策略来应对这一领域。基于识别的策略试图发现底层形状的某些属性,例如分类的几何形状或分割[Fish等。 2014; Kim等。 2013; Litman等。 2014; Tulsiani等。 2017;瓦伦丁等。 2015;谢等。 2014;朱等。 2017],以估算输入的结构。这些技术通常基于机器学习技术或几何原理规则。尽管速度很快,但它们对形状的基础结构的了解有限,并且可能难以调试。另一方面,基于搜索的策略试图通过基于采样的方法来完全解释输入形状[Chaudhuri等。 2011; Fan and Wonka 2016; Hämäläinen等。 2014; Kalogerakis等。 2012; Khungurn等。 2015;西田等。 2016; Ritchie等。 2015; Schwarz andWonka 2014; Talton等。 2011; Wu等。 2014]或直接搜索算法[Duncan等。 2016; Fu等。 2015; Lau等。 2011; Peng等。 2016;邵等人。 2016]。由于必须将搜索应用于每个输入几何,因此这些方法通常较慢;但是,它们返回几何图形的基础结构的事实通常使它们更具信息性和更强大。我们的方法借鉴了这两种技术:我们使用识别在语义上对输入几何进行分割,然后依靠采用直接搜索方法来解决约束的程序综合方法。
逆向工程CAD。对CAD模型进行逆向工程是CAD界的经典研究问题。该问题的输入通常是表示为表面网格或点云的形状,而输出是可以在CAD软件中用于进一步操作的实体3D模型。这个问题的核心是将网格的边界表示(B-rep)转换为CSG模型的步骤。 [Shapiro and Vossler 1991]首先提出了一种解决方法,该方法解决了使用半空间将b-rep转换为CSG模型的一般问题,并且在以后的工作中提出了很多改进[Buchele 1999; Buchele和Crawford,2004年;布赫勒(Buchele)和角色(Roles)2001; Shapiro and Vossler 1993]。在较高的层次上,这一研究尝试以演绎的方式解决问题:给定网格上的一组表面补丁,该方法尝试通过应用一系列规则来找到它们的正确组合,例如半平面完全包围输入形状,然后解可以表示为该半空间与其他所有物体的交集。结果,解决方案的质量很大程度上取决于可以找到适用的一组规则。我们的方法与以前的工作形成了鲜明的对比,因为我们提出了一个搜索问题,该问题使现代程序合成器可以比以前的工作探索更大的空间并解决更大的示例。
反向工程模型的另一系列方法是进化算法。 已经尝试使用遗传算法来优化CSG树,从而满足某些约束条件[Hamza和Saitou 2004; 2004年。 Weiss 2009]。 最近的工作[Fayolle and Pasko 2016]考虑了将B-rep作为进化算法输入的可能性。 他们方法的输出是一个CSG树,它非常接近表面边界。 进化算法的瓶颈是运行时间长和计算资源的大量消耗。 此外,它们的不确定性使整个优化过程中难以控制和理解其行为。 相比之下,尽管我们的方法也搜索很大的空间,但是搜索的方向更加直接; 约束求解器能够利用约束的结构来修剪空间的大部分,并更快地收敛到解决方案。
有两篇同时的论文试图解决相似的问题,但从不同角度看:CSGNet论文[Sharma等。 2018]训练了一个神经网络,该神经网络将2D或3D形状作为输入并输出CSG程序。 与他们的工作相比,我们的方法不需要训练数据集,并且我们在复杂性更高的3D形状上演示了我们的算法。 Wu等。 [2018]通过提取原始图元并推断CSG树结构,从原始点云中重建CSG树。 在构建CSG树时,他们将边界框划分为体素,并将每个体素标记为点云的内部或外部。 然后,通过基于每个体素的标签解决能量最小化问题,以自下而上的方式构建CSG树。 我们的工作具有相似的流程,但是不需要将输入离散化为体素,这使我们能够处理各个级别的细节输入。
程序综合。程序综合领域也有悠久的历史[Alur等。 2013; Gulwani等。 2017]。 有几种程序合成方法,包括基于约束的搜索[Solar-Lezama等。 [2006],枚举搜索[Udupa等。 2013]和随机搜索[Schkufza等。 2014]。 此外,还有专门针对某些领域的程序综合系统。 例如,Gulwani等。 [2011]使用专门的算法非常有效地学习字符串转换程序。 演绎综合技术在程序综合领域也有悠久的历史,包括许多近期的成功案例[Delaware等。 2015; Püschel等。 2004]。 这些技术通常可以很好地扩展,因为它们将综合问题分解为小的局部推理步骤。 但是,可能难以设计演绎规则和规则应用启发法以确保系统有效地找到良好的解决方案。
对于逆向CAD,基于约束的方法更适合因为枚举搜索无法扩展。 这是由于大型的高维搜索空间; 随机方法通过采样技术找到正确程序的可能性很小。 因此,在本文中,我们使用了基于约束的程序综合系统,称为Sketch [Solar-Lezama 2008; Solar-Lezama等。 2006]。 从允许用户以高级语言指定描述可能程序空间的语法的意义上说,Sketch是一种通用的合成系统,并且可以自动生成SAT解算的约束。
原始检测(Primitive Detection)。 原始检测是一个经过充分研究的问题并且已经提出了许多解决方案[Attene等。 2006年; Cohen-Steiner等。 2004; Le and Duan 2017; Li等。 2011; Schnabel等。 2007; Wu Leif Kobbelt 2005; 严等。 2012]。 特别是,李等人。 [2011]提出了一种原始检测方法,旨在满足CAD约束(如对称性或垂直性)。 我们不直接将其方法应用于我们的问题,因为CAD模型并不总是具有这样的假设。 相反,我们基于RANSAC方法实现了原始检测器[Schnabel等。 [2007]。
3.概述
在本节中,我们陈述了逆CSG问题并给出了该方法的概述。 这是第4节和第5节中描述的算法的简化版本。在第6节中,我们使用分段过程扩展了该算法,该过程允许我们的方法扩展到更复杂的几何形状。 图2说明了我们方法的流水线。我们在50个CAD模型的基准上测试了我们的方法。 数据集,CAD文件和源代码可随本文公开获得。 在CAD文件方面,我们使用OpenSCAD [OpenSCAD 2018]定义的格式,因为它是开源的并且免费提供。 请注意,某些生成的网格中的零体积曲面是由于OpenSCAD的数值不稳定性引起的。这些人工产品(artifacts)不是表明所生成的CSG树不正确的指标。 作为比较,我们在商业软件中为相同的CSG树建模并获得清晰的结果(图3)。
3.1 逆CSG
给定输入表面网格M,我们希望找到一个程序生成一个输出几何图形,这样,当且仅当它也位于M的内部时,空间中的每个点都在其内部。简而言之,这意味着M的内部和该几何必须占据相同的体积区域。在本文中,我们重点介绍CSG程序的空间,可互换地称为树。 正如我们将在第4节中正式描述的那样,CSG语法提供了完整的3D几何语言,使其成为一种富有表现力的选择。 在较高的层次上,CSG语法由离散布尔运算符和3D几何图元组成,它们被描述为离散参数和连续参数的混合。 据我们所知,没有现有的搜索方法可以有效地搜索CSG程序结构及其离散和连续参数。因此,解决方案的关键是将这种混合搜索问题简化为纯离散搜索。
3.2 方法概述
我们的方法以流形表面网格作为输入,并执行智能的几何预处理,以将问题转换为紧凑,离散的形式,程序合成中的现有方法可以有效解决该问题。下面我们简要描述流水线中的每个步骤(图2)。
原始检测(Primitive Detection)首先,通过在搜索空间中提出一组候选图元(primitives)我们解析连续参数(第4.1节)。这个离散的集合涵盖了所有原始选择,并且是根据输入表面的几何特征和几何推理生成的。此步骤将固定每个连续参数的值,并将混合搜索问题简化为离散问题。该步骤对于噪声也很鲁棒,可以处理近似值。
采样 我们最初的问题陈述很难作为综合过程的规范。幸运的是,正如先前的工作[Shapiro and Vossler 1991]指出的那样,给定有限的原语(primitives)集,人们可以选择有限的点约束子集,从而使其余约束变得多余。因此,该方法从整个点约束集中智能地进行采样,仅保留那些为我们的搜索添加信息的约束(第4.2节)。此步骤将无限约束集转换为有限约束集。
合成 由于逆CSG问题简化成在离散语言的紧凑语义搜索,因此我们应用程序合成技术来有效解决该问题(第5节),将采样点作为约束。 在该步骤的最后,保证该方法找到可行的CSG程序,其输出尽可能与输入网格几何形状匹配。
后期处理 最后,我们进一步使用演绎规则简化输出程序,然后重新设置程序的参数,以方便最终用户编辑(第7节)。
4.逆CSG公式
我们陈述问题定义如下:
定义4.1 给定一个网格M,目标是找到一个简单的CSG树,使其内部占用相同的体积空间 :
在这里,Complexity 是评估树的复杂度的离散函数。在我们的实现中,我们将CSG限制为二叉树,并将Complexity 定义为树中的节点数。 引入Complexity 会使我们的搜索偏向于更简单的CSG树。 约束将检查所有点,并确保且仅当每个点也在M内时,每个点才在CSG内。
语法 在根据定义4.1描述如何解决问题之前,我们首先需要指定CSG树的搜索空间。 此搜索空间由图4所示的语法定义。在此语法中,每个叶节点都是一个实心图元,并通过变量进行参数化,以使其形状完全在3D空间中定义。 例如,如果Type是一个球体,则Parameter由其中心和半径组成。 在我们的实验中,我们考虑了四种关于实体图元的类型-球体,圆柱体,长方体和花托-但添加更多图元类型很简单。 语法中的内部节点是标准布尔运算符:并集,交集和减法。
上面的问题定义揭示了两个挑战:首先,CSG程序的搜索空间将离散变量(布尔运算符和图元选择)和连续变量(图元参数化)结合在一起,从而使优化问题本质上具有挑战性。 其次,此问题指定了要满足的无限数量的约束,因为它考虑了3D空间中的所有点。 4.1和4.2小节讨论了我们应对这些挑战的解决方案。
图2 带有2D示例的流水线概述。作为输入,我们的方法采用了可能有噪声的曲面网格。首先,我们提取场景中可能的图元的过于完整(over-complete)集合(左蓝色框)。在此示例中,检测到两个圆以及四个超平面。在预处理的第二步(中左蓝色框)中,我们的方法尝试在场景的每个区域中添加标记的样本,如表面图元所分割。输入几何图形内部(外部)的样本用蓝色加号(红色减号)表示。样本和图元被馈入我们的合成器(右中蓝色框),该合成器生成正确的CSG程序作为输出。生成的程序经过后期处理(右侧的蓝色框);它的程序结构得到了简化(未显示),并且其几何参数已使用元参数进行了重新参数化,从而可以进行交互式编辑。在此,正负空间圆被对称地检测并通过单个半径变量进行了元参数化。然后对其进行编辑,以使身体更大,尾巴更细,同时保留匹配的曲率。
图3 这里显示了流水线(pipeline)生成的一个网格结果(左)。 请注意,红色框中的退化平面无法由OpenSCAD解析。 我们在OnShape(右)中为建模出一样的CSG树,所有这些零体积平面均已成功删除。
图4 CSG语法。 叶节点是具有几何类型和形状参数的实体图元。 内部节点是布尔运算符。
4.1 检测图元
我们首先通过检测网格中的图元来除去连续变量。 但是,请注意,尤其是对于诸如长方体的图元,很难从表面推断出完整的实体图元参数。 因此,在此阶段,我们只能检测表面图元(surface primitives),例如球形表面,(无限大)平面和(无限长)圆柱表面。 每个表面图元都表示一个边界,且可以从网格本身进行如实检测。我们将首先讨论检测所有表面图元的方法,然后描述如何从它们中提取实体图元 。
4..1.1 检测表面图元 表面基元检测的目标是双重的:局部地,对于网格中的每个面,我们希望找到一个尽可能接近的表面基元。 在全局范围内,表面基元的总数应保持较低,以避免过度分割。 我们的表面原始检测器建立在有效的RANSAC方法之上[Schnabel et al. 2007],并进行了一些扩展以提高其健壮性和灵活性。 首先,我们多次运行高效的RANSAC算法,并收集各种规模的表面图元。 其次,我们通过在网格表面上定义的图G =(V,E)上运行图切算法来选择表面图元集,其中每个小平面是一个节点vi,每对相邻小平面定义一条边 令{f1,f2,···}作为第一步中检测到的表面基元的集合,我们然后找到一个图割,以便通过最小化以下能量将fs分配给每个面vi:
每个面的一元能量定义为
其中f是分配给vi的表面图元。 每个边上的二进制能量为
其中fi和fj是分配给vi和vj的表面图元。 标签能量定义为
标签能量可以看作是输出原语集上的稀疏字符,更倾向与需要较少的图元的分配。 这个术语很有用,因为我们多次调用RANSAC可以检测到大量潜在的表面图元。标签能量项有助于修剪不必要的图元。
用户定义的比例因子α和β允许在偏向小平面的短距离和减少数量的表面图元之间做权衡。 将有效的RANSAC和图割算法相结合,可以得到一种表面原始检测器,该检测器既对噪声稳定,又可以灵活地近似各种级别的网格。
4.1.2 添加辅助平面
上面的算法可以检测所有可见的表面图元。 为了重建实体图元,我们还需要推断隐藏的表面。 例如,如果长方体的一个面隐藏在另一个实体图元内部,则不可能准确确定长方体的尺寸。 我们使用[Shapiro and Vossler 1991,1993]中的方法添加辅助平面。 具体来说,我们将使用简短描述的点样本来检测是否需要一个新的辅助平面,并选择添加平面位于特定锚点(例如,球体的中心)并且平行于检测到的表面图元。
4.1.3 建立实体图元
一旦收集了所有表面图元,我们便构建了实体图元。 构建实体图元本身可以表示为离散搜索问题:我们首先通过将f(x)= 0替换为f(x)≥0,x∈R3来局部固化表面图元,然后通过以下方法构建实体图元: 与单独固化的表面图元相交。 例如,可以通过搜索三对彼此正交的平行平面并根据其符号与自己本身或补集相交,从而建立长方体。 尽管这种实体图元基本结构在语法中的叶节点下方增加了一层搜索,但是搜索空间现在是完全离散的:所有连续参数都已在此确定,并编码为离散搜索。
4.2 减少约束的数量
既然我们已经将搜索空间减小到一个离散的空间,下一步就是处理无限数量的点约束。 先前的工作[Shapiro and Vossler 1991, 1993]为解决该问题奠定了理论基础,我们在下面简要介绍:
定义4.2(规范交集项)令{f1,...,fn}为所有表面图元的集合。规范交集项C定义为,其中Fi为{x | fi(x)> 0}或{x | fi(x)<0}。
换一种说法,规范交集项是由每个表面图元诱导的半空间的相交。 基于以上定义,[Shapiro and Vossler 1991]提出了以下可描述性定理:
定义4.3 如果存在一个叶子为且与网格内部占据相同体积区域的CSG树,则输入网格可用表面图元{f1,...,fn}描述。
定理4.4 当且仅当每个规范交集项相对于网格具有相同的分类时,才可以使用表面图元{f1,...,fn}描述输入网格。
该定理基于以下事实:每个规范交集项都完全包含在或排除在CSG树中,因此,当且仅当每个规范交集项完全在网格的内部或外部时,输入网格才可以准确地重构。 结果,不用检查每个点,仅检查每个规范交集项中的一个代表点就足够了。
4.2.1 基于采样的方法
尽管[Shapiro and Vossler1991]建立了理论基础,但它假设所有规范的相交项(规范交集项)都是预先给出的。 但是,在实践中,随着规范相交项的数量组合增长,快速枚举所有规范相交项变得非常棘手。 这促使我们使用基于采样的方法从几乎所有规范的相交项中查找代表:我们对输入网格的边界框内的点进行统一采样,然后在每个规范的相交项中仅保留一个代表性采样。 然后,根据它们分别位于输入网格内部或外部,将所有得到的代表分为P +和P-两组。
4.2.2 处理不完全输入
有时,由于缺少表面图元,或者由于网格嘈杂或不完美,因此无法精确地重建输入网格。 当我们为代表分配标签(正或负)时,这会造成歧义,因为正样本和负样本都可能出现在单个规范相交项中。 在这种情况下,我们基于该规范相交项中的大多数样本来分配标签。 这等效于找到CSG树,以使它和输入网格之间的体积差异最小。
此步骤总结了预处理步骤,并为我们带来了有限数量的约束更容易解决的问题:
定义4.5 问题(1)可以等效地重新定义为以下离散问题:
4.3 A Naïve Algorithm
算法1描述了一种朴素的算法,该算法针对定义4.5中的问题产生了可行的CSG解决方案,该解决方案满足了所有约束,但并未尝试最小化其复杂性。 直观地讲,算法1输出一个长程序,该程序生成一个通过合并许多小的3D片段生成一个扁平的CSG树。为了粗略了解在最坏的情况下生成的CSG树可能有多大,请回想一下,n个通用平面的排列将空间划分为O(n3)个非空正则交集项,当该交集迅速增长到成千上万个区域时, 我们将n增加到甚至小到30的数字。即使输入网格仅占其中的百分之一,这仍然会留下数百个子树供算法1合并。 结果是,
实际上,仅当| P + |非常小时,此算法才返回简洁的CSG程序。
5.使用程序合成的算法
算法1为定义4.5中定义的问题提供了有效的解决方案。 但是,由此产生的CSG程序远非紧凑。 使用集合理论规则可能会在某种程度上简化此CSG程序,但是将算法1生成的解决方案中的所有小区域拼凑在一起,本质上是一项艰巨的任务。 在本节中,我们描述一种使用程序合成直接搜索满足定义4.5中约束条件的简单程序的算法。 由于即使是小型程序也可能导致很大的搜索空间,因此对于本节中描述的算法,我们假设所需的CSG程序的大小较小。 在下一节中,我们将通过提供一种在程序综合之上运行的分治算法来纠正此可伸缩性问题。
程序合成 在程序合成中,定义一个程序空间,并尝试在该空间中搜索符合输入规范的程序。对于此算法,我们将搜索空间定义为在第4节中指定的语法内最多具有k = 32个节点的所有CSG树。我们定义规范正(负)代表点P +(P-)位于CSG程序生成的网格的内部(外部)。具体来说,在所有不超过k个节点的CSG树中,合成器必须找到能够满足P +和P-点约束的最小树。可以看到,如果存在一个满足所有点约束的大小为k的树,则合成器理论上应该能够在搜索空间中找到它。合成器的成功取决于其快速搜索巨大搜索空间以找到令人满意的解决方案的能力。举例说明该搜索空间有多大,假设选择10个实体图元和深度5,则有效CSG树的总数为4.3×10的二十五次方,从而使搜索空间的任何显式枚举都不可行。在我们的工作中,我们依靠Sketch [Solar-Lezama et al. 2006],这是一个先进的程序综合系统,它使用基于约束的推理(使用SAT求解器)来有效地搜索该空间。 Sketch使您可以选择搜索全局最佳解决方案或仅执行最大努力优化。在我们的实验中,我们执行最大努力优化来运行,因为它速度更快并且在实践中效果很好。
反例引导归纳(Inductive )合成(CEGIS) 允许Sketch缩放的关键算法组件之一是反示例引导归纳综合(CEGIS)算法。洞察力是,虽然需要满足程序上的所有约束才是正确,但合成器并不需要考虑所有约束以生成正确的程序:假设我们正在合成线性函数y = mx + b,那么可以是在线上成千上万的点约束,但只需要2个不同的点。 CEGIS使用两个子程序,一个合成器和一个检查器:合成器解决约束子集上的搜索问题,生成候选程序。检查器获取候选程序,并在可能的情况下产生反例-即使候选程序无效的约束。这个反例被添加到约束的子集中,促使合成器找到更好的候选程序。当检查器无法生成反例时,CEGIS成功终止,而在合成器无法生成候选程序时,CEGIS终止失败。通过向子集迭代添加反例,CEGIS限制了合成器需要考虑的约束数量,从而使合成具有可伸缩性。
我们的算法 现在,我们有足够的信息来描述基于Sketch和CEGIS构建的算法2。 假设所需程序在为Sketch提供的程序空间之内,则该算法旨在解决小规模问题。 该算法返回满足所有点约束的简单的CSG树。
定理5.1 如果满足条件,算法2将在有限时间内找到可行的解决方案 如果所需程序位于合成器提供的搜索空间中。
证明可以在附录A中找到。
6 大规模问题的算法
现在,我们描述如何将第5节中的算法扩展到大问题。 关键的见解是从定义4.5中分离出点约束集,以便合成器仅需为实际网格的一小部分发现程序(discover the program)。 在极端情况下,如果我们仅给出一个正点约束来满足,那么我们总是可以切换到算法1以确保成功。 正式地,该想法由定理6.1陈述:
定理6.1 令为定义4.5中
的分区。 令Ti为以下问题的解决方案:
证明可以在附录A中找到。
虽然定理6.1没有指定分区方法,实际上,诸如网格分割或点云分割之类的语义上有意义的分区比任意分区产生更简单,更具语义上意义的程序。 这是直观的,因为几何上相似的点通常更有可能来自相同的CSG子树。 在我们的实验中,我们测试了曲面网格分割,光谱聚类和分层聚类聚类(HAC)。 我们发现HAC提供了算法简单性和理想结果的最佳折衷方案。
算法3显示了基于定理6.1的最终算法。它在不同的分区上递归调用算法2。 如果合成器在任何分区上失败,则将分解正约束并再次运行算法。对于基本情况 时,算法恢复为算法1,可以保证为该分区产生一个解决方案。 但是,达到基本情况非常罕见(在我们的实验中从未发生过),因为合成器可以处理的搜索空间通常比单个分区的大小大得多。
定理6.2 算法3保证在有限时间内产生定义4.5中问题的可行解决方案。
证明可以在附录A中找到。
7 后期处理
后处理过程分为两个阶段。 首先,我们的方法试图进一步简化算法3返回的CSG树。第二,检测对称模式并重新参数化以供最终用户重新编辑。 我们依次描述了每个过程。
7.1 简化
按照算法3,我们开始简化其输出的过程(procedure)。 由于输出是程序综合系统针对不同段产生的输出的并集,因此跨段(across the segments)可能存在一些不必要的冗余。 通过应用一组等效规则来简化输出CSG树,我们消除了这些冗余。
这种简化包括三个步骤。 第一步,确定了所有极为相似的实体图元对。 如果两个实体图元的类型相同并且它们的位置,方向和参数化在欧几里得距离上都接近,则认为它们相似。 这些相似的实体图元被单个通用实体图元替换。
在第二步中,所有交点和合集都被展平与(flattened with)各自的嵌套操作,并消除了多余的表达式。 例如,将(A∪B)∪A展平为(A∪B∪A),并消除多余的∪A,得到A∪B。 如果所有联合(unions)都更改为交叉点(intersections),则同样如此。 但是,在此步骤中不会以任何方式简化混合运算符的表达式,例如(A∪B)∩A。
在第三步(也是最后一步)中,我们的算法递归地尝试简化嵌套表达式。在每次简化过程中,将比较所有子表达式的所有组合,并贪婪地应用一组规定的简化规则。如果在表达式树中的某个深度处简化了一对子表达式,则将整个树从该节点向下重新简化,以便利用可能新暴露的简化。
7.2 基于对称的重新编辑
虽然生成的CSG树很有用,因为可以直接对其进行编辑,但树的每个组件都是独立的。参数化隔离到(isolated to )每个单独的实体图元。为了方便用户浏览和编辑生成的CSG树,我们重新参数化了生成的CSG树的某些实体图元,以利用潜在的对称性。尤其是,我们在CSG树中遍历每对相同类型的实体对,并比较它们的体积参数化。对于每对,我们比较球体半径,圆柱半径,圆柱高度和长方体边界框范围三元组(不考虑顺序)。如果这四个量中的任何一个都匹配,我们将认为该实体本原对在该参数(或长方体的情况下为参数集)中是对称的,并使用元参数对其进行重新参数化。此元参数化允许通过更改单个值来同时编辑所有检测到的对称实体图元,从而保留检测到的对称性。
8 结果
在本节中,我们首先提供一个新的数据集,用于对不同逆向工程方法的性能进行基准测试(benchmarking)。 然后,我们将算法与两个基线进行比较,并在数据集上报告其性能(performances )。 对于数据集中的几乎每个模型,我们的方法设法找到比基线方法更紧凑的CSG树,并重构所有相对误差小于7%的示例(图8)。 接下来,我们通过在不完善的网格上进行测试来证明该方法的鲁棒性。 最后,我们讨论了简化步骤的有效性并提供了网格重新编辑示例。
8.1 基准(Benchmark)
尽管将曲面网格(surface mesh)逆向工程到CSG树是一个长期研究的问题,但并没有付出很多努力来构建用于评估不同算法的测试集。 缺乏高质量的数据集使得在不同方法之间进行公平比较变得更加困难。 在这项工作中,我们尝试通过显示一个数据集来弥补这一差距,该数据集由50个复杂程度不同的干净曲面网格组成。 这些网格是从以前的工作中的示例中收集的[Buchele and Crawford 2004; Fayolle and Pasko 2016] 和在线CAD库[GrabCAD 2018; Thingiverse 2018; Zhou and Jacobson 2016],包括括号,齿轮和结(knot)结构之类的对象。 这些表面网格中最简单的可以由少于10个表面图元构建,而最复杂的模型则需要100多个表面图元。 我们要求读者参考图5、6和7以获得更多详细信息。
我们使用这个基准集来评估我们的算法和两条基线[Buchele and Crawford 2004; Fayolle and Pasko 2016]。每种方法都将数据集中的网格作为输入,并输出可以找到的最佳CSG树。 我们根据三个指标评估方法:树的复杂性(节点数),网格和树之间的体积差异以及运行时间。
图5。这里显示了基准测试和解决方案中的五个示例。 左:输入网格。 中:从我们的CSG解决方案重建的输出网格。 右:用于可视化目的的中间CSG结果。 我们通过执行后序树遍历来可视化CSG树。 对于这五个示例,可以在我们的视频中找到完整的可视化效果。