Algorithm 在地形高度图中平整道路

Algorithm 在地形高度图中平整道路,algorithm,computational-geometry,terrain,3d-modelling,heightmap,Algorithm,Computational Geometry,Terrain,3d Modelling,Heightmap,假设我们有一个高度地图,以图像的形式表示地形高度,其中每个像素表示高度。假设同一图像上的另一层用于指示道路穿过地形的路径,因此亮像素表示道路上的某个点,暗像素表示道路外的某个点,中间像素表示道路边缘的位置。在这种情况下,这似乎是一种表示道路的自然方式,但我们也可以使用行进方块将其转换为道路的多边形轮廓 问题是:算法如何调整高度地图以保持道路两侧水平。通过平均道路上每个点的高程,很容易使道路完全水平,但实际道路并非如此。一条路应该能在山上跑上跑下,但不能向左或向右倾斜 必须有一些几何解决方案来找到

假设我们有一个高度地图,以图像的形式表示地形高度,其中每个像素表示高度。假设同一图像上的另一层用于指示道路穿过地形的路径,因此亮像素表示道路上的某个点,暗像素表示道路外的某个点,中间像素表示道路边缘的位置。在这种情况下,这似乎是一种表示道路的自然方式,但我们也可以使用行进方块将其转换为道路的多边形轮廓

问题是:算法如何调整高度地图以保持道路两侧水平。通过平均道路上每个点的高程,很容易使道路完全水平,但实际道路并非如此。一条路应该能在山上跑上跑下,但不能向左或向右倾斜


必须有一些几何解决方案来找到道路的角度和线性插值像素之间的高度。或者,有没有更复杂的解决方案,可以在实践中不费吹灰之力就取得好的效果?

您可以计算道路上每个点的水平法线以及沿这些法线的平均高度点。这将帮助您保持法线水平-这就是实际道路的行为

使用沿道路轴的像素高度,并在沿轴法线的高度贴图上设置此高度。这在技术上有点复杂。您可以做的是在微小的四边形中对道路进行网格划分,并使用恒定或双线性插值高度“填充”四边形


为了获得更好的真实感,您必须在上升侧稍微雕刻地形,在下降侧填充,以避免垂直墙并尊重路堤边坡。这可以通过使用额外的四边形(为其提供坡度)将网格延伸到道路外部来实现。

如果使用矢量数据(线)定义道路,则问题的解决方案会更清晰。正如Yves所写,用于填充道路的高度是道路中心线(轴)上的高度,值垂直于轴传播,用于两侧道路宽度的一半。计算起来也相当复杂。主要问题是轴线上的折弯(角度)。这是因为边和轴在弯曲处的长度不同,必须注意在这三条线上“平行”移动

光栅化问题可以通过寻找垂直于轴上某点的像素来解决。可以使用查找具有类似属性的像素集的方法。就像在路边拍摄一个像素,然后找到 到另一侧道路的最短像素路径生成(可能)垂直于轴的像素线。最短路径线上的像素可以使用相同的高度、中间像素值甚至平均值

使用这种方法,同样的弯曲问题也会发生,因为来自内部道路侧的像素可以在外部道路侧具有更多的最近像素。也许更多的平均值能帮上忙。我将使用这种方法从两侧的每个像素中找到最短路径。对于每条最短的线,找到要使用的高度值。这样,一个像素将出现在更多的最短线条上,它可以使用它所在的最短线条的平均值。如果某个像素没有被最短线覆盖,则使用相邻像素的平均值


我认为用于寻找最短路径(由道路像素构成)的图节点有8个邻域,边必须加权,其中水平/垂直边的权重为1,对角线边的权重为sqrt(2)。

每个点是否意味着每个像素的中心?穿过一个像素中心的法线不会很少穿过多个像素的中心吗?如果我们计算仅被法线接触的像素,那么许多像素将被许多法线接触,那么我们使用哪个法线来计算每个像素的平均值?如果像素被多个法线接触,也许可以尝试某种加权平均值。。。