3-15 Slope-Cliff类型三角形连接区域构建 顶部区域

  在上一章中我们完成了Slope-Cliff三角形连接区域底部的构建,这一章中我们来完成顶部的构建。首先我们将之前对底部进行构建的代码单独提出来,封装成一个方法,这样在之后处理变体的情况是,可以进行复用。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private void TriangulateCornerTerracesCliff(
Vector3 begin, HexCell beginCell,
Vector3 left, HexCell leftCell,
Vector3 right, HexCell rightCell)
{


//构建底部三角面片
TriangulateBoundaryTriangle(begin, beginCell, left, leftCell, boundary, boundaryColor);
}

/// <summary>
/// Slope-Cliff连接类型种 创建底部区域
/// </summary>
/// <param name="begin">初始cell位置</param>
/// <param name="beginCell">初始cell实例</param>
/// <param name="left">左侧cell位置</param>
/// <param name="leftCell">左侧cell实例</param>
/// <param name="right">右侧cell位置</param>
/// <param name="rightCell">右侧cell实例</param>
private void TriangulateBoundaryTriangle(
Vector3 begin, HexCell beginCell,
Vector3 left, HexCell leftCell,
Vector3 boundary, Color boundaryColor)
{
Vector3 v2 = HexMetrics.TerraceLerp(begin, left, 1);
Color c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, 1);

AddTriangle(begin, v2, boundary);
AddTriangleColor(beginCell.color, c2, boundaryColor);

for (int i = 2; i < HexMetrics.terraceSteps; i++)
{
Vector3 v1 = v2;
Color c1 = c2;
v2 = HexMetrics.TerraceLerp(begin, left, i);
c2 = HexMetrics.TerraceLerp(beginCell.color, leftCell.color, i);
AddTriangle(v1, v2, boundary);
AddTriangleColor(c1, c2, boundaryColor);
}

AddTriangle(v2, left, boundary);
AddTriangleColor(c2, leftCell.color, boundaryColor);
}

  接下来,我们判断left和right地图单元的高度关系,如果两者的高度关系为Slope,那么我们就直接使用TriangulateBoundaryTriangle方法构建顶部区域即可,只是入参变为了left与right之间矩形阶梯连接区域的顶点。而如果两者的高度关系为Cliff,那么我们直接用一个三角面片填补这个区域就可以了。代码如下:

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 TriangulateCornerTerracesCliff(
Vector3 begin, HexCell beginCell,
Vector3 left, HexCell leftCell,
Vector3 right, HexCell rightCell)
{


//如果left和right的高度关系为Slope,也就是高度差1
//那么就使用构建底部构建三角面片的方法,只不过入参是上下翻转的
if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope)
{
TriangulateBoundaryTriangle(left, leftCell, right, rightCell, boundary, boundaryColor);
}
//如果left和right的高度关系为Cliff,也就是高度差大于1
//那么直接只用一个三角面片填补这个区域即可
else
{
AddTriangle(left, right, boundary);
AddTriangleColor(leftCell.color, rightCell.color, boundaryColor);
}
}

  接这样,我们就完成了Slope-Cliff类型的三角形连接区域的构建,在接下来的章节中,我们将处理Slope-Cliff类型的变体,也就是对称组合的三角形连接区域。

Github代码