自己做的mesh都要做法线,好受到光照的影响,水平面的法线很容易
地表就相对麻烦一些,求地表顶点法线,可以先求平面的发现来完成
平面上2个矢量叉乘就可以得到平面的法线,然后归一化就好,如果你还想效果更平滑,可以4个平面求平均法线,如图:
我是懒人,只用1个,不想用4个求平均.但是如果地图里面有很近的点光源之类,不求平均法线就会
一格一格的亮度,不平滑,给出求一个平面法线的算法,
源码:
- Vector3 TLBBTerrain::getNormalAt(Real x, Real z) const
- {
- int flip = 1;
- int mapIndex = x + z*(mXSize+1);
- Vector3 here (x, mHeightMapData[mapIndex], z);
- Vector3 right;
- Vector3 down;
- // 边界
- if(x >= mXSize){
- flip *= -1;
- right = Vector3(x-1, mHeightMapData[mapIndex-1], z);
- }else{
- right = Vector3(x+1, mHeightMapData[mapIndex+1], z);
- }
- if(z >= mZSize){
- flip *= -1;
- down = Vector3(x, mHeightMapData[mapIndex-mXSize-1], z-1);
- }else{
- down = Vector3(x, mHeightMapData[mapIndex+mXSize+1], z+1);
- }
- // 生成矢量
- right -= here;
- down -= here;
- // 矢量正交,注意方向
- Vector3 normal = flip * down.crossProduct(right);
- normal.normalise(); // 归一化
- return normal;
- }
以上代码没什么难的,叉乘的顺序注意下就好