检测并移除网格的隐藏曲面

在过去的几周里,我一直在研究一种算法,它可以找到复杂网格的隐藏表面并将其移除。 这些隐藏的表面完全被遮挡,永远不会被看到。 由于我正在使用的网格的性质,这些隐藏的三角形有很多。 在某些情况下,隐藏表面比可见表面更多。 由于手动删除它们对于更大的网格来说是禁止的,我正在寻找使用软件自动化这一点。

我目前的算法包括:

  • 在三角形的表面生成几个点。
  • 对于每个点,生成一个与三角形的法线对齐的半球采样器。
  • 投射到半球。
  • 如果有一定数量的未被遮挡的光线,我会将三角形标记为删除。
  • 但是,这个算法造成了很多悲伤。 这是非常不一致的。 尽管某些“被遮挡”的脸部没有被算法遮挡,但我更担心由于当前实现的问题而被删除的非常明显的脸部。 因此,我想知道两件事情,主要是:

  • 有没有比光线追踪更好找到和去除这些隐藏表面的方法?
  • 我应该调查非随机射线的产生吗? 我目前在余弦加权半球中产生随机方向,这可能会导致问题。 我没有研究过这个问题的唯一原因是我还没有找到一种算法来在半球中产生均匀间隔的光线。
  • 注意:这是一个对象空间算法。 也就是说,从任何角度看 - 不是固定的相机。


    我从来没有实施光线追踪,但我有一些建议无论如何。 因为你的目标是检测每个隐藏的三角形,所以你可以绕过这个问题找到每个可见的三角形。

    我正在考虑以下任何一条:

  • 从外部向中心/垂直于表面扫描射线,将任何三角形标记为可见。
  • 剔除所有其他人。
  • 要么

  • 选择你的模型的视图。
  • 栅格化模型(例如,为每个三角形使用不同的颜色)。
  • 将任何三角形标记为可见。
  • 改变方向并重复。
  • 剔除所有不可见的三角形。
  • 最后一个的优点是,如果您可以可靠地读取/写入像素,则使用图形API实现应该相对便宜。

    两者的缺点将是所需的分辨率。 三角形内的小开口不应该被淘汰,因此射线的数量可能会过高(在第一种算法中),或者需要非常大的屏幕外帧缓冲区(在第二种算法中)。


    一些可能有用的想法。

  • 使用连接测试来确定连接到主模型的内容(如果有的话)。
  • 使用深度剥离的变体(我已经用它将壳体转换成体素;一旦你知道你想要保留的模型(体素)内部是什么,就可以与要删除的垃圾相交。
  • 根据连接组的复杂性创建连接图并修剪图。
  • 链接地址: http://www.djcxy.com/p/21893.html

    上一篇: Detect and Remove Hidden Surfaces of a Mesh

    下一篇: PHP "Remember Me" security flaw?