菜鸟学习OGRE和天龙八部之六: 地表和水面的normal搞定,光照正常了

自己做的mesh都要做法线,好受到光照的影响,水平面的法线很容易

地表就相对麻烦一些,求地表顶点法线,可以先求平面的发现来完成

平面上2个矢量叉乘就可以得到平面的法线,然后归一化就好,如果你还想效果更平滑,可以4个平面求平均法线,如图:


我是懒人,只用1个,不想用4个求平均.但是如果地图里面有很近的点光源之类,不求平均法线就会

一格一格的亮度,不平滑,给出求一个平面法线的算法,

源码:

  1. Vector3 TLBBTerrain::getNormalAt(Real x, Real z) const  
  2. {  
  3.     int flip = 1;  
  4.     int mapIndex = x + z*(mXSize+1);  
  5.     Vector3 here (x, mHeightMapData[mapIndex], z);  
  6.     Vector3 right;  
  7.     Vector3 down;  
  8.     // 边界  
  9.     if(x >= mXSize){  
  10.         flip *= -1;  
  11.         right = Vector3(x-1, mHeightMapData[mapIndex-1], z);  
  12.     }else{  
  13.         right = Vector3(x+1, mHeightMapData[mapIndex+1], z);  
  14.     }  
  15.     if(z >= mZSize){  
  16.         flip *= -1;  
  17.         down = Vector3(x, mHeightMapData[mapIndex-mXSize-1], z-1);  
  18.     }else{  
  19.         down = Vector3(x, mHeightMapData[mapIndex+mXSize+1], z+1);  
  20.     }  
  21.     // 生成矢量  
  22.     right -= here;  
  23.     down -= here;  
  24.   
  25.     // 矢量正交,注意方向  
  26.     Vector3 normal = flip * down.crossProduct(right);  
  27.     normal.normalise();         // 归一化  
  28.     return normal;  
  29. }  

 

以上代码没什么难的,叉乘的顺序注意下就好



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值