【发布时间】:2014-09-20 04:38:18
【问题描述】:
在过去的几周里,我一直在研究一种算法,该算法可以找到复杂网格的隐藏表面并将其移除。这些隐藏的表面被完全遮挡,永远不会被看到。由于我正在使用的网格的性质,有很多这些隐藏的三角形。在某些情况下,隐藏的表面比可见的表面多。由于手动删除它们对于较大的网格来说是禁止的,我希望用软件来自动化它。
我目前的算法包括:
- 在三角形曲面上生成多个点。
- 对于每个点,生成一个与三角形法线对齐的半球采样器。
- 将光线投射到半球。
- 如果未被遮挡的光线少于一定数量,我将三角形标记为删除。
但是,这种算法引起了很多麻烦。这是非常不一致的。虽然算法没有发现一些“被遮挡”的面孔被算法遮挡,但我更担心由于当前实现的问题而被移除的非常明显的面孔。因此,我想知道两件事,主要是:
- 有没有比光线追踪更好的方法来查找和移除这些隐藏的表面?
- 我应该调查非随机射线生成吗?我目前正在余弦加权半球中生成随机方向,这可能会导致问题。我没有对此进行研究的唯一原因是因为我还没有找到一种算法来在半球中生成均匀分布的光线。
注意:这是一种对象空间算法。也就是说,从任何角度都能看到——不是固定的摄像头。
【问题讨论】:
-
关于你的最后一个问题,请参阅mathworld.wolfram.com/SpherePointPicking.html 以在半球中生成均匀间隔的光线
-
这称为“背面剔除”,可能有助于搜索。至于检测一个可剔除的面,为什么不将每个顶点的光线投射到您的相机上,然后如果来自三角形的所有三条光线都与另一个面相交,则该三角形被完全遮挡并且可以从网格中移除。需要注意的是,OpenGL等图形库可以在渲染阶段为你做到这一点
-
@DrewMcGowen 感谢您的链接。我已经看过了。主要问题是,由于算法的计算强度很高,我希望将光线保持在最低限度(一些网格已经需要 1000 亿条光线,每个半球有 512 条光线)。与任何随机事物一样,总是存在点“簇”。我一直在寻找能够产生完美均匀分布光线的东西。最终,我可能会在头文件或其他文件中分解并硬编码均匀间隔光线的方向。
-
@Bojangles 仅仅因为从三角形的每个顶点到相机的光线被遮挡并不意味着整个三角形都被遮挡
-
我知道您正在寻找对象空间算法,但是我不明白如何隐藏某些东西?当一个表面被隐藏时,还必须有一个观察点,从该观察点隐藏该表面。如果将相机放置在离表面足够近的位置,则任何表面都应该可见。或者您的表面是否封闭并且您想要完全移除其他表面内的表面?也许你可以澄清你对隐藏的定义?
标签: c++ algorithm optimization mesh raytracing