我已经准备好了一些网格对象,这意味着我在数组中拥有网格的所有顶点和三角形。我还有一个可以用键盘箭头移动的点,每当该点位于网格内部时,我想找到它的视点,即它可以看到的多面体的部分。
我想到了非常简单的 O(n^2) 算法,意思是:
对于混乱的每个三角形,我绘制一个由三角形的 3 个顶点和移动点组成的多面体。然后检查该多面体是否与任何其他三角形相交。如果没有,三角形将包含在结果中。如果是这样,我会进行一些计算来查看三角形的哪一部分是可见的。
显然,这非常慢。在 2D 中寻找更快的算法不是问题,但在这里我没有太多想法。
显然,必须有一种方法来避免检查与其他没有机会相交的三角形的相交。所以我想一定有一种方法可以对空间中的三角形进行排序?我应该如何处理整个问题?有没有像二维问题一样的线性算法?
编辑:我应该使用 kd 树三角形排序方法吗?
这是隐藏部件移除的问题。
为了应对 4π 立体角跨度,您可以投影到以查询点为中心的立方体的六个面。然后这变成了一个普通的隐藏人脸去除问题,有几种成熟的算法可用。 https://en.wikipedia.org/wiki/Hidden_surface_metry
这是一个相当广泛的主题,算法的选择取决于接下来的处理。
在您的特定情况下,使用空间变换 (x,y,z) => (x/z,y/z,1/z) (以观察点为中心)可能会很有用,这会转动中心投影到平行的。然后,通过围绕面的 AABB,您可以将问题简化为在矩形集合中查找重叠的问题。这可以通过扫描线方法等来解决。
很抱歉回复这么旧的帖子,但我想我有你们大学的相同项目,我有一个问题。怎样计算才能看出三角形的哪一部分是可见的?在 2D 中这很容易做到,但在 3D 中就变得更难了。