您的位置:首页 > 其它

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

2011-09-04 16:17 281 查看


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

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

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



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

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

源码:

view
plain

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;  

}  

 

以上代码没什么难的,叉乘的顺序注意下就好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vector 算法
相关文章推荐