如图所示,未处理边界法线的效果,法线不统一生成类似分界线的效果,需要统一相邻方块边界相接处的法线。

处理过后效果如图所示:

假设地图为4x4的方格,每格的分段为3(每条边4个顶点)
(a).初始化每格非四角处的顶点。数组的遍历顺序是从左往右,从底部往上,边界的各对应方向的顶点等于原值
若AB左右相邻:A格的右法线=A格右法线+B格左法线,B格左法线=A格右法线(已初始化)
若AB下上相接:A格的上法线=A格上法线+B格下法线,B格下法线=A格上法线(已初始化)
代码如下:
1 for (int m = 1; m < cell_segment; m++)//cell_segment是分段数,边上顶点数为cell_segment+1,这里实际是边上顶点数-1 2 { 3 up = ((cell_segment + 1) * (cell_segment) + m); 4 bottom = m; 5 left = m * (cell_segment + 1); 6 right = (m + 1) * (cell_segment + 1) - 1; 7 8 mapdata[j, i].normals[left] = j - 1 < 0 ? mapdata[j, i].normals[left] : mapdata[j - 1, i].normals[right].normalized;//左 9 mapdata[j, i].normals[bottom] = i - 1 < 0 ? mapdata[j, i].normals[bottom] : mapdata[j, i - 1].normals[up].normalized;//下 10 mapdata[j, i].normals[right] = j + 1 >= size_x ? mapdata[j, i].normals[right] : (mapdata[j, i].normals[right] + mapdata[j + 1, i].normals[left]).normalized;//右 11 mapdata[j, i].normals[up] = i + 1 >= size_z ? mapdata[j, i].normals[up] : (mapdata[j, i].normals[up] + mapdata[j, i + 1].normals[bottom]).normalized;//上 12 }
结果如图:

(b).为地图四角的小格的某些参考顶点赋值
mapdata[0, 0].normals[ul] += mapdata[0, 1].normals[bl];//左下小格提供其左上和左下的点做参考,之所以是2个,是按照数组遍历顺序 mapdata[0, 0].normals[br] += mapdata[1, 0].normals[bl]; mapdata[0, size_z - 1].normals[ur] += mapdata[1, size_z - 1].normals[ul];//左上小格提供右上的点 mapdata[size_x - 1, 0].normals[ur] += mapdata[size_x - 1, 1].normals[br];//右下小格提供右上的点

(c).根据这些格子的参考顶点向上,向右延伸
1 for (int i = 0; i < size_z; i++) 2 for (int j = 0; j < size_x; j++) 3 { 4 if (i == 0 && j > 0)//下面一行 5 { 6 if (j < size_x - 1) 7 mapdata[j, i].normals[br] += mapdata[j + 1, i].normals[bl];//右下 8 9 mapdata[j, i].normals[bl] = mapdata[j - 1, i].normals[br];//左下 10 } 11 12 if (j == 0 && i > 0)//左面一行 13 { 14 if (i < size_z - 1) 15 mapdata[j, i].normals[ul] += mapdata[j, i + 1].normals[bl];//左上 16 17 mapdata[j, i].normals[bl] = mapdata[j, i - 1].normals[ul];//左下 18 } 19 20 if (j == size_x - 1 && i > 0)//右面一行 21 { 22 if (i < size_z - 1) 23 mapdata[j, i].normals[ur] += mapdata[j, i + 1].normals[br];//右上 24 mapdata[j, i].normals[br] = mapdata[j, i - 1].normals[ur];//右下 25 } 26 27 if (i == size_z - 1 && j > 0)//上面一行 28 { 29 if (j < size_x - 1) 30 mapdata[j, i].normals[ur] += mapdata[j + 1, i].normals[ul];//右上 31 mapdata[j, i].normals[ul] += mapdata[j - 1, i].normals[ur];//左上 32 }

原文:http://www.cnblogs.com/luxishi/p/6518518.html