Algorithm 如何将规则高度栅格转换为不规则三角形网络?

Algorithm 如何将规则高度栅格转换为不规则三角形网络?,algorithm,networking,3d,geometry,terrain,Algorithm,Networking,3d,Geometry,Terrain,我正在寻找一种算法,将规则的高度网格(例如1024x1024)转换为三角形的不规则网络。下面是一幅显示三角形不规则网络示例的图像: 我在互联网上寻找了一种算法来转换它,但我就是找不到。基本上,三角形密度取决于粗糙度和/或像素误差(光栅化时),或类似的东西。这里有一个两步算法的想法:首先基于粗糙网格进行Delaunay三角剖分,然后递归平滑三角形,直到满足某个误差标准 对于第一步,为Delaunay三角剖分确定一组顶点。这些顶点与像素坐标重合。高于或低于所有四个相邻像素的极值点应在集合中,边界上

我正在寻找一种算法,将规则的高度网格(例如1024x1024)转换为三角形的不规则网络。下面是一幅显示三角形不规则网络示例的图像:


我在互联网上寻找了一种算法来转换它,但我就是找不到。基本上,三角形密度取决于粗糙度和/或像素误差(光栅化时),或类似的东西。

这里有一个两步算法的想法:首先基于粗糙网格进行Delaunay三角剖分,然后递归平滑三角形,直到满足某个误差标准

对于第一步,为Delaunay三角剖分确定一组顶点。这些顶点与像素坐标重合。高于或低于所有四个相邻像素的极值点应在集合中,边界上的脊点也应如此,其中沿边界的相邻像素较低或较高。这将提供一个粗糙的三角形网格。还可以通过包含具有高曲率的像素来获得更精细的网格

在第二步中,遍历所有三角形。沿像素网格扫描三角形,并为三角形内的每个像素累积一个误差平方,同时确定最大和最小有符号误差点。如果每个像素的平均误差不符合标准,请将误差最低和最高的点添加到三角剖分中。验证新三角形,并根据需要重新进行三角形测量

注:

第一步中的粗三角剖分应该相当快。如果高度贴图参差不齐,则参差不齐区域中的顶点可能过多。在这种情况下,在应用该算法之前,可以使用高斯滤波器平滑hight贴图

递归重新三角剖分可能不是那么快,因为确定误差需要反复扫描三角形。(随着三角形大小的减小,过程应该会加快,但仍然如此。)在步骤1中查找顶点的一个好标准可能会加快步骤2

可以通过查找像素的边界框来扫描三角形。查找边界框左下点的重心坐标s、t,以及对应于像素在x和y方向上移动的重心增量(dsx、dtx)和(dsy、dty)。然后,您可以在包含的像素(x,y)上以两个循环扫描边界框,从增量向量计算重心坐标(s,t),如果您在三角形内部,即当s>0、t>0和s+t<1时,则累积误差


我还没有实现这个算法(这是一个有趣的任务),但我认为在速度和网格质量之间找到一个良好的平衡点是一个根据当前高度贴图裁剪错误标准和顶点选择的问题。

是否希望它与视图相关(有一些像素错误)还是静态网格?@kolenda:我认为OP需要一个反映高度贴图的网格,即参差不齐的区域应该有高密度的像素,平坦或均匀倾斜的区域应该有低密度。