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 0 class CTerrain :public SimpleRenderable
{
public:
//numVertsPerCol,numVertsPerRow为奇数时m_width,m_depth必定为偶数
CTerrain(int numVertsPerRow=,int numVertsPerCol=,int cellSize=,float heightScal=1.0f);
~CTerrain(); public:
bool InitData();
void LoadHeightmap();
void CreateVertexData();
void CreateIndexData(); // Overridden from MovableObject
virtual Real getBoundingRadius() const;
virtual const AxisAlignedBox& getBoundingBox() const; // Overridden from Renderable
virtual 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-;
m_numCellsPerCol=m_numVertsPerCol-;
m_numVerts=m_numVertsPerRow*m_numVertsPerCol;
m_numTriangles=m_numCellsPerRow*m_numCellsPerCol*;
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=;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=;
mRenderOp.operationType=RenderOperation::OT_TRIANGLE_LIST;
mRenderOp.useIndexes=true;
VertexDeclaration *decl=pVertexData->vertexDeclaration;
VertexBufferBinding *bind=pVertexData->vertexBufferBinding; size_t vOffset=,textCoordSet=;
decl->addElement(,vOffset,VET_FLOAT3,VES_POSITION);
vOffset=vOffset+VertexElement::getTypeSize(VET_FLOAT3);
decl->addElement(,vOffset,VET_COLOUR,VES_DIFFUSE);
vOffset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);
decl->addElement(,vOffset,VET_FLOAT2,VES_TEXTURE_COORDINATES,textCoordSet++);
vOffset=vOffset+VertexElement::getTypeSize(VET_FLOAT2);
decl->addElement(,vOffset,VET_FLOAT2,VES_TEXTURE_COORDINATES,textCoordSet++); HardwareVertexBufferSharedPtr pVerBuff;
pVerBuff=HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(),m_numVerts,HardwareBuffer::HBU_STATIC_WRITE_ONLY,false); float *pLock=static_cast<float *>(pVerBuff->lock(,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=;
start_x=-m_width/;
end_x=-start_x;
start_z=-m_depth/;
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=,c=;
char tmepChar[]={};
for (float z=start_z;z<=end_z;z+=m_cellSize)
{
tu=h*m_cellSize/(float)m_width;
h++;
c=;
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(,pVerBuff); if (m_bSaveData&&bopen)
of.close(); float boxHeght=20.0f;
float vertices[][] = {
start_x, boxHeght, start_z, // A
-start_x, boxHeght, start_z, // B
start_x, boxHeght, -start_z, // C
-start_x, boxHeght, -start_z, // D start_x, boxHeght, start_z, // A
-start_x, boxHeght, start_z, // B
start_x, boxHeght, -start_z, // C
-start_x, boxHeght, -start_z, // D
}; for (int i=;i<;i++)
{
mAABB.merge(Ogre::Vector3(vertices[i][], vertices[i][], vertices[i][]));
}
mBoundingRadius = Ogre::Math::boundingRadiusFromAABB(mAABB); }
/*A---------B
- -
- -
- -
C-----------D
*/
void CTerrain::CreateIndexData()
{
mRenderOp.indexData=new IndexData();
pIndexData=mRenderOp.indexData;
pIndexData->indexStart=;
pIndexData->indexCount=m_numTriangles*;
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(, 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[]={};
unsigned short uvalue[];
int index=; for (unsigned short row=;row<m_numCellsPerCol;row++)
{
for (unsigned short col=;col<m_numCellsPerRow;col++)
{
//ACB
uvalue[]=row*m_numVertsPerRow+col;
*pIndexLock=uvalue[];
pIndexLock++;
uvalue[]=(row+)*m_numVertsPerRow+col;
*pIndexLock=uvalue[];
pIndexLock++;
uvalue[]=row*m_numVertsPerRow+col+;//
*pIndexLock=uvalue[];
pIndexLock++;
//CDB
uvalue[]=uvalue[];
uvalue[]=uvalue[];
uvalue[]=(row+)*m_numVertsPerRow+col+;
*pIndexLock=uvalue[];
pIndexLock++;
*pIndexLock=uvalue[];
pIndexLock++;
*pIndexLock=uvalue[];
pIndexLock++; if (m_bSaveData&&bopen)
{
for (int j=;j<;j++)
{
sprintf(tmepChar,"index%d=%u ",index++,uvalue[j]);
of<<tmepChar;
if (j==)
{
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(,,,1.0f);
pTerrain->InitData();
pTerrain->setMaterial("Examples/Terrain_Material");
SceneNode *node =pSceneManager->getRootSceneNode()->createChildSceneNode("TerrainNode",Vector3(,,));
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.dds
tex_address_mode wrap
}
texture_unit
{
//colour_op_ex add src_texture src_current
//colour_op_multipass_fallback one one texture grass_green-01_diffusespecular.dds
tex_address_mode wrap
}
}
}
}
Ogre实现简单地形的更多相关文章
- Directx11学习笔记【十三】 实现一个简单地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5510294.html 上一个教程我们实现了渲染一个会旋转的立方体, ...
- 转:Ogre TerrainGroup地形赏析
1.1 参考 http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Ogre+Terrain+System http://www.ogre3d.org ...
- Ogre 编辑器二(用Ogre的地形组件加载天龙八部地形)
主界面如上文设计完成后,场景刚开始添加了是Ogre例子里的,发现场景里实物太少,于是想到直接把天龙的场景拿下来,天龙网上有源码,参考了下,把天龙的地形用Ogre的地形组件完成了下,如下是效果图: 因为 ...
- Ogre 1.8 terrain 和 paging 组件
以下转自:http://hi.baidu.com/xocoder/item/e8d87cf53d87612b753c4cfd OGRE地形生成 OGRE可以通过两个接口来生成地形,分别是void Te ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
- Directx11学习笔记【二十二】 用高度图实现地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...
- Directx教程(29) 简单的光照模型(8)
原文:Directx教程(29) 简单的光照模型(8) 现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...
- Directx11学习笔记【十五】 基本几何体的绘制
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5573970.html 前面实现简单地形的教程,我们只是绘制了一个网 ...
- Unity 个人用过的地面检测方案总结
Unity 个人用过的地面检测方案总结 1.普通射线 在角色坐标(一般是脚底),发射一根向下的射线,长度大约为0.2, 只适用于简单地形,实际使用中常常遇到以下问题 用的collider去碰撞地面时, ...
随机推荐
- 高质量CSS编写规范
①id和class的命名在保持语义性的同时尽可能的短.不推荐的写法:#navigation {} .atr {}推荐的写法 : #nav {} .author {}可以缩写单词,但缩写后务必能让人明 ...
- php笔记05:http协议中防盗链技术
倘若我们自己在电脑上写了一个网站文件(可以是html,php文件等等),但是只希望本机可以访问这个文件,不希望别的电脑访问就需要这里的防盗链技术 1.我们在本地写了一个import.php文件: 而且 ...
- iOS之应用内跳转系统设置相关界面
在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...
- 在ModelSim波形图中以参数名显示变量
在ModelSim波形图中以参数名显示变量 在使用Verilog HDL编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示,但当使用ModelSim仿真的时候,状态机变量在wave窗口中以二进 ...
- 自己动手用Javascript写一个无刷新分页控件
.NET技术交流群:337901356 ,欢迎您的加入! 对 于一个用户体验好的网站来说,无刷新技术是很重要的,无刷新,顾名思义,就是局部刷新数据,有用过Asp.net Web Form技术开发网页的 ...
- c# switch case语句
switch是一个控制语句,用于选择一个要执行的语句块. 一个switch语句包括一个或多个执行的语句块.每个语句块包括一个或多个case标签,case后接要执行的语句. 如下面的代码 Codeint ...
- struts2学生信息管理系统篇章②进度报告篇章
之前做这个系统的时候是什么都不懂的! 经过一个月的时间,慢慢的java的知识都捡起来了. 对struts2和mvc模式都有一一定程度的了解,汇报一下上次的进度. 这个系统我所有的功能中我暂时只做到了下 ...
- A Swift Tour(3) - Functions and Closures
Functions and Closures 使用func来声明函数,通过括号参数列表的方式来调用函数,用 --> 来分割函数的返回类型,参数名和类型,例如: func greet(name: ...
- java.lang.NoClassDefFoundError的原因及解决
[O] 安卓应用在低版本(V2.3.6)系统上运行时报错: java.lang.NoClassDefFoundError 完整错误信息如下: 05-29 13:56:13.687: E/Android ...
- Android TabHost的使用
标签显示界面的主要特点是可以在一个窗口中显示多组标签栏的类容. 在Android系统中,每个标签栏称为一个Tab,而包含多个标签栏的内容就称为TabHost. 通过TabHost的继承结构来看,Tab ...