利用SimpleRenderable实现DirectX 9 3D 游戏设计入门中 第十三章 地形渲染基础的简单地形,只是简单的实现了地形的基本框架,顶点,索引,纹理等,为简单起见高度都为1,适合新手做入门的学习,高手可以飘过了,效果图:

Terrain.h:

#ifndef _TERRAIN_H_
#define _TERRAIN_H_#include <Ogre.h>
#include "Common.h"using namespace Ogre;#define VERTEX_POS_BINDING 0class CTerrain :public SimpleRenderable
{
public://numVertsPerCol,numVertsPerRow为奇数时m_width,m_depth必定为偶数CTerrain(int numVertsPerRow=513,int numVertsPerCol=513,int cellSize=10,float heightScal=1.0f);~CTerrain();public:bool InitData();void LoadHeightmap();void CreateVertexData();void CreateIndexData();// Overridden from MovableObjectvirtual Real getBoundingRadius() const;virtual const AxisAlignedBox& getBoundingBox() const;// Overridden from Renderablevirtual Real getSquaredViewDepth(const Ogre::Camera* cam) const;
private:String m_heightMapPath;//高度图float *m_heightMap;//高度数据float m_heightScal;//高度缩放值int m_numVertsPerRow;//每行顶点数int m_numVertsPerCol;//每列顶点数int m_numCellsPerRow;//每行格子数int m_numCellsPerCol;//每列格子数int m_cellSize;//格子边长int m_numVerts;//顶点总数int m_numTriangles;//三角形总数int m_width;//地形宽度int m_depth;//地形深度bool m_bSaveData;//是否保存顶点信息
AxisAlignedBox mAABB;Real mBoundingRadius;VertexData *pVertexData;IndexData *pIndexData;
};#endif

Terrain.cpp:

#include "Terrain.h"
#include <fstream>CTerrain::CTerrain(int numVertsPerRow,int numVertsPerCol,int cellSize,float heightScal)
{m_numVertsPerRow=numVertsPerRow;m_numVertsPerCol=numVertsPerCol;m_heightScal=heightScal;m_cellSize=cellSize;m_heightMapPath="";m_bSaveData=true;m_numCellsPerRow=m_numVertsPerRow-1;m_numCellsPerCol=m_numVertsPerCol-1;m_numVerts=m_numVertsPerRow*m_numVertsPerCol;m_numTriangles=m_numCellsPerRow*m_numCellsPerCol*2;m_width=m_numCellsPerRow*m_cellSize;m_depth=m_numCellsPerCol*m_cellSize;m_heightMap=new float[m_numVerts];
}CTerrain::~CTerrain()
{safeDelArry(m_heightMap);OGRE_DELETE(mRenderOp.vertexData);OGRE_DELETE(mRenderOp.indexData);
}bool CTerrain::InitData()
{LoadHeightmap();CreateVertexData();CreateIndexData();return true;
}void CTerrain::LoadHeightmap()
{for (int i=0;i<m_numVerts;i++){m_heightMap[i]=1.0f;}
}void CTerrain::CreateVertexData()
{mRenderOp.vertexData=new VertexData();pVertexData=mRenderOp.vertexData;pVertexData->vertexCount=m_numVerts;pVertexData->vertexStart=0;mRenderOp.operationType=RenderOperation::OT_TRIANGLE_LIST;mRenderOp.useIndexes=true;VertexDeclaration *decl=pVertexData->vertexDeclaration;VertexBufferBinding *bind=pVertexData->vertexBufferBinding;size_t vOffset=0,textCoordSet=0;decl->addElement(0,vOffset,VET_FLOAT3,VES_POSITION);vOffset=vOffset+VertexElement::getTypeSize(VET_FLOAT3);decl->addElement(0,vOffset,VET_COLOUR,VES_DIFFUSE);vOffset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);decl->addElement(0,vOffset,VET_FLOAT2,VES_TEXTURE_COORDINATES,textCoordSet++);vOffset=vOffset+VertexElement::getTypeSize(VET_FLOAT2);decl->addElement(0,vOffset,VET_FLOAT2,VES_TEXTURE_COORDINATES,textCoordSet++);HardwareVertexBufferSharedPtr pVerBuff;pVerBuff=HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(0),m_numVerts,HardwareBuffer::HBU_STATIC_WRITE_ONLY,false);float *pLock=static_cast<float *>(pVerBuff->lock(0,pVerBuff->getSizeInBytes(),HardwareBuffer::HBL_DISCARD));RGBA colour,*pColour;RenderSystem *rs=Ogre::Root::getSingleton().getRenderSystem();rs->convertColourValue(ColourValue(1.0f,1.0f,1.0f),&colour);float start_x,end_x,start_z,end_z;int index=0;start_x=-m_width/2;end_x=-start_x;start_z=-m_depth/2;end_z=-start_z;std::ofstream of;bool bopen=false;if (m_bSaveData){of.open(L"vertexInfo.txt",std::ios::out|std::ios::trunc);if (of.is_open()){bopen=true;of<<"------------------------------------------\r\n";of<<"vertex data info:\r\n";}else{MessageBox( NULL, L"INFO",L"An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);}}float y=0.0f,tu=0.0f,tv=0.0f;int h=0,c=0;char tmepChar[128]={0};for (float z=start_z;z<=end_z;z+=m_cellSize){tu=h*m_cellSize/(float)m_width;h++;c=0;for (float x=start_x;x<=end_x;x+=m_cellSize){tv=c*m_cellSize/(float)m_depth;c++;y=m_heightMap[index++];*pLock=x;pLock++;*pLock=y;pLock++;*pLock=z;pLock++;pColour=static_cast<RGBA *>(static_cast<void *>(pLock));*pColour=colour;pColour++;pLock=static_cast<float *>(static_cast<void *>(pColour));*pLock=tu;pLock++;*pLock=tv;pLock++;*pLock=tu;pLock++;*pLock=tv;pLock++;if (m_bSaveData&&bopen){sprintf(tmepChar,"x=%f y=%f z=%f u=%f v=%f\r\n",x,y,z,tu,tv);of<<tmepChar;}}}pVerBuff->unlock();bind->setBinding(0,pVerBuff);if (m_bSaveData&&bopen)of.close();float boxHeght=20.0f;float vertices[8][3] = {start_x, boxHeght, start_z,        // A-start_x, boxHeght, start_z,    // Bstart_x, boxHeght, -start_z,    // C-start_x, boxHeght, -start_z,    // D
start_x, boxHeght, start_z,        // A-start_x, boxHeght, start_z,    // Bstart_x, boxHeght, -start_z,    // C-start_x, boxHeght, -start_z,    // D
    };for (int i=0;i<8;i++){mAABB.merge(Ogre::Vector3(vertices[i][0], vertices[i][1], vertices[i][2]));        }mBoundingRadius = Ogre::Math::boundingRadiusFromAABB(mAABB);}
/*A---------B-            --            --            -C-----------D
*/
void CTerrain::CreateIndexData()
{mRenderOp.indexData=new IndexData();pIndexData=mRenderOp.indexData;pIndexData->indexStart=0;pIndexData->indexCount=m_numTriangles*3;pIndexData->indexBuffer=HardwareBufferManager::getSingleton().createIndexBuffer(HardwareIndexBuffer::IT_16BIT,pIndexData->indexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);unsigned short *pIndexLock=static_cast<unsigned short *>(pIndexData->indexBuffer->lock(0, pIndexData->indexBuffer->getSizeInBytes(),HardwareBuffer::HBL_DISCARD));std::ofstream of;bool bopen=false;if (m_bSaveData){of.open(L"indexInfo.txt",std::ios::out|std::ios::trunc);if (of.is_open()){bopen=true;of<<"------------------------------------------\r\n";of<<"index data info:\r\n";}else{MessageBox( NULL, L"INFO",L"An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);}}char tmepChar[128]={0};unsigned short uvalue[6];int index=0;for (unsigned short row=0;row<m_numCellsPerCol;row++){for (unsigned short col=0;col<m_numCellsPerRow;col++){//ACBuvalue[0]=row*m_numVertsPerRow+col;*pIndexLock=uvalue[0];pIndexLock++;uvalue[1]=(row+1)*m_numVertsPerRow+col;*pIndexLock=uvalue[1];pIndexLock++;uvalue[2]=row*m_numVertsPerRow+col+1;//
            *pIndexLock=uvalue[2];pIndexLock++;//CDBuvalue[3]=uvalue[1];uvalue[5]=uvalue[2];uvalue[4]=(row+1)*m_numVertsPerRow+col+1;*pIndexLock=uvalue[3];pIndexLock++;*pIndexLock=uvalue[4];pIndexLock++;*pIndexLock=uvalue[5];pIndexLock++;if (m_bSaveData&&bopen){for (int j=0;j<6;j++){sprintf(tmepChar,"index%d=%u ",index++,uvalue[j]);of<<tmepChar;if (j==5){of<<std::endl;}}}}}pIndexData->indexBuffer->unlock();if (m_bSaveData&&bopen){of.close();}
}Real CTerrain::getBoundingRadius() const
{return mBoundingRadius;
}Real CTerrain::getSquaredViewDepth(const Ogre::Camera* cam) const
{assert(mParentNode);return mParentNode->getSquaredViewDepth(cam);
}const AxisAlignedBox& CTerrain::getBoundingBox() const
{return mAABB;
}

创建地形:

void CApplication::CreateTerrain()
{pTerrain=new CTerrain(65,65,10,1.0f);pTerrain->InitData();pTerrain->setMaterial("Examples/Terrain_Material");SceneNode *node =pSceneManager->getRootSceneNode()->createChildSceneNode("TerrainNode",Vector3(0,0,0));node->attachObject(pTerrain);node->showBoundingBox(true);
}

材质:

material Examples/Terrain_Material : Examples/OgreDance
{technique{pass{lighting off//scene_blend alpha_blend//cull_hardware none//cull_software none
texture_unit{texture dirt_grayrocky_diffusespecular.ddstex_address_mode wrap}texture_unit{//colour_op_ex add src_texture src_current//colour_op_multipass_fallback one one
texture grass_green-01_diffusespecular.ddstex_address_mode wrap}}}
}

转载于:https://www.cnblogs.com/gamesky/p/3257119.html

Ogre实现简单地形相关推荐

  1. FX粒子(Niagara系统)、顶点法线材质函数、材质参数集——雪和简单地形材质积雪效果

    雪 一.利用FX--Niagara系统创建粒子,模板选择 喷泉粒子模板      二.删除不需要的模块 球体位置发射.初始的向上速度.拖拽等和雪无关的模块删除. 三.添加需要的模块并设置 需要大范围降 ...

  2. unity3d创建简单地形遇到的那些坑

    unity是一款游戏编辑器,可以实现2d和3d游戏的编写,重要的是,他不需要很高的编程水平,会使用简单的c#就可以设计出高质量的游戏,而这篇文章将用来记载我在创建第一个3d地图中的点点嘀嘀. 一:关于 ...

  3. Ogre 编辑器二(用Ogre的地形组件加载天龙八部地形)

    主界面如上文设计完成后,场景刚开始添加了是Ogre例子里的,发现场景里实物太少,于是想到直接把天龙的场景拿下来,天龙网上有源码,参考了下,把天龙的地形用Ogre的地形组件完成了下,如下是效果图: 因为 ...

  4. 【Ogre编程入门与进阶】第八章 地形、天空与雾化效果

    转载自:http://blog.csdn.net/zhanghua1816/article/details/18195357 在一款完整的3D游戏或是三维动画中,大地和天空都是构建场景时不可缺少的元素 ...

  5. Ogre基础教程3:地形,天空,烟雾

    本教程将专注于在一个场景中渲染地形. 我们将涉及到需要被完成的基本设置,并且将介绍地形光照的使用. 我们也会给出对使用天空盒(Skyboxes).天空穹顶(Skydomes)以及天空面(Skyplan ...

  6. Ogre1.7的地形、天空与雾

    地形 ogre过去在地形的支持上很少,过去只是让你导入一个高度图,然后在上面放一层基本纹理和一细节纹理,在1.7版本的Ogre后,里面单独加入了terrain的模块,在地形的支持上已经非常强大,关于新 ...

  7. 从零开始做3D地图编辑器 基于QT与OGRE

    第一章 基础知识 注:文章里面有不少个人见解,欢迎大家一起互相讨论.希望高人能给予相应理解与意见建议. 在实际3D游戏开发中,编辑器是极其重要的一个部分,一个优秀健壮的编辑器,可以使项目事半功倍,而相 ...

  8. QT与OGRE做3D地图编辑器

    http://blog.163.com/modingfa_002/blog/static/1109254662010427114343461/ http://download.chinaprj.cn/ ...

  9. 从零开始做3D地图编辑器(基于QT与OGRE)

    第一章 基础知识 注:文章里面有不少个人见解,欢迎大家一起互相讨论.希望高人能给予相应理解与意见建议. 在实际3D游戏开发中,编辑器是极其重要的一个部分,一个优秀健壮的编辑器,可以使项目事半功倍,而相 ...

  10. 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架

    高层游戏引擎--基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...

最新文章

  1. 金九银十征服、阿里、京东、字节跳动,的程序员和他们的公众号
  2. vs shortcut
  3. 念 2013-8-6 (写于爸爸走之后,之七)
  4. 再理解RankNet算法
  5. python爬取音乐神器_Python爬虫提取神器,正则表达式(re模块),全程干货!
  6. 【python】python第二周作业
  7. OPPO正式公布ColorOS 6系统:Reno新机4月10日首发适配
  8. mysql数据库是以表为单位存储的,创建一个以数据库名称为参数的MySQL存储过程,以列出具有特定数据库中详细信息的表。...
  9. 5.UNIX 环境高级编程--标准I/O库
  10. Layer表格复选框,禁止勾选某行
  11. docker-compose进阶
  12. synchronized解析
  13. python下载b站视频_python怎么下载b站视频
  14. 现国内基金定投最好的入门书《指数基金投资指南》
  15. 英文面试常见问题及回答汇总
  16. Nginx 基础配置
  17. 一些离谱的文言文翻译
  18. FPGA_硬件电路(自用)
  19. c语言程序输入与输出函数,C语言printf()和scanf()函数?其实就是输入输出
  20. 云脑启智 开源赋能|2021新一代人工智能院士高峰论坛暨启智开发者大会即将开幕

热门文章

  1. tcp/ip通信第5期之客户机端程序
  2. loadrunner具体实例教你如何进行结果分析
  3. Windows 8 下使用 ScrollViewer 替代 GridView
  4. gridview為什麼分頁後,GridView1_RowDataBound就運行不了
  5. Windows计划任务执行时不显示窗口的问题
  6. 静态代码块、构造代码块以及构造函数的加载顺序
  7. sql 链接 oracle 查询,Oracle学习之路-SQL篇-连接查询
  8. mangodb和php比较,php-mongodb从不同的数据库中选择
  9. python读配置文件转字典_python中读取配置文件的方式
  10. mac搜索不到wifi wtg_如何设置隐藏wifi 防止蹭网隐藏wifi方法【详解】