【发布时间】:2015-08-27 14:53:08
【问题描述】:
这是我需要的: 给定 3d 空间中的一个点 (x,y,z),以及由一些顶点 (x,y,z) 组成的网格,计算并返回该网格上的近点坐标。 函数大概是这样的:
bool closePointOnMesh(const Point& queryPoint, const Mesh& myMesh, float maxDistance);
我做了一些搜索,可能我会选择八叉树来减少计算。
但是还是有很多细节看不懂:
1:八叉树节点是如何细分的,所以每个节点包含的可能包含0~一些三角形?根据顶点进一步细分单元格并直接存储顶点更容易。
2:八叉树结构如何帮助减少计算,我知道如果单元格为空我将忽略它。但是我是否需要将八叉树单元格中每个三角形面内的所有最近点都获取到查询点,所以我最终得到了最接近的点?那声音依旧沉重。除此之外,如果我只是遍历所有三角形,从它们那里得到最近的点会更容易,这意味着不需要八叉树???
3:有没有一种快速的方法来获得最接近三角形面内点的点?
4:maxDistance 限制如何帮助减少计算?
【问题讨论】:
-
我认为使用二进制 BVH 会更容易,尤其是使用球形边界体积。遍历时总是先访问最近的球体,当你计算出你的第一个距离时,这个距离后面的所有球体都可以忽略。
-
感谢您的建议 :) 仍然想知道八叉树如何在这种情况下提供帮助,我的意思是最近点搜索。
-
@user1887450 如果你想使用八叉树或BVH找到closet点,你应该沿着树找到你的点所在的叶子节点。然后找到叶子中面的closet点节点和邻居叶节点,并选择最近的一个。在某些情况下,叶子节点和它的邻居都是空的,那么你必须检查邻居的邻居,这并不有趣。
-
所以我仍然根据网格顶点划分八叉树,当我搜索三角形面上最近的点时,我该怎么做,因为它只是顶点?对于这种情况,您认为哪种算法最有效?请,任何提示或链接甚至源示例将不胜感激。