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

Con*_*der 8 c++ algorithm optimization raytracing mesh

在过去的几周里,我一直致力于一种算法,该算法可以找到复杂网格的隐藏曲面并将其移除.这些隐藏的表面完全被遮挡,永远不会被看到.由于我正在使用的网格的性质,有大量这些隐藏的三角形.在某些情况下,隐藏表面比可见表面更多.由于手动删除它们对于较大的网格来说是禁止的,我希望用软件自动执行此操作.

我目前的算法包括:

  1. 在三角形的表面上生成多个点.
  2. 对于每个点,生成与三角形法线对齐的半球采样器.
  3. 将光线投射到半球中.
  4. 如果未被遮挡的光线少于一定数量,我将三角形标记为删除.

但是,这种算法引起了很多悲痛.这是非常不一致的.虽然算法没有发现一些"遮挡"的面部被遮挡,但我更担心由于当前实现的问题而被移除的非常明显的面部.因此,我想知道两件事,主要是:

  1. 有没有比光线追踪更好的方法来查找和删除这些隐藏的表面?
  2. 我应该调查非随机光线生成吗?我目前正在余弦加权半球中生成随机方向,这可能会导致问题.我没有调查过的唯一原因是因为我还没有找到一种算法来在半球中生成均匀间隔的光线.

注意:这是一个对象空间算法.也就是说,可以从任何角度看 - 而不是固定的相机.

Sti*_*org 2

实际上我从未实现过光线追踪,但无论如何我有一些建议。由于您的目标是检测每个隐藏的三角形,因此您可以扭转问题并找到每个可见的三角形。

我正在考虑以下任一方面的事情:

  1. 从外部向中心/垂直于表面进行光线追踪,将任何三角形击中标记为可见。
  2. 剔除所有其他人。

或者

  1. 选择模型的视图。
  2. 栅格化模型(例如,为每个三角形使用不同的颜色)。
  3. 将任何可见的三角形标记为可见。
  4. 改变方向并重复。
  5. 剔除所有不可见的三角形。

最后一种方法的优点是,如果您可以可靠地读取/写入像素,那么使用图形 API 实现它应该相对便宜。

两者的缺点是所需的分辨率。小开口内不应该被剔除的三角形可能仍然会被剔除,因此光线的数量可能会令人望而却步(在第一个算法中),或者您将需要非常大的屏幕外帧缓冲区(在第二个算法中)。