我正在寻找一种算法,给定两个网格可以使用另一个网格剪辑 最简单的形式是使用平面剪切网格。我已经通过遵循类似于here所述的内容实现了这一点 它的作用基本上是检查相对于平面的所有网格顶点和三角形(给出平面的法线和点)。如果三角形完全在平面上方,则保持不变。如果它完全落在飞机下方,它就会被丢弃。如果三角形的某些边与平面相交,则计算与平面的交点,并将其添加为新顶点。最后,为切割网格的位置上的孔生成一个盖子。
问题在于算法假设平面是无限的,因此剪切了其路径中的任何内容。在最简单的形式中,我需要对此进行扩展而不假设“无限”的平面。大小
为了澄清,想象一下,我们有一个带有2个盒子的桌子的3D模型。盒子相邻(但不接触或堆叠)。用户将在第一个框下方定义有限宽度和高度的切割平面并执行切割。我们最终得到一个桌面模型(网格),上面有一个盒子和另一个可以自由移动/操纵的盒子(网格)。
在一般形式中,我希望用户能够为他/她想要从桌面模型中分离的框定义边界框,并使用该边界框执行剪切。
如果我可以扩展算法,我已经使用了有限大小的平面的算法,那现在很好。
答案 0 :(得分:2)
您正在寻找的是具有任意网格的建设性实体几何/布尔算法。它比通过无限平面切割网格要复杂得多。
这一领域最早,最简单的研究,也是一个很好的起点,是Trumbore和Hughes的多面体物体的构造实体几何。
http://cs.brown.edu/~jfh/papers/Laidlaw-CSG-1986/main.htm
从原始论文:
更精细的解决方案通过各种数据结构扩展到这个主题。
操作的真正复杂性在于切片算法将一个三角形切割成另一个三角形。实施强大的CSG的噩梦在于数值精度。当你涉及比一个立方体复杂得多的物体时,它很容易遇到只是在一个顶点旁边做一个切片的情况(此时你很难决定合并新的分割顶点或者不是进行更多分裂),其中多边形是共面的(或几乎),等等。
所以我建议最初犯错误使用非常高精度的浮点数,甚至可能高于双精度,以专注于使某些东西正常且稳健地工作。您可以稍后进行优化(第一次传递应该使用加速器,如八叉树/ kd-tree / bvh),但是在第一次迭代中,您将避免这种方式的许多麻烦。
如果你专注于光线跟踪器而不是建模软件,例如渲染时,这在渲染时很容易实现。对于光线跟踪器,你需要做的就是做这种任意剪裁,假装用于从另一个中减去的对象在剔除过程中将其多边形翻转,例如,在光线水平上可以很容易地解决这个问题,但在几何级别上可以很难做到。
如果你负担得起,你可以做的另一件事就是让你的生活变得如此简单,就是对你的物体进行体素化,找到体素的减法/加法/联合,然后将体素转换回网格。如果你想要比行进多维数据集提供的结果更好的结果,那么这样做更容易变得更加容易,但是更难以有效地执行并且体素 - >多边形转换可以非常复杂。
这是一个非常艰难的领域,做得非常好,需要坚持不懈,因此存在这样的事情的原因:http://carve-csg.com/about。
答案 1 :(得分:0)
如果有人感兴趣,目前CGAL库中存在此问题的解决方案。它允许使用另一个网格作为边界体积剪切一个三角形网格。可以找到使用示例here。