一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

单元收缩包裹的制作方法

2022-05-08 09:49:07 来源:中国专利 TAG:


1.本发明涉及计算机程序和系统领域,并且更具体地涉及用于设计建模对象的包络的方法、系统和程序。


背景技术:

2.市场上提供了许多用于对象的设计、工程和制造的系统和程序。cad是计算机辅助设计的首字母缩略词,例如它涉及用于设计对象的软件解决方案。cae是计算机辅助工程的缩写,例如它涉及用于模拟未来产品的物理行为的软件解决方案。cam是计算机辅助制造的首字母缩略词,例如它涉及用于定义制造过程和操作的软件解决方案。在这种计算机辅助设计系统中,图形用户界面在技术效率方面起着重要的作用。这些技术可能嵌入在产品生命周期管理(plm)系统中。plm指的是一种商业战略,帮助企业共享产品数据,应用通用流程,并利用企业知识进行从概念到产品生命尽头的跨越扩展企业概念的产品开发。达索系统(dassault syst
è
mes)(以catia、enovia和delmia为商标)提供的plm解决方案提供了组织产品工程知识的工程中心,管理制造工程知识的制造中心和使企业集成和连接到工程和制造中心的企业中心。整个系统提供了开放的对象模型,其连接产品、流程和资源,以实现动态的、基于知识的产品创建和决策支持,从而推动优化的产品定义、制造准备、生产和服务。
3.在这种上下文中,计算机图形领域提供了越来越有用的技术。现实世界对象的模型由复杂的几何结构表示。在工业中的几个设计过程中,需要包络,例如,包含原始模型的模型,该模型在尊重建模对象的设计意图(即,与对象在现实世界中的使用和目的有关的设计者规范)的同时,简化建模对象的几何特征的细节。因此,建模对象的设计意图指定了建模对象的主要的几何和拓扑特征。主要几何特征可能包括凸区域和非凸区域,和/或模型中存在的孔或间隙。在设计过程中,可能需要丢弃不可见的几何结构,或简化建模对象。这样的模型可能包括由数百万个元素组成的复杂几何结构,这些元素可能对用户不可见(即,与设计意图无关)但仍然被渲染。对于非常复杂的模型,渲染可能变得越来越困难,例如,3d模型可能包括数亿个三角形,这些三角形包括用户不可见的几何结构,或设计过程中不需要的其他内部几何结构。因此,渲染需要计算负载,该计算负载会影响设计过程中用户的人体工程学,例如,由于帧速率太低而无法进行实时交互引起的。在这种情况下,可以手动去除不可见的几何结构以仅保留外部几何结构。但是,对于复杂模型,手动去除不可见的几何结构是一个昂贵且耗时的过程。此外,外部几何结构可能仍然包含手头设计任务可能不需要的细节,或者它可能仍然太复杂而无法进行实时渲染。
4.包络可以通过去除不必要的几何结构来降低几何外观的复杂性,同时仍然保留主要的拓扑特征,并且从而保持设计意图。例如,涉及增强现实的计算机模拟就是这种情况。即使不渲染不可见的几何体,模型也可能太复杂而无法在商用机器中渲染。在这种上下文中,冒名顶替几何体是具有代表实际模型的低三角形计数的网格。使用这种冒名顶替者几何体(也称为替换模型),原始模型的外观被“烘焙”(在计算机图形领域本身已知)为冒名顶
替者的纹理。作为另一个例子,模拟流体中的物体可能只需要模拟主要拓扑特征的流体动力学。模型的包络仍保留主要拓扑结构,但会关闭小间隙或关闭确实影响模拟意图的零件内的孔。
5.存在获得包络的一些技术,这些技术可用于上述应用中的某些应用。在3d图形的上下文中,包裹用于去除3d模型的不可见面,从而缩减三角形的数量。所述包裹可以由夹套(jacketing)使用。
6.以下方法描述了jacketing技术,即确定模型的面的可见性。
7.第一种方法是从不同的相机视图渲染模型:在这种方法中,3d空间中的3d模型和许多相机放置在模型周围。对于每个相机,都会渲染一张表示相机查看的3d模型的图片。在该图片中创建像素的每个面仍然是可见的面,而没有从任何相机创建像素的面被去除。
8.然而,第一种方法有几个缺点。第一个缺点是图片的分辨率限制了包裹的细节:图片的细节越少涉及包裹的细节就越少。其次,包裹的细节取决于相机的数量。然而,高密度的相机以及每个相机捕获的每张图片的分辨率导致计算时间过长,这对于复杂的模型来说变得令人望而却步。第三个缺点,不能保证设计意图会被保留。事实上,非凸区域没有被正确覆盖,或者虽然从不同的(更近的)视图中可以看到面,但面可能会被去除。
9.从周围的球体发射“可见光”是第二种方法。这种方法是从根据不同的相机视图渲染模型的方法扩展而来。射线的原点放置在球体上(围绕模型),并且射线射向模型。被射线击中的面保持可见,而未被任何射线击中的面被去除。
10.但是这种方法包括也有缺点。
11.与第一种方法类似,包裹的细节取决于射线的密度。然而,高密度的射线会导致处理时间过长,这对于大型设计来说是令人望而却步的。第二个缺点是设计意图可能不会被保留,因为非凸区域没有被正确覆盖,尽管从不同的(更近的)视图中可以看到面,但面可能会被去除。
12.shrink-wrap是这样一种方法,其中围绕模型的边界球体收缩和变形。变形球体的几何结构接近模型,即变形球体不与原始模型相交而是与物体保持很小的距离。由于包裹的“刚度”,包裹通常覆盖小孔,但它也可能覆盖更大的开口。然后将射线的原点放置在包裹网格上并射向3d模型的网格。
13.现在讨论这第三种方法的一些缺点。首先,使周围球体变形需要对包裹网格和与原始几何体的相交测试进行自适应细化。这会导致处理时间过长,这对于大型模型来说是令人望而却步的。其次,这种方法没有保留设计意图。当设计意图包括变形球体不考虑的拓扑特征(例如孔)时,情况尤其如此。例如,正如拓扑学领域本身已知的那样,用这种方法不可能获得甜甜圈的包裹(具有连续的表面和孔)。事实上,甜甜圈的包裹会在孔区域接触到自身。由于初始球体只是自适应细化而不是通过任何切割打开,因此不可能获得具有多个孔的对象的等效包裹形状。同样的问题适用于任何连续收缩和变形的几何对象,正如拓扑领域本身已知的那样。值得注意的是,在冒名顶替者几何结构的情况下,不正确覆盖区域处的冒名顶替者的纹理内容是未定义的,因此冒名顶替者几何结构在渲染时会出现畸变。
14.此外,设计意图也可能不会被保留,因为面可能会被去除,尽管它们从不同的(更近的)视图中是可见的。
15.现在讨论一种称为局部凸包络的方法。在这种方法中,模型被划分为包含子体积
(在3d设置中也称为体素)的单元的栅格。对于每个子体积,计算凸包几何结构。最后,合并所有封包几何结构以获得完整模型的连续封包表面。
16.这第四种方法有一些缺点。栅格子体积的大小决定了要闭合的间隙的大小,从而影响设计意图。如果子体积的大小明显小于模型的间隙(例如,小两倍以上),则然后包络通过间隙进入内部几何结构,该间隙包括建模对象的内部(即,不可见)几何结构,从而捕捉到不必要的细节。如果它太大,所有尺寸小于子体积的间隙可能会被忽略,并且一些几何区域(例如,非凸区域)没有被正确覆盖,因此包络丢失了很多细节,或者错误地捕捉一些几何区域或拓扑特征,从而不保留设计意图。在此设置中,用户因此必须事先指定子体积的大小。此外,约束可能太高而无法实施和/或无法做出合适的选择来保持设计意图,即,尽管从不同的视图可以看到面,但可能会被去除,或者许多面虽然不可见但并未被去除。
17.用于生成包裹的现有建模软件包,使用类似于上述方法的技术,例如:
18.·
autodesk maya使用类似于shrink-wrap方法的方法。值得注意的是,它需要手动交互来对网格重新拓扑,以便允许闭合更大的间隙或孔。
19.·
blender也使用了shrink-wrap方法的版本,但它进一步允许使用另一个对象收缩到建模对象的表面。但是,与shrink-wrap方法一样,收缩的对象不符合模型的拓扑结构。因此,用户必须手动验证围绕孔的包裹是否正确。
20.·
houdini创建模型的点的凸包。局部凸包方法的缺点仍然存在,例如,子体积的大小决定了闭合的孔的大小。
21.在该上下文中以及其他上下文中,仍然需要用于设计建模对象的包络的改进方法。


技术实现要素:

22.因此,提供了一种用于设计建模对象的包络的计算机实现的方法。该方法包括:
23.·
提供被离散化为单元的栅格的建模对象,从而获得栅格,该栅格包括与建模对象相交的单元的第一集合和空单元的第二集合;
24.·
通过以下操作添加与建模对象相邻的n层,n是正整数:
25.о通过对于每一层执行以下操作来添加n-1层:
[0026]-识别所述第二集合中的作为第一集合的相交单元的邻域的空单元;
[0027]-将第二集合的已识别的单元添加到第一集合的单元的集合中;
[0028]
о通过执行以下操作来添加第n层:
[0029]-识别所述第二集合中的作为第一集合的相交单元的邻域的空单元;
[0030]-将第二集合的已识别的空单元添加到第三集合单元中;
[0031]
·
计算第三集合的单元的一个或多个连续集合;
[0032]
·
识别包围已离散化的建模对象的一个或多个连续集合并且仅将识别一个或多个连续集合的单元保留在所述第三集合中;
[0033]
·
通过对每个添加的n-1层执行以下操作来缩减(s50)单元的第一集合:
[0034]
о识别所述第三集合中的作为第一集合的单元的邻域的单元;
[0035]
о将作为第三集合中的已识别的单元的邻域的第一集合中的单元添加到单元的第三集合中;以及
[0036]
·
根据第三集合的单元计算(s60)所提供的建模对象的包络。
[0037]
该方法还可以包括以下各项中的一项或多项:
[0038]-识别包围已离散化的建模对象的所述一个或多个连续集合进一步包括:
[0039]
·
确定一个或多个确定的连续集合是否被一个或多个其他确定的连续集合包围;
[0040]
·
如果一个或多个确定的连续集合被一个或多个其他确定的连续集合包围,则通过将确定的单元的连续集合添加到单元的第四集合中来去除第三集合的单元的包围的连续集合的单元;
[0041]-缩减单元的第一集合还包括,对于每个添加的n-1层:
[0042]
·
识别所述第四集合中的作为第一集合的单元的邻域的单元;
[0043]
·
将作为第四集合中的已识别的单元的邻域的第一集合中的单元添加到第四集合单元;
[0044]
·
对于第一集合中的没有作为第四集合中的已识别的单元的邻域或没有作为第三集合中的已识别的单元的邻域的每个单元:
[0045]
о确定包围单元的单元,从而形成单元的邻域;
[0046]
о如果单元的邻域中的任何单元与第三集合或第二集合的单元相交,则将该单元添加到集合的第三单元中;或者
[0047]
о如果单元的邻域中没有单元与第三集合或第二集合的单元相交,则将该单元添加到单元的第四集合;
[0048]-确定包围所述单元的单元包括:
[0049]
·
从第一集合的单元开始追踪多条射线;
[0050]
·
识别与射线相交的所述添加的n-1层的单元;
[0051]
·
利用与射线相交的已识别的单元形成单元的邻域;
[0052]-以对于单元的第一集合的每次缩减而减小的长度来追踪射线,射线的初始长度是n个单元;
[0053]-在计算包络之前,通过以下方式执行包围所述已离散化的建模对象的所述第三集合的单元的薄化:
[0054]
·
识别第三集合中的仅将属于单元的第二集合或第三集合的单元作为邻域的单元;
[0055]
·
将已识别的单元添加到单元的第二集合中;
[0056]-在计算包络之前:
[0057]
·
通过以下方式穿透包围已离散化的建模对象的第三集合的单元的一个或多个连续集合:
[0058]
о识别第四集合中的作为第三集合的单元的邻域的单元;
[0059]
о将第四集合中的已识别的单元添加到单元的第三集合中;
[0060]-根据所述第三集合的单元计算所提供的建模对象的包络进一步包括:
[0061]
·
识别第三集合中的将单元的第二集合的单元作为邻域的单元;
[0062]
·
根据已识别的第三集合的单元计算提供的建模对象的包络;
[0063]-提供的建模对象是2d几何体,并且单元的栅格是2d栅格,其中邻域单元是x方向或y方向中任何一个上的坐标朝向的邻域;或者提供的建模对象是3d几何体,并且单元的栅
格是体素栅格,其中邻域单元是x方向、y方向或z方向中的任何一个上的坐标朝向的邻域;
[0064]-根据第三集合中的已识别的单元计算所提供的建模对象的包络进一步包括:
[0065]
·
如果提供的建模对象是由2d矢量图形表示的2d几何体,并且单元的栅格是2d栅格,则通过将单元转换为2d线集合来计算包络;或者
[0066]
·
如果提供的建模对象是由网格组成的3d几何体,并且单元的栅格是体素栅格,则通过将已识别的单元转换为四边形网格来计算包络;
[0067]-当所提供的建模对象是3d几何体时,通过将第三集合中的与第二集合单元相邻的每个单元的边转换成四边形网格来计算所提供的建模对象的包络;
[0068]
还提供了一种存储单元的栅格的数据结构,该数据结构将单元的栅格划分为大小相等的子栅格,每个子栅格包括方法的指向单元的第一集合、第二集合单元、第三集合单元和第四集合单元中的至少一个的指针。
[0069]
还提供了一种包括用于执行该方法的指令的计算机程序。
[0070]
还提供了一种其上记录有计算机程序的计算机可读存储介质。
[0071]
还提供了一种系统,该系统包括耦合到存储器和图形用户界面的处理器,该存储器上记录有计算机程序。
附图说明
[0072]
现在将通过非限制性示例并参考附图描述本发明的实施例,其中:
[0073]
·
图1示出了该方法的示例的流程图;
[0074]
·
图2示出了系统的图形用户界面的示例,在图形用户界面中可以显示包络;
[0075]
·
图3示出了系统的示例;
[0076]
·
图4至图8示出了该方法的示例实施流程图;
[0077]
·
图9至图14示出了确定2d建模对象中的包络的示例;
[0078]
·
图15至图32示出了确定2d建模对象中的包络的另一示例;
[0079]
·
图33至图35示出了代表车辆的3d建模对象的确定包络的示例;以及
[0080]
·
图36至图38示出了代表自行车的3d建模对象的确定包络的示例。
具体实施方式
[0081]
参考图1,提供了一种用于设计建模对象的包络的计算机实现的方法。该方法包括提供s10建模对象。建模对象被离散化为单元的栅格,从而获得栅格,该栅格包括与建模对象相交的单元的第一集合以及空单元的第二集合。该方法还包括添加s20与被离散化为单元的栅格的建模对象相邻的n层。n正整数,并且表示添加的层数。层数连续相加,因此存在p个值,为小于n的正整数排序,表示添加对应层,直到达到数n。例如,如果只添加一层,n=1,则p至少有p=1的值。对于p=1添加第一层,对于p=2添加第二层,对于p=3添加第三层,依此类推
……
并且对于p=n添加第n层。添加n层包括,依次对添加的前n-1层中的每一个添加层,执行识别第二集合中的作为第一集合的相交单元的邻域的空单元,将已识别的第二集合的单元添加到第一集合的单元的集合中。所述添加n层还包括,对于第n层,执行识别第二集合中的作为第一集合的相交单元的邻域的空单元,并将已识别的第二集合的空单元添加到单元的第三集合。第三集合的单元是一种新的单元类别,它定义了用于计算包络的单元
的栅格中的单元。
[0082]
该方法还包括计算s30第三集合的单元的一个或多个连续集合。该方法因此计算在单元的栅格中相邻(即,彼此紧挨)的第三集合的单元的集合。例如,可以在栅格中跨越所述连续集合中的一个追踪一条线或曲线,与所述组的所有单元相交,而在它们之间没有属于另一集合的任何单元。因此,此步骤可确保从单元的第三集合计算出的任何候选包络产生闭合的连接形状。
[0083]
该方法还包括识别s40包围已离散化的建模对象的一个或多个连续集合并且仅将所述已识别的一个或多个连续集合的单元保留在第三集合中。例如,可以在与第三集合的保留单元相交的栅格中追踪包围体,从而构建候选包络。
[0084]
该方法进一步包括缩减s50单元的第一集合。缩减包括对于每个添加的n-1层,执行识别第三集合中的作为第一集合的单元的邻域的单元,以及将具有已识别的第三集合的单元作为邻域的第一集合的单元添加到单元的第三集合中。因此,该方法将包围已离散化的建模对象的连续集合向添加的层扩展,产生候选包络。
[0085]
该方法还包括根据第三集合的单元计算s60所提供的建模对象的包络。
[0086]
该方法为设计建模对象的包络提供了改进的解决方案。包络是基于在单元的栅格中离散化的建模对象设计的,从而获得两个类别的单元:与建模对象相交的单元的第一集合和空单元的第二集合。建模对象的两个类别的单元允许识别包括物质的建模对象部分的空间分布。所提供的建模对象因此被简化,使得该方法的下一个操作可以对两个所述类别的单元集合执行。这样的操作可以服从于利用指向两个所述类别的指针的高度并行的实现方式,从而允许提高计算速度的有效实现方式。因此,计算包络的时间可以显著缩减,从而进一步改善终端用户的人体工程学。
[0087]
此外,该方法确定具有简化几何结构的输入模型的基于单元的包络,这对于例如交互式设计过程设计是优选的,同时保留设计意图。由于模型闭合了小间隙并且包络是根据包围间隙闭合的建模对象的候选单元包络计算得出的,设计意图得以保留。由于添加的层扩大了由栅格中第一集合的单元表示的建模对象的分布,间隙被闭合。这类似于建模对象的物质的加热过程。尺寸小于栅格中添加的n层的尺寸的建模对象的间隙被覆盖。换句话说,物质通过n层所述间隙自动且独立于单元的栅格的大小地添加到建模对象中。通过该方法添加的最后一层(第n层)是包括形成第三集合的单元的一个或多个连续集合的单元的层,从而从第三集合的单元的连续的集合定义一个或多个候选包络。一个或多个连续集合的识别允许识别建模对象的候选包络。接下来,由于物质已经在建模对象的所有方向上扩展,通过识别由添加物质组成的单元的邻域是候选包络的单元,通过缩减步骤去除添加的物质。如果是这种情况,则将添加物质的单元添加到第三集合单元中,从而将候选包络扩展到先前由添加物质占据的区域。这类似于通过缩减单元的第一集合来执行建模对象的冷却。因此,计算的包络显示了建模对象的主要几何特征,从而保留了设计意图,并且由于去除了间隙而具有简化的表示。
[0088]
该方法是计算机实现的。这意味着该方法的步骤(或基本上所有步骤)由至少一台计算机或任何类似系统执行。因此,该方法的步骤由计算机执行,可能是全自动的,或半自动的。在示例中,该方法的至少一些步骤的触发可以通过用户与计算机交互来执行。所需的用户与计算机交互的级别可能取决于可预见的自动化程度,并与实现用户愿望的需要保持
平衡。在示例中,该级别可以是用户定义的和/或预定义的。
[0089]
方法的计算机实现的典型示例是使用适用于此目的系统执行该方法。该系统包括耦合到存储器的处理器,并且可以包括图形用户界面(gui),该存储器上记录有计算机程序,该计算机程序包括用于执行该方法的指令。存储器还可以存储数据库。该存储器是适合于这种存储的任何硬件,可能包括几个物理上不同的部分(例如,一个用于程序,而可能一个用于数据库)。
[0090]
建模对象通常可以是3d建模对象或2d建模对象,例如代表一个产品,例如零件或零件组合,或者可能是产品组合。“3d建模对象”是指通过允许其3d表示的数据进行建模的任何对象。3d表示允许从3d空间中的所有角度查看零件。例如,3d建模对象,当以3d表示时,可以被处理并绕其任何轴线转动,或绕显示该表示的屏幕中的任何轴线转动。3d建模对象可以允许通过体素离散化到单元中,体素在体素栅格上定义。体素是可以通过与体素栅格中体素的位置相对应的三维坐标(例如,x-y-z坐标)来已识别的体积元素。体素可以包括3d建模对象的进一步信息,例如纹理或注释/设置信息。“二维建模对象”是指二维空间中对象的二维表示。这种2d表示可以由2d几何结构定义。这种2d几何结构可以由矩阵数据结构或颜色点表示,该矩阵数据结构通常表示像素的矩形栅格。2d几何结构也可以用矢量图来表示,矢量图定义为笛卡尔空间中的向量,即建模对象的点可以通过直线和曲线连接而形成建模对象的形状。
[0091]
表示产品的任何建模对象都可以具有定义相应建模对象在几何空间中的分布的拓扑结构。模型的拓扑结构的特征在于模型的间隙、孔和/或空腔的数量。
[0092]
建模对象是由存储例如在数据库中的数据定义的任何对象。通过扩展,表述“建模对象”指的是数据本身。根据系统的类型,建模对象可以由不同种类的数据定义。该系统实际上可以是cad系统、cae系统、cam系统、pdm系统和/或plm系统的任何组合。在那些不同的系统中,建模对象由相应的数据定义。因此可以说cad对象、plm对象、pdm对象、cae对象、cam对象、cad数据、plm数据、pdm数据、cam数据、cae数据。然而,这些系统并不是相互排斥的,因为建模对象可以由对应于这些系统的任意组合的数据来定义。因此,系统很可能既是cad系统又是plm系统,这将从下面提供的此类系统的定义中显而易见。
[0093]
cad系统还意味着至少适用于基于建模对象的图形表示设计建模对象的任何系统,例如catia。在这种情况下,定义建模对象的数据包括允许表示建模对象的数据。例如,cad系统可以使用边或线(在某些情况下使用面或表面)来提供cad建模对象的表示。线、边或表面可以以各种方式表示,例如非均匀有理b样条(nurbs)。具体而言,cad文件包含规范,从中可以生成几何结构,进而允许生成表示。建模对象的规范可以存储在单个cad文件或多个cad文件中。代表cad系统中建模对象的文件的典型大小在每个部件1兆字节的范围内。并且,建模对象通常可能是由数千个零件组成的组件。
[0094]
本文中的任何建模对象,包括通过该方法获得的任何包络,都可以表示要在现实世界中制造的产品的几何结构(3d或2d),例如(例如机械)零件或零件组件(或等效地零件的组件,因为从方法的角度来看,零件的组件可以被视为零件本身,或者该方法可以独立地应用于组件的每个部件),或更一般地任何刚体组件(例如移动机构)。因此,任何所述建模对象可以表示工业产品,其可以是任何机械零件,例如地面车辆(包括例如,汽车和轻型卡车设备、赛车、摩托车、卡车和机动车设备、卡车和公共汽车、火车)的一部分,飞行器(包括
机身设备、航空航天设备、推进设备、国防产品、航空设备、航天设备)的一部分,海军车辆(包括海军设备、商用船、海上设备、游艇和工作船、船舶设备)的一部分,通用机械零件(包括工业制造机械、重型移动机械或设备、安装设备、工业设备产品、金属制品、轮胎制品),机电或电子零件(包括消费类电子产品、安全和/或控制和/或仪器产品、计算和通信设备、半导体、医疗设备和装备),消费品(包括家具、家居和花园产品、休闲用品、时尚产品、硬商品零售商的产品、软商品零售商的产品),包装(包括食品和饮料和烟草、美容和个人护理、家用产品包装)。任何所述建模对象随后可以通过cad系统或软件解决方案整合到设计过程中。cad软件解决方案允许对各种以及无限工业领域的产品进行设计,包括:航空航天、建筑、建造、消费品、高科技设备、工业设备、运输、海洋和/或海上石油/天然气生产或运输。
[0095]
图2示出了系统的gui的示例,其中该系统是cad系统。
[0096]
gui 2100可以是典型的类似cad的界面,具有标准菜单栏2110、2120以及底部和侧边工具栏2140、2150。这样的菜单和工具栏包含一组用户可选择的图标,每个图标与如本领域已知的一种或多种操作或功能相关联。这些图标中的一些与软件工具相关联,适用于编辑和/或工作于gui 2100中显示的3d建模对象2000。软件工具可以分组到工作台中。每个工作台都包含软件工具的子集。特别地,其中一个工作台是编辑工作台,适用于编辑被建模产品2000的几何特征。在操作中,设计者可以例如预先选择对象2000的一部分,并且然后发起操作(例如改变尺寸、颜色等)或通过选择适当的图标来编辑几何约束。例如,典型的cad操作是对屏幕上显示的3d建模对象的冲压或折叠进行建模。gui可以例如显示与显示的产品2000相关的数据2500。在图中的示例中,显示为“特征树”的数据2500及其3d表示2000属于包括制动钳和制动盘的制动组件。gui可以进一步显示各种类型的图形工具2130、2070、2080,例如用于促进对象的3d定向、用于触发对编辑产品的操作的模拟或呈现所显示产品2000的各种属性。光标2060可以由触觉设备控制以允许用户与图形工具交互。
[0097]
图3示出了系统的示例,其中该系统是客户端计算机系统,例如用户的工作站。
[0098]
该示例的客户计算机包括连接至内部通信总线1000的中央处理单元(cpu)1010,也连接至总线的随机存取存储器(ram)1070。客户端计算机还被提供有图形处理单元(gpu)1110,其与连接到总线的视频随机存取存储器1100相关联。视频ram 1100在本领域中也称为帧缓冲器。大容量存储设备控制器1020管理对大容量存储设备(例如硬盘驱动器1030)的访问。适合于有形地体现计算机程序指令和数据的大容量存储设备包括所有形式的非易失性存储器,包括例如半导体存储器设备,例如eprom,eeprom和闪存设备;磁盘,例如内部硬盘和可移动磁盘;磁光盘;以及cd-rom盘1040。上述任何内容可以通过专门设计的asic(专用集成电路)进行补充或合并。网络适配器1050管理对网络1060的访问。客户端计算机还可以包括触觉设备1090,例如光标控制设备、键盘等。在客户端计算机中使用的光标控制设备允许用户将光标选择性地定位在显示器1080上的任何期望位置。此外,光标控制设备允许用户选择各种命令并输入控制信号。光标控制设备包括多个信号生成设备,用于将控制信号输入到系统。通常,光标控制设备可以是鼠标,该鼠标的按钮用于生成信号。替代地或附加地,客户端计算机系统可以包括敏感垫和/或敏感屏幕。
[0099]
该计算机程序可以包括可由计算机执行的指令,该指令包括用于使上述系统执行方法的单元。该程序可以记录在任何数据存储介质上,包括系统的存储器。该程序可以例如以数字电子电路或计算机硬件、固件、软件或它们的组合来实现。该程序可以被实现装置,
例如有形地体现在机器可读存储设备中以由可编程处理器执行的产品。方法步骤可以通过可编程处理器执行指令的程序以通过对输入数据进行操作并生成输出来执行该方法的功能来执行。因此,处理器可以是可编程的并且被耦合以从数据存储系统、至少一个输入设备和至少一个输出设备接收数据和指令,以及向数据存储系统、至少一个输入设备和至少一个输出设备发送数据和指令。如果需要,可以以高级过程或面向对象的编程语言或汇编或机器语言来实现应用程序。在任何情况下,该语言都可以是编译语言或解释语言。该程序可以是完整的安装程序或更新程序。在任何情况下,程序在系统上的应用都会导致执行本文中的方法的指令。
[0100]
回过头来参考图1,进一步讨论了用于设计建模对象的包络的计算机实现方法的示例的流程图。
[0101]
表述“建模对象的包络”是指包围建模对象的任何几何表示。更准确地说,包络是一种几何表示,它覆盖了模型对象的外部面,但不与建模对象相交。因此,在几何空间中,构成包络的元素(例如,网格的面、包围体的部分)属于建模对象几何表示的外边界的补充。因此,建模对象的包络具有与其相似的形状。换句话说,包络保持相似的特征,即表示在定义建模对象的几何空间内建模对象的形状的几何或拓扑特征。换句话说,包络保持建模对象的设计意图,从而丢弃建模对象的非必要结构元素。因此,“非必要”意味着建模对象的所述结构元素不包括在关于建模对象应该表示的真实世界对象的使用和目的设计者规范内。例如,包络可以是包围3d对象的外部体积的边界,从而丢弃所有不可见的几何体。在又一示例中,包络可以是包围2d几何体的外部区域的边界。这种边界的细节水平可能不同于3d对象(例如,较低分辨率)的边界的细节水平。
[0102]
提供s10建模对象,该对象被离散化为单元的栅格。建模对象的离散化可以在所述提供(即,提供离散化的建模对象)之前执行。可替代地,建模对象可以在它被提供给执行该方法的系统之后被离散化。提供建模对象意味着系统可以使用定义对象的数据。表述“离散为单元的栅格”与建模对象的域空间有关,该域空间被几何元素“切出”(或细分),几何元素可以是3d栅格的3d几何元素(例如多面体)或2d几何元素(例如多边形)。单元的栅格通常可以是在有限元分析、有限体积方法、有限差分方法中使用的栅格。栅格可以是规则的栅格,即栅格的所有单元都是全等的,具有相同的形状和大小。现在呈现本领域已知的单元的栅格的示例。应当理解,要求保护的方法不限于这些示例并且可以使用任何单元的栅格。单元的栅格可以是笛卡尔栅格,其中几何元素是单位正方形(2d几何元素)或单位立方体(3d几何元素)。单元的栅格可以是直线栅格,其中由矩形(2d几何元素)或长方体(也称为3d几何元素的直角平行六面体)细分。栅格可以是具有平行四边形(2d几何元素)或平行六面体(3d几何元素)细分的倾斜栅格。栅格可以是曲线栅格,其类似于规则栅格,其中单元是四边形(2d几何元素)或立方体(3d几何元素)。栅格的每个单元因此包括由栅格定界的面。可以在栅格上确定离散坐标系,其中栅格的每个单元由沿栅格维度的离散坐标标识。如果一个单元的坐标(沿栅格的维度)中的至少一个是另一个单元坐标的后继或前导,则两个单元是邻域。两个直接邻域是其中一个单元的坐标中只有一个是另一单元坐标值的后继或前导的那些邻域。换句话说,在包含由单元大小分隔的离散值的离散坐标系中,给定单元的直接邻域是与给定单元的距离坐标仅相差单元大小的单元。可以根据坐标系定义单元周围的邻域。可以根据栅格的任何坐标中的大小值来设置邻域大小。因此,单元周围的邻域可以由具有
如下坐标值的所有单元确定,所述坐标值与所述坐标的坐标朝向差小于邻域大小。
[0103]
单元的栅格的分辨率定义了离散化的细节级别。单元的栅格的分辨率是规则栅格的单元的大小。例如,可以忽略小于栅格分辨率的模型间隙。栅格的分辨率可由用户定义,从而控制离散化的细节水平。栅格的分辨率可以自动定义,例如通过考虑建模对象的最小间隙的大小。
[0104]
单元的栅格的元素可以被分组为相同类别的栅格的单元的集合。仍然参考提供s10,单元的栅格包括与建模对象相交的单元的第一集合和空单元的第二集合。因此,获得的单元的栅格包括同一类别的栅格的单元的两个集合。单元的栅格可以包括一个或多个类别的单元。
[0105]“单元集合”可以是指示相同类别的栅格的单元的一个或多个集合的任何数据结构。因此,该方法对单元的第一集合、单元的第二集合或该方法描述的单元类别的任何其他集合执行集合操作。单元的集合可能为空,即没有单元属于该集合;单元的集合可以包括一个或多个单元。
[0106]
要添加到单元的集合中的栅格的单元在单元的栅格中进行标识,并且一旦它们被识别,就将它们添加到该单元的集合中。
[0107]
单元的第一集合的元素是与建模对象相交的单元,即栅格的体积与空间上的建模对象几何相交。例如,单元和建模对象之间的相交部分可以由建模对象的至少一个点和单元的面的至少一个点的相交部分组成。通过离散化获得的空单元的第二集合由属于单元的第一集合的补集(即,在集合论意义上)的栅格单元组成。因此,属于两个集合的并集的单元都是通过提供s10而获得的栅格的所有单元。
[0108]
一旦执行了提供,与建模对象相邻的n层单元被添加。如前所述,n是正整数,表示要添加的层数。执行两个子步骤。第一个涉及添加n-1层,而第二个涉及添加最后一层,即第n层。只有在添加了n-1层之后才执行对第n层的添加。
[0109]
添加n-1层(例如,对于p=1添加第一层,对于p=2添加第二层,对于p=3添加第三层,
……
)可以被视为迭代过程,其中通过对每一层执行以下操作依次添加层:
[0110]-识别第二集合中的作为与第一集合的相交单元的邻域的空单元;以及
[0111]-将已识别的第二集合的单元添加到第一集合的单元的集合中。
[0112]
已识别的邻域单元将被理解为栅格上的已识别的坐标朝向邻域。因此,该方法现在将离散对象的单元周围的空单元与第一集合的新单元相关联。随着该方法的连续执行,这相当于向建模对象添加物质。
[0113]
因此,在步骤s20中添加的n-1层覆盖了建模对象。值得注意的是,n-1层可以覆盖小尺寸建模对象的间隙,并且从而在保留用户设计意图的同时去除不必要的细节。实际上,如果“间隙尺寸”,即构成间隙的连续单元的数量小于n-1个添加层,则栅格中的n-1个添加层可融合存在于单元的栅格中的间隙(表示为空单元)。因此,层数决定了包络丢弃不必要细节的程度。在示例中,用户设置数字n,以便添加的层覆盖确定的间隙尺寸,因此通过覆盖尺寸小于间隙尺寸的间隙来降低建模对象的复杂性,间隙内的细节不必保留在由间隙尺寸设置的设计意图内。例如,用户可以通过设置n=("间隙尺寸"/2) 1来将数量n设置为取决于间隙尺寸来设置该方法如何闭合间隙。同样可以通过自动地确定间隙尺寸来设置数量n。此外,该方法保留了建模对象的非凸区域,这要归功于从离散化模型对象开始的连续添加。
[0114]
一旦添加了n-1层,则执行添加s20的第二个子步骤,即通过执行识别第二集合中的作为第一集合的相交单元的邻域的空单元来添加第n层(最后添加的层),并将第二集合的已识别的空单元添加到单元的第三集合中。因此,根据添加前几层的相同原理,通过识别栅格的空单元来添加第n层。然而,已识别的空单元现在被添加到不同于第一集合和第二集合的单元的第三集合中。通过执行以下操作来添加第n层:
[0115]-识别第二集合中的作为第一集合的相交单元的邻域的空单元;
[0116]-将已识别的第二集合的空单元添加到单元的第三集合中。
[0117]
该方法接下来执行计算s30第三集合的单元的一个或多个连续集合。“连续集合”是指包括栅格中的相邻单元的任何集合,即,单元的元素定义栅格中相邻单元的连续序列。
[0118]
该方法接下来识别s40包围已离散化的建模对象的一个或多个连续集合。“包围”是指构成连续集合的邻域单元的序列形成封闭的离散形状,该封闭的离散形状在其内部具有第一集合的单元;第一集合的单元包括与建模对象和通过步骤s20添加的物质相交的单元。闭合形状可以通过离散边界方法确定,验证第一集合的单元属于离散边界的内部。“保留”是指不形成包围已离散化的建模对象的连续集合的第三集合的单元从第三集合中去除。
[0119]
该方法接下来执行缩减s50单元的第一集合。在步骤s20中执行的层添加类似于向建模对象添加物质。类似的比喻是,到目前为止,该方法已经“加热”了建模对象,并且因此建模对象由于添加的物质层而“膨胀”。因此,通过对每个添加的n-1层执行以下操作,该方法的步骤s50类似于“冷却”离散建模对象:
[0120]-识别第三集合中的作为第一集合的单元的邻域的单元;
[0121]-将第一集合中作为第三集合中已识别的单元的邻域的单元添加到单元的第三集合中。
[0122]
因此,该方法连续地将构成添加物质的单元添加到包围已离散化的建模对象的一个或多个连续集合中,因为仅保留了构成所述一个或多个连续集合的单元。
[0123]
然后,该方法基于属于第三集合的栅格的剩余单元来计算s60建模对象的包络。通过构造,第三集合的单元包围了离散化的建模对象。值得注意的是,该方法获得不打开原始模型的间隙的包络,其中,该包络通过添加步骤s20的n-1层而被覆盖。因此,该方法计算去除小细节(即,添加的n-1层覆盖的间隙)同时仍保持设计意图的包络,即保持建模对象的使用和目的建模对象的主要几何和拓扑特征。因此,这种包络可以在用于审查步骤的设计过程期间或在用于审查或演示目的设计过程之后使用,其中由于包络的简化几何结构而提高了帧速率,因此该过程非常交互。实际上,由于覆盖模型中尺寸小于n的间隙的添加的层,因此包络渲染的细节比建模对象少,包括例如去除内部几何结构和较少的外部细节,从而改善设计过程对于用户的人体工程学。
[0124]
在示例中,识别s40包围已离散化的建模对象的一个或多个连续集合进一步包括确定一个或多个确定的连续集合是否被一个或多个其他确定的连续集合包围。因此,步骤s40确定构成每个连续集合的单元是否被其他连续集合的单元包围,即每个连续集合的单元属于另一个包围连续集合的离散边界的内部。因此,该方法可以识别未被任何其他连续集合包围的最外连续集合,即,找不到包围所述集合的第三集合的单元的其他离散形状。内部连续集合则是由最外连续集合包围的任何连续集合。最外连续集合因此可以定义候选包
络,用闭合形状包围建模对象。候选包络可用于提供平滑的包络,因为闭合形状具有闭合拓扑。
[0125]
在一个或多个连续集合被一个或多个其他连续集合包围的情况下,所包围的连续集合的单元从第三集合的单元中去除并且它们被添加到单元的第四集合中。因此,该方法可以识别在步骤s20中添加到建模对象的已经扩展到建模对象的内部的物质。该方法识别建模对象的内部几何结构和在步骤s20中可能从已经被n-1层覆盖的间隙中保留的内部几何结构。这是因为,通过构造,已添加到单元的第四集合中的连续集合必然位于表示已添加物质的单元和第二集合的空单元之间;并且所述连续集合也被最外连续集合包围。
[0126]
在示例中,属于在步骤s40中计算的单元的第四集合的连续集合的集合允许对建模对象进行细化冷却;因为冷却可以从识别内部几何结构的最外连续集合和内部连续集合设置。根据该示例,对于每个添加的n-1层,缩减s50单元的第一集合的步骤包括:
[0127]-识别第三集合中的作为第一集合的单元的邻域的单元;
[0128]-将作为第三集合中已识别的单元邻域的第一集合中的单元添加到单元的第三集合中;
[0129]
并进一步包括:
[0130]-识别第四集合中的作为第一集合的单元的邻域的单元;
[0131]-将作为第四集合中的已识别的单元的邻域的第一集合中的单元添加到单元的第四集合中;
[0132]
因此,该方法验证层中要缩减的每个单元的邻域。不满足此条件的第一集合中的任何其他单元必须仅被第一集合中的单元包围。针对这种情况,步骤s50进一步执行:
[0133]-对于不作为第四集合中已识别的单元或第三集合已识别的单元的邻域的第一集合中的每个单元:
[0134]
о确定包围该单元的单元,从而形成单元的邻域;
[0135]
о如果单元邻域中的任何单元与第三集合或第二集合的单元相交,则将该单元添加到单元的第三集合中;或者
[0136]
о如果单元的邻域中没有单元与第三集合或第二集合的单元相交,则将该单元添加到单元的第四集合中。
[0137]
因此,该方法定义了被添加的物质包围的第一集合的每个单元周围的邻域。可以通过确定具有如下坐标值的单元来设置单元周围的邻域,所述坐标值与所述坐标的坐标朝向差小于邻域大小。该方法因此使用定义的邻域通过验证邻域是否与第三集合或第四集合的单元相交来确定单元是否将被添加到第三集合或第四集合。因此,该方法相对于外部连续集合和内部连续集合缩减了层的第一集合。这允许计算相对于建模对象不太复杂的包络,但同时保持设计意图。实际上,通过相对于外部连续集合和内部连续集合缩减层的第一集合,该方法不会打开被添加的n-1层覆盖的间隙。因此,包络相对于建模对象的复杂性进一步降低,而包络保留了设计意图。因此,需要渲染的几何体更少,从而进一步改善了设计过程的人体工程学。
[0138]
在示例中,可以通过追踪从第一集合的单元开始的多条射线并识别与射线相交的添加层的单元来执行形成邻域。添加的层是由步骤s20添加的n层之一,包括第一集合的所述单元。从其追踪射线的单元属于所述添加的层。可以在任何方向上计算射线,但只有与射
线相交并属于发出射线的单元的层的单元才会被考虑用于形成邻域。换句话说,如果击中一个不属于n-1层的部分的单元,则追踪射线将停止;射线仅通过添加层的单元。“追踪”是指该方法计算建模对象的几何空间中一条线的一个或多个线表示的值;从空间中的一个点开始,该点与第一集合的单元相交并包括大小和方向。一个或多个线表示中的每一个可以在任何方向上被追踪,例如,多个独立方向,从起点开始并且具有任何尺寸。可以定义任意的起点,例如几何空间中对应于单元的中点的点等。该方法然后可以基于与射线相交的已识别的单元来形成单元的邻域。交点可以是验证坐标朝向,首先离散化射线,并且然后验证单元中与射线离散化相交的单元。接下来,该方法可以形成具有与射线相交的已识别单元的单元的邻域(或一部分)。值得注意的是,该方法可能不需要从点开始追踪每条可能的射线。实际上,如果任何不属于当前处理层的部分的单元被击中(即,与射线相交),则追踪可能会停止。然后,如果与射线相交的单元属于单元的第三集合或单元的第四集合,则该方法将该单元添加到单元的第三集合中。或者,如果不是这种情况,则将单元添加到单元的第四集合中。
[0139]
在示例中,形成该集合的邻域可以包括随着对每个添加的层执行缩减s50而自适应地改变邻域大小。例如,步骤s50可以最初设置大小为n的邻域大小l,并通过追踪所述大小的射线来形成单元的邻域。步骤s50可以从对应于p=n-1的层p处的邻域大小l=n开始。通过相应地缩减追踪射线的长度,例如,对于p=n-2,l=n-1,等等,该方法可以针对每个添加的层p=n-1、p=n-2等继续进行。可以实现可以改进邻域的自适应计算的其他类型的缩减。例如,该方法可以通过模拟退火而自适应地修改单元的邻域。
[0140]
在示例中,该方法还包括,在计算包络之前,对包围已离散化的建模对象的第三集合的单元进行薄化。薄化是通过以下方式执行的:识别仅将属于单元的第二集合或第三集合的单元作为领域的第三集合的单元;并将已识别的单元添加到单元的第二集合中。因此,该方法仅保留靠近空白空间的包络单元,即确保包络是仅由包围建模对象的最外单元组成的封套。因此,该方法避免了使多层包围已离散化的建模对象,从而缩减渲染建模对象时的计算负荷。因此,该方法可以产生可以更容易渲染的更详细的包络,从而进一步改进设计中的人体工程学。
[0141]
该方法可以进一步允许在缩减步骤s50之后和计算步骤s60之前,通过将候选包络推入被添加物质覆盖的内部空间来计算出候选包络的细节。在示例中,该方法通过穿透包围已离散化的建模对象的第三集合的单元的一个或多个连续集合来推送候选包络。这是通过以下操作执行的:
[0142]-识别第四集合中的作为第三集合的单元的邻域的单元的单元;以及
[0143]-将已识别的第四集合的单元添加到设置的单元的第三集合中。
[0144]
换言之,该方法首先识别覆盖间隙的候选包络的单元。实际上,由于缩减步骤s50,具有第三集合的相邻单元的第四集合的单元必然是位于被覆盖间隙内部的那些单元。接下来,该方法将包络推到被覆盖间隙的内部。因此,该方法输出更细化的包络,其显示了间隙的相对更多的细节,而不会丢失候选包络的单个闭合形状。
[0145]
该方法可以从第三集合的剩余单元计算所提供的建模对象的包络。该方法可以确保计算的包络不包含任何像差,例如包络与建模对象的不期望的交叉。在示例中,根据第三集合的单元计算提供的建模对象的包络进一步包括:识别具有单元的第二集合的邻域单元
的第三集合的单元,即空单元;并根据第三集合的已识别单元计算提供的建模对象的包络。因此,该方法保证包络不与第一集合的任何单元相交,从而保持建模对象的设计意图。
[0146]
该方法可以应用于计算2d建模对象或3d建模对象的包络。事实上,该方法可以应用于本领域已知的允许离散化为单元的栅格的任何方法。例如,所提供的建模对象可以是2d几何结构并且单元的栅格可以是2d栅格,其中邻域单元是x或y方向中的任何一个的坐标朝向的邻域。因此,该方法可以实施为涉及计算笛卡尔空间中的单元的栅格的坐标。在其他示例中,所提供的建模对象可以是3d几何结构并且单元的栅格可以是体素栅格,其中邻域单元是x、y或z方向中的任何一个的坐标朝向的邻域。因此,该方法可以通过在欧几里得空间中执行单元的栅格的邻域的计算来实现。
[0147]
该方法因此可以根据输入的建模对象输出包络。计算出的包络可以是由3d网格表示或2d空间中的包围周长组成的包裹。例如,如果提供的建模对象是由位图表示的2d几何结构,并且单元的栅格是2d栅格,则可以通过将单元转换为2d线的集合来计算包络。类似地,对于3d建模对象,如果提供的建模对象是由网格组成的3d几何体,并且单元的栅格是体素栅格,则可以通过将已识别的单元转换为四边形网格来计算包络。
[0148]
在示例中,当提供的建模对象是3d几何体时,可以通过将第三集合的与第二集合的单元相邻的每个单元的边转换成四边形网格来计算所提供的建模对象的包络。因此,该方法产生了单一的包络网格,它用类似球体的拓扑结构包裹输入3d几何体,覆盖模型中的间隙并正确捕获非凸区域。如果执行穿透步骤,则得到的包裹可能非常准确,因为包裹网格被推入被包络覆盖的间隙的内部。包络可用于通过烘焙建模对象的纹理来创建冒名顶替者几何结构。值得注意的是,该方法允许获得具有明确定义的纹理的冒名顶替者几何结构,因为可以创建包络以便对于冒名顶替者的纹理内容没有未定义的区域。
[0149]
现在讨论存储单元的栅格的数据结构的示例。单元的栅格表示已离散化的建模对象。该数据结构存储划分为大小相等的子栅格的单元的栅格。子栅格一起覆盖整个栅格:每个子栅格覆盖栅格的唯一部分并且不重叠。对于每个子栅格,该数据结构还包括一个或多个指向上文讨论的单元的第一集合、第二集合、第三集合和第四集合中的至少一个的指针。
[0150]
在示例中,单元的第一集合、第二集合、第三集合和第四集合可以被分成仅涉及相同子栅格的体素的若干集合。这缩减了用于寻址子栅格的存储器使用。为了说明这一点,对于子体积的每个维度(x,y,z)包括32个体素的子体积(3d栅格的子体积)导致3d栅格的每个子体积有总数为32768的体素。通过(x,y,z)坐标寻址整个体积可以使用三个32位整数(每个纵坐标一个)或一个64位整数作为序列化索引,即z*(宽度*长度) y*宽度 x。单元的第一集合、第二集合、第三集合和第四集合被拆分,因此子体积的指向列在子体积的相应单元集合中的单元的指针的编码不能超过给定大小。
[0151]
正如已经讨论过的,该方法在将单元分配给单元的集合之一时,依赖(或使用)邻域单元的状态。因此,单元的集合可以通过每个单元的(x,y,z)向量来引用单元;单元的(x,y,z)向量使用子体积的(x,y,z)维度来表示单元坐标。
[0152]
在示例中,对于栅格的每(x,y,z)维度,栅格被分成32个相同大小的子单元,这导致每个子体积有总数为32768的体素,类似于前一个示例。子栅格的单元的(x,y,z)位置可以编码为15位;15位足以让指针寻址整个子栅格。在示例中,15位编码可以如下使用:每个纵坐标保留5位,应当理解,子栅格的每个纵坐标具有包括在0至31之间的范围,也标注为
[0;31]。这允许使用单个16位整数来引用单元,而不是16位整数的三元组。从而,节省了更多的存储器。
[0153]
现在讨论用于子栅格的数据结构的实现的示例。在此示例中,子栅格是子体积的每个(x,y,z)维度的32个体素的子体积。声明struct为名为subvolume的存储器块定义了变量列表。列出了几个变量,并且可以使用指针访问。
[0154]
struct subvolume{
[0155]
int8_t*voxelstatesptr;//64位指针指向8192字节,用于32768个体素的非同构体素状态
[0156]
int8_t homegeneousstate;//一个字节用于子体积的同构状态
[0157]
};//=》每个子体积72字节
[0158]
int32_t volumedim[3];//每个x、y和z方向上的体素数
[0159]
std::vector《subvolume》semisparsevoxelgrid;
[0160]
对于同构子体积,数据结构有九个字节。同构子体积只有属于单元的同一集合的单元(体素)。因此,没有为体素分配存储器,因为它们都属于单元的同一集合。对于非同构的子体积,动态分配额外的8192个字节,其中每个字节对单元的同一集合的四个体素进行编码。非同构子体积具有属于单元的两个或更多个集合的单元(体素)。
[0161]
当在加热步骤中添加越来越多的层时,新的数据结构会显著提高存储器效率,因为之前稀疏填充的子体积将被填满,并且其中一些最终会变得同构——然后只需要9个字节。
[0162]
该数据结构的存储器效率至少比传统的稀疏体素表示高十倍。存储器效率最高的稀疏体素体积将是一个映射,其键为64位整数(x,y,z)向量,由63位编码,并且一个字节用于体素状态(即,一个字节用于标识一个体素所属的体素的四个集合中的一个),这导致每个占用的体素有9个字节。这意味着,1023个体素将需要与一个包含32768个体素状态的非同构子体积相同的存储器量。例如,并且现在参考图33所示的汽车包络,仅用于表示3.21亿几何体素,传统数据结构需要24gb存储器。此外,访问当特定体素状态时需要花费大量时间。使用映射意味着每次访问体素的状态时都搜索一个键。在最好的情况下,这会在恒定时间内发生,但随后会增加额外的存储器使用量(std::map的复杂度为o(log(n));std::unordered_map的复杂度为o(1),但需要更多存储器用于内部哈希表)。本发明的数据结构占用8192字节的289945个非同构子体积,用于大约2.2gb的存储器的几何体,并且每个体素状态的访问需要恒定时间(o(1))。
[0163]
上面讨论的例子的组合是参考图4-图8讨论的。应当理解,该组合不排除上文讨论的示例的其他组合。图4到图8与3d建模对象和3d栅格有关,但是可以在不对2d建模对象和2d栅格进行显著结构修改的情况下应用它们。
[0164]
图4示出了参考图1讨论的方法的步骤s10-s60。在下面的讨论中,术语状态将用于指栅格的单元所属的单元的集合。标识每个集合的四个状态是:
[0165]
·
state_matter用于标识单元的第一集合;
[0166]
·
state_void用于标识单元的第二集合;
[0167]
·
state_wrap用于标识单元的第三集合;
[0168]
·
state_interior用于标识单元的第四集合。
[0169]
参考图4,步骤s10包括单元的栅格的初始化s210和离散化步骤s220。由于此示例由3d建模对象组成,因此单元的栅格可以是体素栅格。在步骤s210中,用户首先定义单元的栅格,指定参数“cell-size”,该参数隐式定义完整建模对象的单元栅格尺寸。除了参数cell-size之外,用户还可以指定单元的栅格的尺寸。或者,用户可以只定义指定单元的栅格的尺寸,其中,“cell-size”参数会自动设置。在步骤s210,栅格中的所有单元都用state_void初始化:因此所有单元都是空的。
[0170]
在步骤220中,通过将与建模对象的几何结构相交的栅格的每个单元的状态设置为state_matter来已离散化的建模对象。
[0171]
作为s210和s220的结果,栅格的每个单元与在对应于单元的第二集合的state_void和对应于单元的第一集合的state_matter中选择的一个状态相关联。
[0172]
接下来,在步骤s20中将n层添加到建模对象。相邻层的连续添加模拟了加热过程,其中建模对象的物质由于其物质温度的增加而膨胀。连续添加从已离散化的建模对象的单元开始。在添加n层后,相邻层的连续添加停止。两个连续层相邻,n-p层的每个单元与层n-(p 1)的至少一个几何元素共享2d几何元素的公共边或3d几何元素的公共面。用户可以预先指定参数“gap-size”,确定应该被包络闭合的间隙的范围,因为添加的层数n被设置为n=(“gap-size”/2) 1。如果建模对象的间隙已被添加的层闭合,则该物质会“熔化”并且不会在缩减步骤中被拉开。
[0173]
仍然参考图4,步骤s20在模拟加热过程的建模对象附近添加s20 n层,包括:在步骤s230中依次添加n-1个相邻的物质层,然后在步骤s240中添加由包裹单元组成的第n层。在步骤s230中,通过向具有状态state_matter的每个单元添加单元的相应的相邻层(在x、y(或z)方向中的任一个上相邻)来将物质(即状态为state_matter的单元)添加到建模对象。x、y方向是2d栅格的方向;x、y和z方向是3d栅格的方向。步骤s230连续执行n-1次。
[0174]
图5进一步详述步骤s230。对于具有状态物质的每个单元,确定其每个邻域是否为空单元。如果否,则邻域单元的状态保持不变(即邻域保持其状态state_void)。如果是,则邻域单元的状态更改为状态state_matter。
[0175]
在执行s230 n-1次之后,步骤s240按照与步骤s240相同的原理添加第n层。对于具有state_matter的每个单元,确定其每个邻域是否为空单元。如果否,则邻域单元的状态保持不变(即邻域保持其状态state_matter)。如果是,则邻域单元的状态改变为状态state_wrap。具有状态state_wrap的单元是形成将包裹输入的3d几何体的未来包络的第一近似值的单元。由于物质已经扩展到建模对象的内部(实际上是任何方向),因此可能存在形成被其他形成的包络包围的包络的单元。
[0176]
为了解决这个问题,接下来执行步骤s30和s40。本质上,步骤s30首先确定候选包络,并且接下来的步骤s40去除被其他候选包络包围的任何候选包络,从而仅留下建模对象的外部包络。
[0177]
图4进一步详述步骤s30,确定s250具有状态state_wrap的连续单元的集合。步骤s30确定其元素是栅格中相邻单元的集合,即该集合的元素共享公共边(对于2栅格)或面(对于3d栅格)。连续单元的集合可以被认为是候选包络。由于物质已在所有方向上扩展,因此具有state_wrap状态的单元形成单元的一个或多个连续集合,包括被其他确定的连续集合包围的连续单元的集合。
[0178]
接下来,图4详述步骤s40。通过对具有状态state_wrap的连续单元的每个集合执行步骤s260,去除由连续单元的外部集合包围的连续单元的集合。步骤s260确定该集合是否被具有状态state_wrap的单元的其他连续集合包围。可以通过构建由连续集合的单元形成的多边形、并且然后在2d栅格上执行多边形边界检测,或类似地在3d栅格上构建多面体,或任何类似的方法来执行确定。如果确定该集合被其他连续集合包围,则将该集合的单元的状态设置为state_interior。
[0179]
由于步骤s40对具有状态state_wrap的连续单元的每个集合执行步骤s260,仅剩下连续单元的最外面的集合,从而形成候选包络。每个候选包络都是拓扑闭合的。
[0180]
接着,执行步骤s50,详述于图4。添加物质的n-1层的连续缩减模拟了冷却过程,其中先前扩展的建模对象现在收缩。步骤s50从n-1个添加层开始,并且对对应的要去除的i层执行步骤s270,i为正整数,从i=n-1开始并且依次递减(即i=n-2,i=n-3,依此类推)直到达到i=0。参考图4,步骤s50执行,对每个对应的待去除的第i层实施过程s270。过程s270详述于图6。缩减层270的过程是通过检查要去除的相应层中每个单元的邻域状态的来执行的。它首先检查要去除的相应层的每个单元的每个邻域单元(不属于当前层的一部分)。如果这样的邻域单元是state_wrap,则被处理单元的状态设置为state_wrap。如果这样的邻域单元是state_interior,则被处理单元的状态设置为state_interior。否则,单元必须被具有状态state_matter的单元或要去除的相应层的单元包围。在这种情况下,从被处理单元开始向所有方向发射射线。如果击中了不是要去除的相应层的一部分的单元,则射线的追踪将停止。如果任何射线击中(即相交)具有state_void或state_wrap的单元,则将被处理单元设置为state_wrap。否则,它被设置为state_interior。该测试对于不打开在加热步骤中熔化的间隙是必要的。
[0181]
在缩减步骤结束时,可能存在具有state_wrap的单元的多层,包括在步骤s40中确定的连续集合中最外面集合的单元。图4描述了在步骤s50之后且在步骤s60的包络计算之前执行的穿透过程,接着是薄化过程,其允许在计算包络之前使包络薄化并计算出一些细节。下面描述该过程。
[0182]
参考图4,在步骤s270之后获得参数p,称为“穿透深度”。参数p必须是正整数。数量p设置要执行的迭代次数。步骤s280因此被执行p次,并且可以以索引i进行迭代,从0开始并且依次增加(即,i=0、i=1、i=2,等等)直到达到p之前的正整数。步骤s280由穿透过程和随后的薄化过程组成,其描述于图7和图8。穿透过程是可选的,并且薄化过程可以独立实施。然而,在这个示例中,过程s280首先执行穿透过程,然后是步骤s281的薄化过程。
[0183]
在图7中描述了步骤s280的穿透过程。步骤s280本质上通过参数p将具有状态state_wrap的单元“推入”到由具有状态state_interior的单元组成的“内部空间”,因此,步骤s280允许计算出候选包络的一些细节。参考图7,步骤s280验证具有状态state_wrap的每个单元的每个邻域单元。如果邻域单元的状态为state_interior,则邻域单元设置为state_wrap。否则,邻域单元的状态不变。接着,执行步骤s281。
[0184]
现在在图8中描述步骤s281的薄化过程。薄化过程实质上丢弃了双层(或多层)状态为state_wrap的单元。对于状态为state_wrap的单元层中的每个单元,它执行验证单元是否只有状态state_wrap或state_void的邻域,并且如果是这种情况,则将单元的状态添加到state_void,否则保持状态不变。
[0185]
接着,执行步骤s60。图4通过执行由过程s290描述的包络的提取来详述步骤s60。
[0186]
对于具有状态state_wrap的剩余单元中的每个,该方法执行验证单元的每一侧边(例如,2d栅格中单元的边,或3d栅格中体素的侧边)并验证邻域单元是否是具有状态state_void的单元。如果是这种情况,则将单元添加到要计算的最终包络中。这对具有状态state_wrap的所有剩余单元执行。这保证了包裹网格不与任何state_matter单元相交。然后步骤s60将添加的单元转换成包络,例如四边形网格。
[0187]
图9至图14示出了用于计算具有2d栅格的2d建模对象的包络的步骤,其中在包络的计算之前执行薄化。栅格已初始化为“gap-size”=1,添加的层数(加热步骤)n设置为2,并且因此缩减步骤的数量n-1=1。图9示出了步骤s10,在单元的栅格中离散化了初始2d模型。图9以黑色c90示出了第一集合的单元,而以白色c91示出了空单元的第二集合的单元的单元。图10-图11示出了根据步骤s20的两个添加层p=1和p=2。第一集合的单元的添加层以黑色显示,显示了从建模对象向各个方向添加的物质。因此,图10显示了添加的层p=1。图11显示了随后添加的层p=2。在p=2=n处添加的层的单元因此是第三集合的单元。图12示出了在步骤s30和s40中确定的连续集合,连续集合以深灰色c92示出。图13表示缩减步骤s50;深灰色单元说明了由步骤s50实现的“冷却”过程。图14显示在执行薄化步骤后,外部深灰度已被去除。图中未示出步骤s60。
[0188]
人们注意到包围已离散化的建模对象的一个或多个连续集合(具有state_wrap状态并以深灰色表示的单元)不包围任何其他连续集合。用图15至图32示出的下一个示例示出了一个或多个连续集合被一个或多个其他确定的连续集合包围的情况。
[0189]
此外,图15至图32的示例说明了通过包括穿透步骤来计算包络,并且其中在执行穿透过程之前,缩减步骤s50的每次迭代之后是薄化过程。在此示例中,栅格已初始化为gap-size=2,加热步骤数为n=5,退火步骤数为n-1=4,并且穿透参数p=2。该示例使用相同的颜色黑色c90、白色c91、深灰色c92,用于指示与前一个示例中单元的不同的集合。此外,内部单元(即单元的第四集合的单元)以浅灰色c93标识。图15示出了步骤s10,初始模型在体素栅格中被离散化。图16-图20示出了通过步骤s20连续添加黑色单元(添加物质)的层。图21以深灰色示出了通过步骤s30确定的单元的第三集合的连续集合的集合。图22显示了包围建模对象的连续单元的已识别的集合,将外部连续集合保持为深灰色,并以浅灰色添加包围的连续集合。图23-图30示出了缩减s50的每个步骤,其中缩减步骤s50的每次迭代之后是薄化过程。图23显示了缩减的第一次迭代,显示了物质如何被一层冷却。因此存在双层的深灰色单元。图24示出了在缩减步骤s50的第一次迭代之后应用的薄化过程,其中最外层的单元已经被设置为空单元。这是由于薄化识别仅具有属于单元的第二集合或第三集合(即,空单元或其他深灰色单元)的集合作为邻域的深灰色单元(第三集合的单元)。最外层的单元正是满足这个条件的单元。对图25-图30重复相同的过程。图29进一步示出了在模型中执行射线发射的缩减步骤。在右下方,缩减留下了模型的内部单元。此外,在图30中薄化后,左模型右上角存在的间隙没有打开。图31和图32示出了穿透过程的穿透步骤q=1和q=2,给定穿透参数p=2。两幅图都显示出深灰色层向间隙的内部空间推进。值得注意的是,得到的包络相对更详细,同时保持了球形拓扑。
[0190]
图33-图35示出了根据该方法计算的车辆模型的包络的示例。在本示例中,该方法使用体素尺寸为6mm的体素栅格。图33显示了得到的包络。包络由大约110万个体素组成,不
包括电机的内部几何结构等。改变体素大小会改变模型的分辨率以及存储需求。对于离散化模型,0.5mm的体素大小产生超过1500亿个体素,并且得到的包络(此处未显示)由大约45亿个体素组成。0.33mm的体素大小需要大约6000亿个体素的体积并得到包含160亿个体素的包络。值得注意的是,该方法和数据结构允许在当前的商用计算机中实现该方法。基于0.33mm体素大小的栅格的包络是在64gb ram的计算机上计算得到的;而基于0.5mm体素大小的栅格计算的包络是使用32gb ram的膝上型计算机计算的。
[0191]
与实现中使用的数据结构相比,传统结构需要大约24gb的存储器来存储离散化车辆的3.21亿个几何体素。这是当访问特定体素状态所花费的时间之外的时间。访问特定体素状态和/或在体素状态中执行操作所花费的时间可能需要重要的计算资源。实际上,像使用映射(例如,std::map)这样的操作意味着每次访问体素的状态时都必须搜索一个键。在最好的情况下,这会在恒定时间内发生,但会增加额外的存储器使用量。例如,操作std::map的复杂度为o(log(n)),而操作std::unordered_map的复杂度为o(1),但需要更多存储器用于内部哈希表。相比之下,所提供的数据结构占用了8192字节的289945个非同构子体积,用于存储器约为2.2gb的几何体;要访问每个体素状态,需要恒定的时间(o(1))。因此,数据存储需求显著缩减,并且访问时间显著改进。
[0192]
通过设置间隙尺寸使得方法的步骤s20中的添加层闭合访问电机几何结构的间隙,该方法已经丢弃了不可见几何结构,例如电机的几何结构。图34显示了根据设置的间隙尺寸被包络闭合的间隙的比较。在左侧,r340中指示的大开口已通过选择大的间隙尺寸而被包络闭合。相比之下,在右侧,已选择参数以仅闭合小间隙,因此包络穿过开口r341和包络以及电机的几何结构(未显示)。图35示出了图33的包络的缩放区域。它说明了包络如何尊重非凸区域的细节,如镜子及其手柄。
[0193]
图36-图38显示了从自行车的3d模型计算的包络的示例。图36左侧显示原始模型,而右侧显示包络。右侧的原始模型由大约130万个三角形组成,而计算的包络是由大约32,000个三角形组成的单个网格。图36进一步显示了该方法计算的包络如何尊重自行车的设计意图,同时提供足够准确的简化模型。实际上,该模型可以被认为是包含多个需要尊重的孔的对象的极端示例;这些孔由形成轮子的射线设置的空白空间组成。左侧的包络是单个包络,单个包络单独包裹自行车的车轮的每条射线。图37显示了两个模型的车轮的缩放区域,并显示了车轮的每条射线如何在包络的网格中表示。图38显示了从包络生成的冒名顶替者几何体;已应用原始模型的纹理。值得注意的是,虽然冒名顶替者几何体是比原始模型更粗糙的几何体,但应用的纹理覆盖了自行车的各个射线,没有任何纹理畸变。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献