在上一章中,我们创建了对计算细分顶点与构建三角面片的方法进行了抽象,将这些步骤分别封装在了不同的结构体和方法中。在这一章中我们将使用这些方法,来进行阶梯连接区域的细分。
  要进行阶梯连接与其的细分,就需要把新的顶点信息传递到TriangulateEdgeTerraces方法中,在判断两个相邻地图单元连接方式为Slope时,进行阶梯状连接区域的构建。代码如下:
HexCell.cs1 2 3 4 5 6 7 8 9 10 11 12
   | private void TriangulateConnection(HexDirection direction, HexCell cell, EdgeVertices e1) {     …          if (cell.GetEdgeType(direction) == HexEdgeType.Slope)     {                  TriangulateEdgeTerraces(e1.v1, e1.v4, cell, e2.v1, e2.v4, neighbor);     }              … }
   | 
 
  接下来,要修改TriangulateEdgeTerraces方法的参数列表,新的参数是与阶梯连接区域相邻的两个边,而不是一组顶点。然后假设EdgeVertices里有插值计算函数,这就可以让我们简化TriangulateEdgeTerraces方法而不是使其变得更复杂。代码如下:
HexMesh.cs1 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
   | 
 
 
 
 
 
 
  private void TriangulateEdgeTerraces(EdgeVertices begin, HexCell beginCell, EdgeVertices end, HexCell endCell) {          EdgeVertices e2 = EdgeVertices.TerraceLerp(begin, end, 1);          Color c2 = HexMetrics.TerraceLerp(beginCell.color, endCell.color, 1);
           TriangulateEdgeStrip(begin, beginCell.color, e2, c2);
           for (int i = 2; i < HexMetrics.terraceSteps; i++)     {         EdgeVertices e1 = e2;         Color c1 = c2;         e2 = EdgeVertices.TerraceLerp(begin, end, i);         c2 = HexMetrics.TerraceLerp(beginCell.color, endCell.color, i);         TriangulateEdgeStrip(e1, c1, e2, c2);     }
           TriangulateEdgeStrip(e2, c2, end, endCell.color); }
 
  | 
 
  最后,回到EdgeVertices.cs中,创建TerraceLerp方法,这个方法是使用插值计算阶梯连接区域中,每一段的顶点位置。代码如下:
EdgeVertices.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | 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);         result.v3 = HexMetrics.TerraceLerp(a.v3, b.v3, step);         result.v4 = HexMetrics.TerraceLerp(a.v4, b.v4, step);         return result;     } }
   | 
 

  至此,我们就完成了经过细分之后阶梯连接区域的构建。在下一章中,我们将修复之前暂缓的斜面与阶梯连接区域破面的问题。
[Github代码](