繁体   English   中英

根据区域所包含的3D区域将曲面指定给区域

[英]Assigning surfaces to zones based on the 3D regions they enclose

给定三维空间中的一组曲面,我试图将每个曲面分配到一个区域,指向该组所包含的最小3D区域,如果不适用,则不分区。 我还想确定表面是否是两个区域之间的接口。 因此,例如,如果我们有11个表示两个立方体堆叠在一起的表面,则顶部立方体中的表面将位于相同的区域中,而底部的表面将位于不同的区域中(界面表面为在两个区域)。

作为一个例子,我想在一组表面如 ,并把它在给 这里的每种颜色代表一个区域,灰色没有区域关联(如在底部的翻盖中)。

我已经做了一些搜索,试图找出是否有人已经提出了一个算法来做到这一点,但我没有找到任何东西(大多数似乎识别区域而不是链接表面到他们所包围的区域)。 因此,我试图提出我自己的算法,并想知道是否有任何其他选择或我的方法是否有效。

我假设所有表面都已连接。

我的想法如下:

  1. 选择一个随机曲面,其边的每一个都与另一个曲面完全相同,然后将其添加到区域1。
  2. 将每个连接的表面添加到区域1,前提是其每个侧面都与另一个表面完全接触。
  3. 对于那些在其至少一侧接触多个表面的连接表面,将其添加到“可能”列表中。
  4. 对于区域1中的每个新曲面,重复步骤2-3。
  5. 将表面添加到“可能”列表两次后,将其添加到区域1并从“可能”列表中删除。 将此曲面标记为区域界面。
  6. 将区域接口添加到区域2。
  7. 从“可能”列表中选择一个随机曲面并将其指定给区域2并清除“可能”列表。
  8. 重复步骤2-7(更新当前的区域编号),直到没有未分配的曲面。

这似乎适用于简单的场景(例如,两个立方体堆叠在一起),但我不确定是否有任何棘手的条件我需要注意,或者如果有两个以上的区域它会崩溃分享一方。

对我的粗略算法/实施的替代想法的任何改进将不胜感激。 谢谢!

编辑:以下是一些回复一些评论的细节。 根据我的定义,区域只是一组完全绑定3D区域而没有间隙的表面。 因此,如果我有两个不接触的立方体A和B,我将有两个区域:一个由立方体A的所有表面组成,另一个由立方体B的所有表面组成。如果我有一个缺少的立方体一方面,没有与这些表面相关的区域。

我的最终目标是在我正在创建的建模工具中创建一个自动化流程来对表面进行分组。 细节被分类,但基本上我正在处理模型,其中某些属性仅在如上所述的相同“区域”中的表面之间是共同的。 我想创建一个自动化过程来创建这些区域,以便用户可以立即将这些属性应用于区域中的所有表面,而不是手动执行。

基本上问题归结为找到完全由任意一组表面包围的最小3D区域,并跟踪哪些表面属于哪些区域。 我希望这使我的问题更清楚。

那么,您感兴趣的是从一组输入多边形中发现闭合曲面(体积)网格拓扑; 换句话说 - 多面体。 这几乎适用于每个3D建模包。 我猜Blender有代码可以做到这一点。 有不同的方法,但通常使用某种版本的半边图。 请参阅此处的wiki链接: 双重链接半边图 想法是走你的输入政策,并建立这些图。 完成后,您可以轻松查询每个图形以查看是否存在孔(边缘缺失等)。

在此输入图像描述

我附上了一张图片,解释了如何使用半边结构来获得你想要的东西:假设给你一个五个长方形的汤(他们组成一个顶部的立方体。你处理你的第一个矩形说ABCD,这会创建你的第一个图形,比如说G1。现在你处理第二个多边形,比如FEHG,你还没有看过这些顶点,所以你创建第二个图形,G2。现在说你处理多边形CDGH。你之前看过这些顶点,所以不是创建一个新图,你合并(连接)共享这些节点的现有图。继续处理所有多边形。你得到图中的图形。

现在,查询图表以获取您的信息。 走完图形后,您将看到正好有四个缺少边的顶点(节点)。 这些顶点对应于框的缺失顶部(图中边缘为红色)。 因此,您知道此图不是封闭的流形。 如果你有另一个盒子,它没有与这个盒子共享节点,你会有另一个图表。 因此,处理完多边形后,每个图形都是一个“区域”。

请注意,如果您有两个相交的形状,您也可以使用这些图形来跟踪它们,但它更复杂。 基本上,当处理新的多边形时,您不仅需要查看其任何顶点是否属于已处理的图形,还要查看此多边形是否与先前处理的任何多边形相交,如果是,则拆分此多边形并将所有这些添加到相交图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM