两个网格之间的布尔差异非常快

时间:2017-01-17 11:00:45

标签: algorithm 3d

让我们说我有一个静态物体和一个可以移动和旋转的可移动物体,快速计算这两个网格的差异的最佳方法是什么?

这里的精度不是那么重要,速度是,因为我必须在主循环的更新阶段使用它。

可能,鉴于严格的时间限制,直接修改静态对象的顶点和三角形是首选。这里应该优先考虑体素吗?

编辑:用例是木板(平行六面体)和铣削工具(旋转轮廓,有些像these)的交互式查看器。
铣削刀具可以旋转,并且可以以不同的角度(5轴)进行定向。

编辑2:铣刀可能不会刺穿木材。

编辑3:面板可以大到6000x2000mm,铣刀可以小到3x3mm。

1 个答案:

答案 0 :(得分:1)

如果您需要最佳性能,那么通用CSG方法对您来说可能太慢(但仍取决于网格和目标硬件)。

您可以尝试找到一些专门的算法,为您的特定网格编码。我们假设你有两个立方体 - 一个是墙壁'第二个是窗口' - 然后,使用自定义代码计算结果网格要比完整的CSG更容易/更快。不幸的是,你对网格没什么好说的。

您也可以尝试将其设为2D问题,使用一些简化的网格来计算看起来像预期的结果'。

如果网格的移动受到某种程度的限制,您可以预先计算在运行时使用的不同网格组合的完整或部分结果。

您可以使用一些空间分区(如BSP或八度)在预计算阶段划分网格。通过这种方式,您可以将一个大问题分解为许多较小的问题,这些问题可能更快计算或至少使解决方案成为多线程。

你已经说过体素了 - 如果你对它们的外观和限制很好,你可以将两个网格体素化,只需读取和混合两个体素值,而不是一个。然后,您将使用Marching Cubes等算法对其进行三角测量。

这些只是一些一般性的想法,但我们需要更好的信息来帮助你。

修改

根据您的描述,您似乎在为一些浅浮雕建模,因此您可以使用Relief Mapping来伪造此效果。它基于存储为纹理的height map,因此您只需更新纹理的几个像素并渲染平面即可。与其他方法相比,它应该非常快,缺点是它基于高度图,所以你不能得到Tee Slot或Dovetail切割器会产生的形状。

如果您想要真正的几何图形,那么我将从一个简单的平面开始作为您的面板(不需要完整的3D,只需要一个前表面)并将其与2D网格分开。网格元素应略大于钻头大小,并且每个元素都是单独的网格。在框架更新中,您可以剪切一个或最多4个用钻头触摸的元素。由于这个网格,所有切割操作都将使用非常简单的网格运行,因此它们可以按照您的预期速度运行。您还可以在单​​独的线程中剪切所有当前元素。切割完成后,您只会将当前修改的元素上传到GPU,这样您最终可能会得到相当复杂的网格,但每帧的修改很少。