利用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. [AngularJS + Webpack] Using Webpack for angularjs

    1. Install webpack & angular: npm install webpack angular 2. Create webpack.config.js file: modu ...

  2. 标准I/O库之标准输入、标准输出和标准出错

    对一个进程预定义了三个流,并且这三个流可以自动地被进程使用,它们是:标准输入.标准输出和标注出错.这些流引用的文件与文件描述符STDIN_FILENO.STDOUT_FILENO和STDERR_FIL ...

  3. arcgis通过 Python 使用工具 获得结果信息

    通过 Python 使用工具 ArcGIS 10 每个地理处理工具都具有一组固定的参数,这些参数为工具提供执行所需的信息.工具通常具有定义一个或多个数据集的输入参数,这些数据集一般用于生成新的输出数据 ...

  4. 安卓开发中使用Genymotion模拟器

    在安卓开发中,运行和调试自己所写的安卓程序需要用到模拟器 在一般情况下 是直接在这创建一个模拟器,但是这种自带的模拟器运行效率不佳,而且启动时间漫长 所以,我们可以换一款安卓模拟器 Genymotio ...

  5. Container.ItemIndex 获取到行的序号

    如果在ASP.NET中应用了Repeater.Gridview,想获取到行的序号,很简单,使用Container.ItemIndex即可.在Gridview中使用<%# Container.Da ...

  6. 20151210 Jquery 学习笔记 AJAX 进阶

    一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的问题.而超 过一定时间的请求,用户就会变得不再耐烦而关闭页面.而如果在请求期间能给用户一些提 示,比如:正在努力加 ...

  7. 实现输出h264直播流的rtmp服务器 flash直播服务器

    http://www.cnblogs.com/haibindev/archive/2012/04/16/2450989.html 实现输出h264直播流的rtmp服务器 RTMP(Real Time ...

  8. OC 消息传递机制

    消息传递(message passing)的概念是Smalltalk语言的核心原则之一,有时Smalltalk和Objective-C被称为面向消息的语言,通常“消息”一词的含义和“方法”是相同的. ...

  9. == 和 equals()的区别

    package com.liaojianya.chapter1; /** * This program demonstrates the difference between == and equal ...

  10. Bzoj 3831 [Poi2014]Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...