6-10 增加连接区域中的顶点数量

  在上一章中,我们在两种创建连接区域的河道方案中选择了较为合适的一种,就是在连接区域内增加一个四边形,通过调整连接区域中间位置的顶点高度,来形成一条两侧倾斜的河道。
  要把连接处的3个四边形变为4个,就需要在地图单元的每条边上增加额外的顶点。首先我们回到EdgeVertices.cs脚本中,在这里我们来修改顶点的数量。首先使用IDE的重命名功能,将v4重命名为v5,接着将v3重命名为v4。注意,这里一定要使用IDE工具的重命名功能,不然只能手动的搜索整个项目中的脚本来重命名变量了,很可能导致不可预知的错误发生。代码如下:

EdgeVertices.cs
1
2
3
4
5
6
7
public struct EdgeVertices
{

public Vector3 v1, v2, v4, v5;


}

  重命名完成后,再添加一个新的变量v3。代码如下:

EdgeVertices.cs
1
2
3
4
5
6
7
public struct EdgeVertices
{

public Vector3 v1, v2, v3, v4, v5;


}

  因为增加了新的顶点,我们就要修改构造函数。添加新增的这个顶点。v3是在连接区域的中央,也就是0.5的位置上,而与其左右相邻的两个顶点,就分别到了0.25和0.75的位置上。代码如下:

EdgeVertices.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public struct EdgeVertices
{



public EdgeVertices(Vector3 corner1, Vector3 corner2)
{
v1 = corner1;
//v2 = Vector3.Lerp(corner1, corner2, 1f / 3f);
//v4 = Vector3.Lerp(corner1, corner2, 2f / 3f);
//添加了新的v3顶点,其左右相邻的顶点位置也要相应的改变
v2 = Vector3.Lerp(corner1, corner2, 0.25f);
v3 = Vector3.Lerp(corner1, corner2, 0.5f);
v4 = Vector3.Lerp(corner1, corner2, 0.75f);
v5 = corner2;
}


}

  同样的,我们在TerraceLerp方法中,也要将新的v3顶点添加进去。代码如下:

EdgeVertices.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public struct EdgeVertices
{



public static EdgeVertices TerraceLerp(EdgeVertices a, EdgeVertices b, int step)
{
EdgeVertices result;
result.v1 = HexMetrics.TerraceLerp(a.v1, b.v1, step);
result.v2 = HexMetrics.TerraceLerp(a.v2, b.v2, step);
//添加了新的v3顶点
result.v3 = HexMetrics.TerraceLerp(a.v3, b.v3, step);
result.v4 = HexMetrics.TerraceLerp(a.v4, b.v4, step);
result.v5 = HexMetrics.TerraceLerp(a.v5, b.v5, step);
return result;
}
}

  接着,我们回到HexMesh.cs中,这里对EdgeVertices.cs中的方法进行了调用构建mesh,所以也要做出一些修改。首先是TriangulateEdgeFan方法。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class HexMesh : MonoBehaviour
{



private void TriangulateEdgeFan(Vector3 center, EdgeVertices edge, Color color)
{
AddTriangle(center, edge.v1, edge.v2);
AddTriangleColor(color);
//AddTriangle(center, edge.v2, edge.v4);
//AddTriangleColor(color);
//加入了新的顶点信息
AddTriangle(center, edge.v2, edge.v3);
AddTriangleColor(color);
AddTriangle(center, edge.v3, edge.v4);
AddTriangleColor(color);

AddTriangle(center, edge.v4, edge.v5);
AddTriangleColor(color);
}
}

  然后要修改TriangulateEdgeStrip方法。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class HexMesh : MonoBehaviour
{



private void TriangulateEdgeStrip(EdgeVertices e1, Color c1, EdgeVertices e2, Color c2)
{
AddQuad(e1.v1, e1.v2, e2.v1, e2.v2);
AddQuadColor(c1, c2);
//AddQuad(e1.v2, e1.v4, e2.v2, e2.v4);
//AddQuadColor(c1, c2);
//添加了新的顶点信息
AddQuad(e1.v2, e1.v3, e2.v2, e2.v3);
AddQuadColor(c1, c2);
AddQuad(e1.v3, e1.v4, e2.v3, e2.v4);
AddQuadColor(c1, c2);

AddQuad(e1.v4, e1.v5, e2.v4, e2.v5);
AddQuadColor(c1, c2);
}
}

  这样,我们就完成了添加顶点数量的相关代码。下图是添加顶点前后地图mesh的变化对比。在下一章中,我们将设置河道的高度,这样可以将地面与河道使用不同高度区分开来。

Github代码