菜鸟学习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;
}
以上代码没什么难的,叉乘的顺序注意下就好
相关文章推荐
- 菜鸟学习OGRE和天龙八部之六: 地表和水面的normal搞定,光照正常了
- 菜鸟学习OGRE和天龙八部之五: 水面TerrainLiquid基本搞定
- 菜鸟学习OGRE和天龙八部之八: 水面方格效果和光照BUG的修正
- 菜鸟学习OGRE和天龙八部之五: 水面TerrainLiquid基本搞定
- 菜鸟学习OGRE和天龙八部之八: 水面方格效果和光照BUG的修正
- 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定
- 菜鸟学习OGRE和天龙八部之四: 地表贴图的实现
- 菜鸟学习OGRE和天龙八部之四: 地表贴图的实现
- 菜鸟学习OGRE和天龙八部之七: frame帧动画数据格式搞定,已修正关键帧
- 菜鸟学习OGRE和天龙八部之七: frame帧动画数据格式搞定,已修正关键帧
- 菜鸟学习OGRE和天龙八部之十: frame动画基本搞定,遇到点问题
- 菜鸟学习OGRE和天龙八部之十: frame动画基本搞定,遇到点问题
- 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定(2009.10.19)
- 菜鸟学习OGRE和天龙八部之十四: 修正水面算法的一些BUG
- 菜鸟学习OGRE和天龙八部之十四: 修正水面算法的一些BUG
- 菜鸟学习OGRE和天龙八部之七: frame帧动画数据格式搞定,已修正关键帧
- 菜鸟学习OGRE和天龙八部之十六: 网游视角跑图功能基本实现,包括人物,射线查询,鼠标decal等等
- 菜鸟学习OGRE和天龙八部之十七: 修正部分地图载入的通用性问题,附源码
- 菜鸟学习OGRE和天龙八部之十六: 网游视角跑图功能基本实现,包括人物,射线查询,鼠标decal等等
- 菜鸟学习OGRE和天龙八部之一:OGRE+MFC+OIS