4-9 细分地图单元边缘

  在上一章中,我们修复了连接区域和地图单元高度不同的问题。但是依然存在Cliff连接类型种三角形连接区域和矩形连接区域有破面的问题。让我们将这个问题暂缓,先进一步丰富地图的整体细节,破面的问题会在这个过程中得到修复。
  让我们来观察一下地图内所有顶点经过扰动后的样子,如下如所示。经过扰动的顶点虽然产生了随机性,但是每个地图单元整体看来仍然是一个六边形,虽然这样并不影响什么,但是这样显得地图的细节不够丰富,我们应该增加细节,让地图看起来更加饱满。

  要添加更多的细节,那就先从地图单元的正六边形部分开始着手。如果我们能将正六边形细分更多的面出来,经过额敖东后,就应该有更多的变化。所以我们在六边形的每个边中点上,再添加一个顶点,将之前的三角面片分为两个。这就需要修改HexMesh.Triangulate方法,在构建三角面片的时候添加两个三角形,而不是一个。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void Triangulate(HexDirection direction, HexCell cell)
{


Vector3 v2 = center + HexMetrics.GetSecondSolidCorner(direction);

//为了增加地图的整体细节,这里在cell六边形每个边的中点上,店家一个顶点
//让原来的6个面片变为12个。
Vector3 e1 = Vector3.Lerp(v1, v2, 0.5f);

//这里添加的顶点也变为了一个边的中点
//这3个顶点是原来六边形一个三角面片的一半
AddTriangle(center, v1, e1);

AddTriangleColor(cell.color);

//这里构建原来六边形一个三角面片的另一半
AddTriangle(center, e1, v2);
AddTriangleColor(cell.color);


}

  顶点加倍之后,果然细节变得更加丰富了,那么我们直接在之前六边形的一条边上增加两个顶点,也就是将一个三角面片切为三个部分,这样细节会更加丰富。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void Triangulate(HexDirection direction, HexCell cell)
{


Vector3 v2 = center + HexMetrics.GetSecondSolidCorner(direction);

//这里将正六边形的每个边均分为3份,面数是原来的3倍
Vector3 e1 = Vector3.Lerp(v1, v2, 1f / 3f);
Vector3 e2 = Vector3.Lerp(v1, v2, 2f / 3f);

AddTriangle(center, v1, e1);
AddTriangleColor(cell.color);

//添加新增顶点的的位置信息和颜色信息
AddTriangle(center, e1, e2);
AddTriangleColor(cell.color);
AddTriangle(center, e2, v2);
AddTriangleColor(cell.color);


}

  经过细分后,六边形地图变得细节更加丰富了,不过同时也产生了很多交错面与破面。在接下来的章节中,我们将六边形每条边上细分后产生的顶点与其相邻的连接区域进行连接。消除交错面和破面。

Github代码