网格上的布尔运算


15

给每个网格一组顶点和三角形。有谁知道一种算法,或一个寻找的地方(我先尝试谷歌,但没有找到一个好的开始的地方)在所述网格上执行布尔运算,并为生成的网格获取一组顶点和三角形?特别令人感兴趣的是减法和联合。

图片示例:http : //www.rhino3d.com/4/help/Commands/Booleans.htm

Answers:


10

我认为这是构造固体几何(CSG)。希望您可以在这里找到一些帮助。

http://www.alsprogrammingresource.com/csg.html

http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html

http://www.nigels.com/cn/research/

还要在Google中搜索“构造实体几何”作为开始。

高温超导


+1-我要发布相同的链接,JustBoo-直到我注意到您击败了我!:)
jacmoe

谢谢!构造线性几何正是我所需要的!
lathomas64年

@jacmoe-具有讽刺意味的是,现在已经很完整了:-)您值得为其中的一些功劳。谢谢。
JustBoo 2010年

其中一些?:PI相信我把他们都记下来了。:D尽管如此,它们只是CSG的基本内容。从那里开始,它变得非常毛茸茸-甚至没有主要的商业建模软件包都正确。
jacmoe 2010年

3

我认为,只要我们考虑一下就可以解决。

显然,您将要创建两个几何相交的面(三角形)。然后剩下三个网格:刚隔离的相交点,几何1和几何2。

然后,只需删除不需要的内容即可!

  • BooleanDifference:删除孤立的零件和几何2。
  • BooleanIntersection:删除几何1和2,保留孤立的部分
  • BooleanUnion:合并几何1和2并删除孤立的零件(确保将几何1和2缝合到实体几何中)
  • BooleanSplit:分离几何1,几何2,并复制孤立的零件(将一个附加到几何1,将另一个附加到几何2)

我认为涵盖了,是吗?困难的部分显然是创建相交面。为此,迭代一个面的每个面,并检查该面是否为另一面的一部分;如果完全在内部,则将面复制为相交网格的一部分。如果部分在内部,则需要沿相交线分割三角形;我认为DirectX和OpenGL都具有辅助功能,或者只是一些3D平面数学(矢量)。我在微积分3中学习过这种东西(或者是2?),但是如果您不知道,也许可以在math.stackexchange.com上询问。然后,当然如果脸在外面,则什么也不做。遍历两个网格的所有面后,将剩下相交网格。


2

如果要处理多边形模型,则可能必须处理非流形几何,这意味着未定义“内部”和“外部”的问题。如果您不知道是0还是1,执行布尔运算是很棘手的。

您还必须处理边缘情况,例如共面多边形,与边相交的多边形,位于边和/或面上的顶点以及类似性质的东西。所有这些都不是不可能的,您只需要一种非常健壮的方式来表示网格数据,并严格定义在这些情况下的预期结果。


1

值得注意的是,您的大多数操作都可以通过取反和并集来表示,其中某些几何图形的取反就是法线翻转的那个几何图形。因此,如果您可以正确地合并,则其他操作应遵循以下步骤:

  • 相交(A,B):=!union(!A,!B)
  • 减去(A和B):=!union(!A,B)

桑德(Sander)有一些相当不错的博客文章,讨论了CSG实现:http : //sandervanrossen.blogspot.com/search/label/CSG


1
我本来要提到我自己的CSG资料,但显然其他人已经做了:O)
Sander van Rossen 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.