Ogre实现简单地形
利用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实现简单地形相关推荐
- FX粒子(Niagara系统)、顶点法线材质函数、材质参数集——雪和简单地形材质积雪效果
雪 一.利用FX--Niagara系统创建粒子,模板选择 喷泉粒子模板 二.删除不需要的模块 球体位置发射.初始的向上速度.拖拽等和雪无关的模块删除. 三.添加需要的模块并设置 需要大范围降 ...
- unity3d创建简单地形遇到的那些坑
unity是一款游戏编辑器,可以实现2d和3d游戏的编写,重要的是,他不需要很高的编程水平,会使用简单的c#就可以设计出高质量的游戏,而这篇文章将用来记载我在创建第一个3d地图中的点点嘀嘀. 一:关于 ...
- Ogre 编辑器二(用Ogre的地形组件加载天龙八部地形)
主界面如上文设计完成后,场景刚开始添加了是Ogre例子里的,发现场景里实物太少,于是想到直接把天龙的场景拿下来,天龙网上有源码,参考了下,把天龙的地形用Ogre的地形组件完成了下,如下是效果图: 因为 ...
- 【Ogre编程入门与进阶】第八章 地形、天空与雾化效果
转载自:http://blog.csdn.net/zhanghua1816/article/details/18195357 在一款完整的3D游戏或是三维动画中,大地和天空都是构建场景时不可缺少的元素 ...
- Ogre基础教程3:地形,天空,烟雾
本教程将专注于在一个场景中渲染地形. 我们将涉及到需要被完成的基本设置,并且将介绍地形光照的使用. 我们也会给出对使用天空盒(Skyboxes).天空穹顶(Skydomes)以及天空面(Skyplan ...
- Ogre1.7的地形、天空与雾
地形 ogre过去在地形的支持上很少,过去只是让你导入一个高度图,然后在上面放一层基本纹理和一细节纹理,在1.7版本的Ogre后,里面单独加入了terrain的模块,在地形的支持上已经非常强大,关于新 ...
- 从零开始做3D地图编辑器 基于QT与OGRE
第一章 基础知识 注:文章里面有不少个人见解,欢迎大家一起互相讨论.希望高人能给予相应理解与意见建议. 在实际3D游戏开发中,编辑器是极其重要的一个部分,一个优秀健壮的编辑器,可以使项目事半功倍,而相 ...
- QT与OGRE做3D地图编辑器
http://blog.163.com/modingfa_002/blog/static/1109254662010427114343461/ http://download.chinaprj.cn/ ...
- 从零开始做3D地图编辑器(基于QT与OGRE)
第一章 基础知识 注:文章里面有不少个人见解,欢迎大家一起互相讨论.希望高人能给予相应理解与意见建议. 在实际3D游戏开发中,编辑器是极其重要的一个部分,一个优秀健壮的编辑器,可以使项目事半功倍,而相 ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎--基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
最新文章
- 金九银十征服、阿里、京东、字节跳动,的程序员和他们的公众号
- vs shortcut
- 念 2013-8-6 (写于爸爸走之后,之七)
- 再理解RankNet算法
- python爬取音乐神器_Python爬虫提取神器,正则表达式(re模块),全程干货!
- 【python】python第二周作业
- OPPO正式公布ColorOS 6系统:Reno新机4月10日首发适配
- mysql数据库是以表为单位存储的,创建一个以数据库名称为参数的MySQL存储过程,以列出具有特定数据库中详细信息的表。...
- 5.UNIX 环境高级编程--标准I/O库
- Layer表格复选框,禁止勾选某行
- docker-compose进阶
- synchronized解析
- python下载b站视频_python怎么下载b站视频
- 现国内基金定投最好的入门书《指数基金投资指南》
- 英文面试常见问题及回答汇总
- Nginx 基础配置
- 一些离谱的文言文翻译
- FPGA_硬件电路(自用)
- c语言程序输入与输出函数,C语言printf()和scanf()函数?其实就是输入输出
- 云脑启智 开源赋能|2021新一代人工智能院士高峰论坛暨启智开发者大会即将开幕
热门文章
- tcp/ip通信第5期之客户机端程序
- loadrunner具体实例教你如何进行结果分析
- Windows 8 下使用 ScrollViewer 替代 GridView
- gridview為什麼分頁後,GridView1_RowDataBound就運行不了
- Windows计划任务执行时不显示窗口的问题
- 静态代码块、构造代码块以及构造函数的加载顺序
- sql 链接 oracle 查询,Oracle学习之路-SQL篇-连接查询
- mangodb和php比较,php-mongodb从不同的数据库中选择
- python读配置文件转字典_python中读取配置文件的方式
- mac搜索不到wifi wtg_如何设置隐藏wifi 防止蹭网隐藏wifi方法【详解】