6-13 区分是否有河流
在上一章中,我们对河床最低点的顶点进行了偏移,当鼠标左键按下并拖拽的时候,就会产生相应的河道。但是我们发现河道进入地图单元后,并不像在连接处那样保持宽度,而变成了逐渐向地图单元中心汇集。修复这个问题比较复杂,我们来分情况讨论。首先我们从最简单的情况开始考虑:河流从一侧流入地图单元,又从其相对的方向流出。
如果一个地图单元中没有河流,其顶点与一条边所组成的图形是一个扇形。当有河流时,就需要把地图单元中被河流穿过的三角形变成四边形,而扇形整体就变成了梯形。如下图所示:
穿过地图单元的河道要比穿过连接处的河道长很多,所以地图单元内组成河道的各个顶点被扰动后,变化会更加明显。为了减小扰动所带来的这个问题,我们在顶点到边缘之间再插入一个新的顶点,将原来的区域分为两段。如下图所示:
一个地图单元内,有河流穿过和没有河流穿过,两者的三角剖分会有很大不同。这里我们为此创建一个新的方法。如果一个地图单元内有河流经过,就使用这个新创建的方法,如果没有,就使用之前的方法。代码如下:
1 | public class HexMesh : MonoBehaviour |
我们虽然创建了有河流经过地图单元时,所使用的三角剖分方法,但是并没有任何内容,所以现在河流经过的地图单元是空的。如下图所示:
为了更好的观察三角剖分情况,我们先暂时不使用坐标扰动。代码如下:
1 | public static class HexMetrics |
至此,我们根据十一地图单元内是否有河流进行了区分,从而使用了不同的三角剖分方式进行构建。在下一张中,我们先处理最简单的河流情况,也就是河流笔直穿过一个地图单元。