利用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实现简单地形的更多相关文章

  1. Directx11学习笔记【十三】 实现一个简单地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5510294.html 上一个教程我们实现了渲染一个会旋转的立方体, ...

  2. 转:Ogre TerrainGroup地形赏析

    1.1  参考 http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Ogre+Terrain+System http://www.ogre3d.org ...

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

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

  4. Ogre 1.8 terrain 和 paging 组件

    以下转自:http://hi.baidu.com/xocoder/item/e8d87cf53d87612b753c4cfd OGRE地形生成 OGRE可以通过两个接口来生成地形,分别是void Te ...

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

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

  6. Directx11学习笔记【二十二】 用高度图实现地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...

  7. Directx教程(29) 简单的光照模型(8)

    原文:Directx教程(29) 简单的光照模型(8)      现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...

  8. Directx11学习笔记【十五】 基本几何体的绘制

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5573970.html 前面实现简单地形的教程,我们只是绘制了一个网 ...

  9. Unity 个人用过的地面检测方案总结

    Unity 个人用过的地面检测方案总结 1.普通射线 在角色坐标(一般是脚底),发射一根向下的射线,长度大约为0.2, 只适用于简单地形,实际使用中常常遇到以下问题 用的collider去碰撞地面时, ...

随机推荐

  1. Jmail的邮件发送

    下载注册dll文件 1. dll文件下载 2.到jmail.dll所在目录,运行cmd regsvr32 目录/jmail.dll 3.c#程序中,行首引用代码 using jmail C#示例代码 ...

  2. WEB网站常见受攻击方式及解决办法

    一个网站建立以后,如果不注意安全方面的问题,很容易被人攻击,下面就讨论一下几种漏洞情况和防止攻击的办法. 一.跨站脚本攻击(XSS) 跨站脚本攻击(XSS,Cross-site scripting)是 ...

  3. c# 枚举基础有[flags]和没有的的区别

    枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性.在 C# 中,使用 enum 来声明枚举. 枚举分为简单枚举和标志枚举两种. 基本语法示例 enum Day { Sun, Mon ...

  4. Adapter 适配器模式

    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可 ...

  5. 11.13 noip模拟试题

    题目名称 笔记 括号 城堡可执行文件名 note brackets castle输入文件名 note.in brackets.in castle.in输出文件名 note.in brackets.ou ...

  6. C# 调用Java Webservice 加入SoapHeader 验证信息

    C#调用java 编写的webservice时不会自动生成 soapheader 类接口的,需要改动Reference.cs. 在生成的代理类referende.cs中进行如下操作: 一.在声明pub ...

  7. updatepannel的使用

    注意:放在updatepannel中的数据,单击事件之后,只重新加载后台数据,不加载前台数据,所以如果页面上有js的插件,对js插件的引用和赋值不要放在updatepannel中,同时尽量减小upda ...

  8. 使用Azure Redis Cache

    通过上一篇博客<Redis Cache 简介>我们已经简单了解了Azure Redis Cache,这里就不过多赘述了. 1.创建Redis Cache 创建Redis Cache之前,我 ...

  9. ios Using CocoaPods to Modularize a Big iOS App->使用CocoaPods来进行模块化开发

    Selecting the right architecture for your mobile app is a pretty big deal. It will shape your daily ...

  10. 关于使用cocoaPods,import导入时第三方库头文件没有提示问题的解决办法

    估计有很多朋友在使用Xcode在项目中导入第三方库时,使用的是cocoaPods,但是在项目中使用此第三方库导入头文件时,输入#import后,并不会联想第三方库头文件(XXXX.h),需要我们手动输 ...