Graphics 使用其他网格切割网格的算法

Graphics 使用其他网格切割网格的算法,graphics,3d,mesh,Graphics,3d,Mesh,我正在寻找一种算法,在给定两个网格的情况下,可以使用另一个网格剪裁一个网格。 最简单的形式是使用平面剪裁网格。我已经通过以下类似于所描述的内容实现了这一点。 它所做的基本上是相对于平面检查所有网格顶点和三角形(给出了平面的法线和点)。如果三角形完全在平面上方,则保持不变。如果它完全落在飞机下面,它将被丢弃。如果三角形的某些边与平面相交,则将计算与平面相交的点并将其添加为新顶点。最后,为网格切割位置上的孔生成一个封口 问题是,该算法假设平面是无限的,因此其路径中的任何内容都会被剪裁。在最简单的形式

我正在寻找一种算法,在给定两个网格的情况下,可以使用另一个网格剪裁一个网格。
最简单的形式是使用平面剪裁网格。我已经通过以下类似于所描述的内容实现了这一点。
它所做的基本上是相对于平面检查所有网格顶点和三角形(给出了平面的法线和点)。如果三角形完全在平面上方,则保持不变。如果它完全落在飞机下面,它将被丢弃。如果三角形的某些边与平面相交,则将计算与平面相交的点并将其添加为新顶点。最后,为网格切割位置上的孔生成一个封口

问题是,该算法假设平面是无限的,因此其路径中的任何内容都会被剪裁。在最简单的形式中,我需要一个扩展,而不需要假设一个“无限”大小的平面

为了澄清,假设我们有一个桌子的3D模型,上面有两个盒子。箱子相邻(但不接触或堆叠)。用户将在第一个框下方定义一个有限宽度和高度的切割平面,并执行切割。我们最终得到一个桌面模型(网格),上面有一个盒子,另一个盒子(网格)可以自由移动/操纵

在常规表单中,我希望用户能够为他/她想要从桌面模型中分离出来的框定义一个边界框,并使用该边界框执行剪切


如果我能将我已有的算法扩展到具有有限大小平面的算法,那现在就太好了。

你要找的是具有任意网格的构造性立体几何/布尔算法。它比用无限平面切片网格要复杂得多

这方面最早最简单的研究之一,也是一个很好的起点,是Trumbore和Hughes关于多面体物体的构造性立体几何

原稿:

更详细的解决方案通过各种数据结构扩展到这个主题上

操作的真正复杂性在于将一个三角形与另一个三角形进行切片的切片算法。实现鲁棒CSG的噩梦在于数值精度。当涉及比立方体复杂得多的对象时,很容易遇到这样的情况,即切片仅在顶点附近生成(此时,在执行更多拆分之前,您很难决定是否合并新拆分顶点),多边形共面(或几乎共面),等等

因此,我建议在开始时使用非常高精度的浮点数,甚至可能比双精度更高的浮点数,以便将重点放在正确和可靠地工作上。您可以稍后进行优化(第一步应该是使用诸如八叉树/kd树/bvh之类的加速器),但这样在第一次迭代中可以避免许多麻烦

如果您关注的是光线跟踪器而不是建模软件(例如,使用光线跟踪器),则在渲染时实现这一点要简单得多。要进行这种任意剪裁,只需假设用于从另一个对象中减去的对象在消隐过程中翻转了其多边形,例如,在光线级别上稳健地求解很容易,但在几何级别上稳健地求解要困难得多

如果你负担得起的话,你可以做的另一件事是对你的对象进行体素化,找到体素的减法/加法/并集,然后将体素转换回网格。这是如此容易使稳健,但更难有效地做,体素->多边形转换可以得到相当多的参与,如果你想要更好的结果比游行立方体提供


这是一个非常难做好的领域,需要坚持不懈,因此存在这样的事情的原因是:。

如果有人感兴趣,目前CGAL库中有一个解决这个问题的方法。它允许使用另一个网格作为边界体积剪裁一个三角形网格。可以找到使用示例。

首先,感谢您的回复。事实上,在我问了这个问题之后,我采用了CSG方法(由于截止日期),并且部分得到了我所需要的。尽管如此,我仍然看到大量的网格切割纸在处理这个问题,但是,大多数都缺乏实现。是的,这些几何算法通常都是这样。其中很多都是沉浸在研究中,论文往往来自理论或数学方面。而实现这些算法的少数人通常是以专有的方式实现的。因此,通常很难获得一个好的实现。在我看来,CSG是有史以来最令人不快的实现之一,如果您希望实现商业级的健壮性。努力/回报比率非常低,将其提升到商业水平的健壮性通常会让你沉浸在不精确的IEEE精度错误的细节中。是的,我同意!事实上,我正在为Carve CSG编写一个简单的C#包装,因为我正在键入此评论。它旨在对WPF网格执行CSG。我知道已经有一段时间了,但是代码在这里已经有一段时间了:为了补充这个答案,我经常使用CGAL,在我问了这个问题之后,我试用了CGAL的模块。它工作得很好,但速度非常慢。