修改ETM源码,增加了平滑、澡波等地形编辑算法
来源:互联网 发布:军团td4.2 兵种数据 编辑:程序博客网 时间:2024/04/25 02:24
在etm的ETTerrainManager.cpp中增加以下函数即可,目前算法还很简单,以后可能会在丰富一些
//-----------------------------------------------------------------------------
// name: 推平
// Desc:
//-----------------------------------------------------------------------------
void TerrainImpl::deformToPlane(int x, int z, const Brush& brush, float intensity)
{
//声明推平高度
float fFinalHeight=1.0f;
//把x.z定在刷子的左上角
x -= (int)brush.getWidth()/2;
z -= (int)brush.getHeight()/2;
//确定推平高度
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x位置超出边界,则不处理
if (posX < 0 || posX >= (int)mInfo.getWidth())
continue;
//如果x在地图内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z位置超出边界,则不处理
if (posZ < 0 || posZ >= (int)mInfo.getHeight())
continue;
//如果x,z都在正确的范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
if (height }
}
//应用推平高度
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x位置超出边界,则不处理
if (posX < 0 || posX >= (int)mInfo.getWidth())
continue;
//如果x在地图内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z位置超出边界,则不处理
if (posZ < 0 || posZ >= (int)mInfo.getHeight())
continue;
//如果x,z都在正确的范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
height = fFinalHeight; //设置为推平高度
//如果高度超出范围则做范围调整
if (height > 1)
height = 1;
if (height < 0)
height = 0;
}
}
//应用高度,使改动生效
updateTiles(x, z, x+(int)brush.getWidth(), z+(int)brush.getHeight());
}
//-----------------------------------------------------------------------------
// name: 噪波
// Desc:
//-----------------------------------------------------------------------------
void TerrainImpl::deformToWave(int x, int z, const Brush& brush, float intensity)
{
//把x.z定在刷子的左上角
x -= (int)brush.getWidth()/2;
z -= (int)brush.getHeight()/2;
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x位置超出边界,则不处理
if (posX < 0 || posX >= (int)mInfo.getWidth())
continue;
//如果x在地图内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z位置超出边界,则不处理
if (posZ < 0 || posZ >= (int)mInfo.getHeight())
continue;
//如果x,z都在正确的范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
height += GetRandomF()*intensity * brush.at(i, j); //随机增加或降低高度
//如果高度超出范围则做范围调整
if (height > 1)
height = 1;
if (height < 0)
height = 0;
}
}
//应用高度,使改动生效
updateTiles(x, z, x+(int)brush.getWidth(), z+(int)brush.getHeight());
}
//-----------------------------------------------------------------------------
// name: 平滑
// Desc:
//-----------------------------------------------------------------------------
void TerrainImpl::deformToSmooth(int x, int z, const Brush& brush, float intensity)
{
//把x.z定在刷子的左上角
x -= (int)brush.getWidth()/2;
z -= (int)brush.getHeight()/2;
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x-1或+1的位置超出边界,则不处理
if ( (posX-1)<0 || (posX+1)>=(int)mInfo.getWidth() )
continue;
//如果x在平滑范围内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z-1或+1的位置超出边界,则不处理
if ( (posZ-1)<0 || (posZ+1)>=(int)mInfo.getHeight() )
continue;
//如果x,z都在正确的平滑范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
float& leftHeight = mInfo.at(size_t(posX), size_t(posZ-1)); //获得左边高度
float& topHeight = mInfo.at(size_t(posX-1), size_t(posZ)); //获得上边高度
float& rightHeight = mInfo.at(size_t(posX), size_t(posZ+1)); //获得右边高度
float& bottomHeight = mInfo.at(size_t(posX+1), size_t(posZ)); //获得下边高度
height=(leftHeight+topHeight+rightHeight+bottomHeight)/4.0f; //求出四面高度的平均值
//如果高度超出范围则做范围调整
if (height > 1)
height = 1;
if (height < 0)
height = 0;
}
}
//应用高度,使改动生效
updateTiles(x, z, x+(int)brush.getWidth(), z+(int)brush.getHeight());
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/miaolinvip/archive/2008/07/20/2680307.aspx
- 修改ETM源码,增加了平滑、澡波等地形编辑算法
- 修改ETM源码,增加了平滑、澡波等地形编辑算法
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- 地形平滑算法
- 地形平滑算法
- 地形平滑算法
- ETM地形编辑DEMO运行时出错问题
- 仿Crysis的道路编辑, 道路与地形匹配和地形与道路匹配,OGRE + ETM
- 《C++游戏开发》笔记十三 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
- 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
- unity3d 发布后动态修改地形高度源码
- Unity3D-Terrain地形编辑
- 转载Unity地形编辑
- jQuery编辑Select标签 增加修改删除 选
- ogre1.7的工作队列的使用方法
- DIB位图文件的格式、读取、保存和显示
- 正则表达式
- j2me实现播放mpg格式视频
- 用测试工具轻松找出企业网络故障(转)
- 修改ETM源码,增加了平滑、澡波等地形编辑算法
- (转)Visual 2008中 warning C4996的解决方法
- VMware下LINUX的虚拟机增加磁盘空间
- Sql Server学习
- request.getParameter()和session.getParameter()的区别
- 关于openssl BIGNUM
- ubuntu11.04 64位下增加android2.2 for S5PV210缺少lib
- spring mvc导致的已配置placeholder但是placeholder却无法注入的问题(使用annotation)
- jsp中超链接的href和onclick 用法