撰写了文章 发布于 2020-03-10 09:41:59
【奇幻地图程序生成(五)】名称标签的摆放以及杂项
在之前的篇章中,我们生成了各种各样的地形,现在得给它们取名字了。尽管HereDragonsAbound的博客写了十几篇文章,介绍如何生成各种城市,道路,海洋等东西的名称。但那毕竟是英文,我中国文化博大精深,想必大家能够在各种古书中找到更好的名称生成方式。
不过决定每条河流,每个区域叫什么是一回事,如何在奇幻地图上摆放这些名称标签又是另一回事,要是摆的不好,就会变成下面这样,名称标签都互相覆盖,无法辨认。
区域标签:
比如决定了一个区域叫什么之后,我们摆放名称时,首先会想到先确定一个在这个区域的中间点,然后尽量在这个定位点的周围摆放标签,重要性从重要到一般依次考虑如下:
- 标签是否到地图外面去了
- 标签与定位点的距离
- 是否与其他标签重叠
- 标签是否遮挡地图上重要的特征
如果按照这样方式的话,标签很可能标记了不该标记的地方,比如下图名为Tigpolbo的平原的标签,却遮住了树林,让人会误以为是树林的名称。注意那个红色的定位点不会在最后的成品图中出现。
于是尝试改变重要性
- 标签是否到地图外面去了
- 标签是否只在自己区域内部
- 是否与其他标签重叠
- 标签是否遮挡地图上重要的特征
也就是取消使用定位点这个方向,改用凸包。在下图红点围成的凸包内,红色框代表一种可行的放置标签位置的地方。
当然也可以不使用随机点,而使用整齐的正方形网格来确定标签的位置。
河流标签:
但现在我们使用的标签没有旋转,如果用来标识区域还好,但要来标识道路和河流就有些不妥了。
因此我们可以任选河流弯曲的一节,让标签旋转至相同角度。
那么河流标签看起来就像是这样:
但仅仅是这样就够了吗?我们可以看到一些地图上,河流的名称会随着河流的弯曲而弯曲
我们也想做出这样的效果。但如果我们逐字去沿着河流弯曲的话,最终可能是这样的效果。
这不好。于是还是让标签作为整体去弯曲。
最后还是要处理一下,不要把让标签把要标记的物体遮住,必要时翻转标签让其符合人类的阅读顺序。
同样,可以加个遮罩,让标签不被地图上其他东西混淆。
为了避免标签之间相互重叠,此时还需要碰撞检测。但此时标签已经被弯曲了,我们需要检测的并不是矩形与矩形,而是多边形和多边形之间的碰撞了。可用的算法有Greiner-Horman有Sutherland-Hodgman,但这两种算法仍然是通过遍历来寻找可能碰撞的点,效果并不是特别好,因此也可以使用四叉树作为存储结构。
图示可参考如下,绿色方框代表地图特征物,不可以被由红色方框代表的名称标签穿过。
海洋标签:
放置海洋标签时重要的是要让标签与岛屿或海岸线尽可能远。
一种方法是找到海洋中相邻最远的两个点,做一个轴,如下图长红直线,然后将海洋标签放在中间并稍微弯曲。
另一个方式是在海洋中划一个尽可能大的不碰到任何海岸的圆,然后将名称标签放在中间。
海岸标签:
类似于道路标签,将弯弯折折的海岸还原成光滑的弧线,放上海岸标签。
群岛标签
基本方法就是用凸包将群岛围住,然后在凸包外围放置标签。
但是如果生成的岛屿太多太密集,就可能出现下图这种标签混乱,无法辨别的情况。所以建议是让地图生成器不要生成太密集的小岛屿。
到这里本系列的主要部分已经完结了,但仍然还有一些杂项。
在绘制颜色时,很多人都像下图左,直接怼上单调的深色,很难看。再使用浅色时,可以再在边界处加一些浅色的阴影,如下图右,好看多了。
在绘制河流时,也可以加上一些这样的阴影,比如下图右。下图左为没加阴影的对比。
然后是一些好看的地图边框
本系列教程结束,目录如下。
本系列教程大量使用了HereDragonsAbound博客里的图片和说明,这是个非常棒的有关奇幻地图生成的博客,为什么不去看看呢?https://heredragonsabound.blogspot.com