首页 > 其他 > 详细

解决地形生成各方块边界法线不统一的问题

时间:2017-03-08 13:01:28      阅读:580      评论:0      收藏:0      [点我收藏+]

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

技术分享

 

处理过后效果如图所示:

技术分享

 

假设地图为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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!