在包含点的2D网格中查找多边形

时间:2010-09-03 03:05:35

标签: computational-geometry

我有一个3D多边形网格和一个相应的2D多边形网格(实际上来自UV map),我用它来将几何图形映射到2D平面上。给定飞机上的一个点,我怎样才能有效地找到它所在的多边形,以便将该2D点映射回3D?

我能想到的最好的方法是将多边形存储在2D间隔树中,并使用它来获取候选多边形。有更简单的方法吗?

澄清一下,这不适用于着色器。我实际上正在进行2D物理模拟并将其渲染为围绕3D网格。为了绘制每个对象,我需要弄清楚3D中的哪个点对应于其真实的2D位置。*

2 个答案:

答案 0 :(得分:0)

我在三角网格中看到的一种方法如下:选择一个三角形,并想象每个边都定义了一个半空间。对于给定边,半空间边界是包含边的线,半空间不包含三角形。选择相应半空间包含目标点的边。然后选择边缘另一侧的三角形,并重复该过程。

使用此方法,您最终会得到包含目标点的三角形。

这种方法比实现2D区间树更简单,尽管搜索效率较低(如果n是三角形的数量,则为O(√n)而不是O(log n)。 ,它应该适用于多边形网格,只要多边形是凸的。

答案 1 :(得分:0)

所以,如果我试图让事情得到实现,我可能会开始全局搜索所有三角形 - 计算每个三角形的2d点的重心坐标,找到重心坐标都是的三角形正面,然后使用那些映射到3d(将stu位置乘以3d点)。我会先做这个,只有当它不够快时我会尝试更复杂的东西。

如果可以通过三角形而不是2d点进行迭代,那么重心方法可能足够快。但似乎你在需要映射的任意位置上有一堆2d点,这些点会逐帧改变位置?

如果你遇到这种情况,你可以通过每帧实现本地更新来获得大幅提升。每个2d点会记住它所在的三角形。将其设置为当前三角形。测试新位置是否在当前三角形内。如果没有,那么您希望将网格移动到最接近目标2d点的相邻三角形。每个边缘相邻的三角形由边缘上的两个公共点和另一个点组成。找到哪个边缘相邻三角形的其他点最接近目标,并将其设置为当前。然后迭代 - 似乎应该很快找到它?你也可以为每个三角形缓存一个最大尺寸,所以如果这个点已经移动了很多,你可以迭代到下一个邻居而不进行重心计算(最大尺寸需要是距离,这样如果你比那个更远距离任何三角形点的距离都不可能在三角形内部。这是最大边缘的长度。)

但正如您在评论中提到的那样,您可能会遇到具有凹陷,孔或单独连接组件的网格问题,您可能会陷入局部最小值。有几种方法可以解决这个问题。我认为最简单的方法是保留所有访问过的三角形的列表(可能是三角形上的标记,矢量< bool>或设置<三角形索引>)并拒绝重新访问三角形。如果您发现您访问了当前三角形的所有邻居,那么请回到全局搜索。这种失败可能并不常见,因此不应过多损害你的表现。

这种每帧更新可以非常快,甚至可能是计算初始包含三角形的一种不错的方法 - 只需选择一个随机三角形并从那里走(从检查所有n个三角形到仅检查那些三角形的变化)与目标大致成直线)。如果它不够快,你可以做的是保留2d网格点的k-d树(或类似的东西)以及每个网格点的单个触摸三角形索引。要为迭代设定种子,找到k-d树中目标2d点的最近点,将相邻三角形设置为当前,然后迭代。