我准备好了一些网格物体,这意味着我在阵列中拥有网格的所有顶点和三角形。我还有一个点,我可以用键盘箭头移动,每当点在网格中我想找到它的视点,这是它可以看到的多面体的一部分。
我想到了非常简单的O(n ^ 2)算法,意思是:
对于混乱的每个三角形,我绘制一个由三角形的3个顶点和移动点组成的多面体。然后检查此多面体是否与任何其他三角形相交。如果不是,则结果中包含三角形。如果是的话,我会按照一些计算来看看三角形的哪个部分是可见的。
显然,这很慢。在2D中找到更快的算法不是问题,但在这里我没有很多想法。
显然,必须有一种方法可以避免检查与其他没有交叉机会的三角形的交叉点。所以我想必须有一种方法来对空间中的三角形进行排序?我该如何处理整个问题?在2D问题中是否存在任何线性算法?
编辑:我应该使用kd-tree三角形排序方法吗?
答案 0 :(得分:1)
这是隐藏部件移除的问题。
要处理4π立体角跨度,您可以投影在以查询点为中心的立方体的六个面上。然后,这转向普通的隐藏面部移除问题,其中有几个成熟的算法可用。 https://en.wikipedia.org/wiki/Hidden_surface_determination
这是一个非常广泛的主题,算法的选择取决于将遵循的处理。
在您的特定情况下,使用空间变换(x,y,z)=>可能很有用。 (x / z,y / z,1 / z)(以观察点为中心),将中心投影转变为平行投影。然后通过AABB围绕构面,将问题减少到在矩形集合中找到重叠的问题。这可以通过扫描线方法来解决。