【问题标题】:Leveling a road in a terrain height map在地形高度图中平整道路
【发布时间】:2017-09-22 19:57:01
【问题描述】:

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

问题是:算法如何调整高度图以保持道路左右水平。通过平均道路上每个点的高度可以很容易地使道路完全水平,但这不是真正的道路的工作方式。道路应该可以上下山,但不能左右倾斜。

必须有一些几何解决方案来确定道路的角度并线性插值像素之间的高度。还是有一些更棘手的解决方案,可以在实践中产生良好的效果,而无需付出这么多的努力?

【问题讨论】:

    标签: algorithm computational-geometry terrain 3d-modelling heightmap


    【解决方案1】:

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

    可以通过找到垂直于轴上某个点的像素来解决光栅化问题。可以使用找到具有相似属性的像素集的方法。就像取一个路边像素并找到 到其他路边的最短像素路径会产生(可能)垂直于轴的像素线。最短路径线上的像素可以使用相同的高度、中间像素的值甚至平均值。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • “每个点”是指每个像素的中心吗?通过一个像素中心的法线不会很少通过超过一个像素的中心吗?如果我们计算仅仅被法线接触的像素,那么许多像素会被许多法线接触,那么我们使用哪个法线来计算每个像素的平均值?
      • 如果像素被多个法线接触,也许可以尝试某种加权平均...
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 2011-11-30
        相关资源
        最近更新 更多