在上一章中,我们通过判断两个地图单元的高低差,实现了只对Slope类型的连接区域进行阶梯化。接下来,就是要将三角形连接区域进行阶梯化。
相比于矩形连接区域,三角形连接区域的阶梯化会更加复杂,因为它连接了3个地图单元。这三个地图单元可能是任意高度,每两个地图单元之间的高差类型也是任意的。所以需要在HexMesh.cs
中另外添加一个三角形连接区域的专用方法。
首先,我们先将三角形连接区域相邻的三个地图单元进行分类,分别为Left、Right和Bittom。
接下来,在新增加的方法中,我们先获取这三个地图单元的位置坐标和其颜色,方便之后进行阶梯化计算。
HexMesh.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
private void TriangulateCorner( Vector3 bottom, HexCell bottomCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell) { AddTriangle(bottom, left, right); AddTriangleColor(bottomCell.color, leftCell.color, rightCell.color); }
|
我们回到TriangulateConnection
方法中,在这个方法中,我们要判断与三角形连接区域相邻的三个地图单元,哪一个是最低的。
这里要注意一点,结合上图,我们现在只是判断哪个地图单元的高度最低,而不是对这三个地图单元的高度进行排序。因为一个三角形连接区域的三个地图单元,其坐标是固定的,当确定了哪个地图单元是最低的一个时,剩下两个的顺序其实就是固定的了。所以不存在排序问题。整理后的逻辑图如下:
根据整理后的逻辑图可以发现,判断最低的地图单元,实际上就是将图1中的3个地图单元进行顺时针或逆时针的旋转。
首先我们先检查第一个地图单元的高度,如果它小于其他两个地图单元,那么它就是最低的一个。
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
| private void TriangulateConnection(HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2) { … if (direction <= HexDirection.E && nextNeighbor != null) { …
if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v2, cell, v4, neighbor, v5, nextNeighbor); } } } }
|
如果cell
的高度大于nextNeighbor
的高度,说明nextNeighbor
的高度最低。
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
| private void TriangulateConnection(HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2) { … if (direction <= HexDirection.E && nextNeighbor != null) { …
if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v2, cell, v4, neighbor, v5, nextNeighbor); } else { TriangulateCorner(v5, nextNeighbor, v2, cell, v4, neighbor); } } } }
|
最后,如果cell
高度大于neighbor
,那么只需要检测neighbor
和nextNeighbor
之间的高度就可以了。
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 32 33 34 35 36 37 38 39
| private void TriangulateConnection(HexDirection direction, HexCell cell, Vector3 v1, Vector3 v2) { … if (direction <= HexDirection.E && nextNeighbor != null) { …
if (cell.Elevation <= neighbor.Elevation) { if (cell.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v2, cell, v4, neighbor, v5, nextNeighbor); } else { TriangulateCorner(v5, nextNeighbor, v2, cell, v4, neighbor); } } else if (neighbor.Elevation <= nextNeighbor.Elevation) { TriangulateCorner(v4, neighbor, v5, nextNeighbor, v2, cell); } else { TriangulateCorner(v5, nextNeighbor, v2, cell, v4, neighbor); } } }
|
这样,我们就找到了三角形连接区域中,高度最低的那个地图单元了。在接下来的章节中,我们会在这个基础上,使用循环来对三角形连接区域进行阶梯化,根据不同的高差类型,来构建不同的三角形连接区域外观。
Github代码