algorithm – 如何对伪3D建筑进行排序/绘制,使它们在视觉上不重叠

我在地图上有建筑物的矢量数据,并希望它们看起来是挤压的,具体取决于已知的高度.

我知道这是一项常见的任务,但我没有找到任何令人满意的解决方案.

我在mapnik中看到了实现,它们使用多边形中所有顶点的最小Y进行简单排序.结果,大多数是正确的,但有些仍然重叠(约2-3%).

在大多数情况下,只需很好地对结构进行分类(不知何故?)并以适当的顺序绘制它们(对于上述情况,此序列将为3-2-1).

在更复杂的情况下,当多边形是凹的并且彼此太靠近时,每个墙和帽(屋顶)应该分开绘制(见下文).

更新:

因此,有两种要绘制的细分:墙和帽.墙段很容易订购(最小Y).我无法弄清楚如何订购上限.

谢谢.

最佳答案 在直壁的情况下,很容易按深度对它们进行分类.只考虑它们的直线段基数.请注意,每条线将平面分为两部分,其中一部分更靠近观察者,另一部分更远.对于任何段A,调用较近的A部分和较远的A部分.现在,对于任何两个段A和B,至少有一个命题成立:

>一个完全在于B的谎言
>一个谎言完全在B-
> B完全在于A-
> B完全在A中
>一段与视线平行,另一段完全在左侧或完全在右侧
> A和B相交

在案例1和案例3中,B应在A之前绘制(A可能会封闭B,但B可能不会封闭A);在案例(2)和(4)A之前的B;在案例5中,没关系;正常墙壁不应出现6.

您现在可以对墙进行拓扑排序,并将它们从最远到最近绘制.

至于屋顶,这对于凹形建筑物是不可能的,因为屋顶的一部分可能被遮挡了同一屋顶的另一部分的墙壁遮挡.想象一下,从其侧面可以看到一个低U形建筑,在U的中间有一座高塔.塔楼将被U型屋顶遮挡并遮挡,所以无论你绘制它们的顺序如何,图片都将是错误.

因此,您必须将凹形屋顶细分为凸多边形.然后应该很容易按照相同的原则将它们与墙壁一起分类.

另一种方法是使用Z缓冲区,这使您无需考虑订单.我的印象是,如今你可以在最低功耗的手机显卡上获得Z缓冲.

点赞