利用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. Windows8下如何使用命令行--转载

    原文地址:http://jingyan.baidu.com/article/a501d80ce26fecec630f5ee0.html 命令行可用于实现一些没有图形界面的操作,然而windows8下的 ...

  2. RPM vs SRPM

    RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的. RPM 是以一种数据库记录的方式来将 ...

  3. [转]内嵌页面iframe以及和其兄弟iframe的相互传值

    原文出处 iframe的调用包括以下几个方面:(调用包含html dom,js全局变量,js方法) 主页面调用iframe: iframe页面调用主页面: 主页面的包含的iframe之间相互调用: 主 ...

  4. tomcat7.0 的配置

    一.安装JDK 1.7 1.添加环境变量:在 我的电脑->属性->高级->环境变量 2.新建系统变量,变量名:JAVA_HOME 变量值:C:\Program Files\Java\ ...

  5. A Swift Tour(4) - Objects and Classes

    Objects and Classes(对象和类) 用 class 关键字后面跟一个类名来创建一个class,在一个类中声明 常亮或变量,他存在于当前类的上下文,函数的方法是同样的 var numbe ...

  6. Log4Net详细配置

    关于Log4Net配置主要分几步 第一步:下载log4net.dll(log4net官网:http://logging.apache.org/log4net/download_log4net.cgi) ...

  7. ios Toll-Free Bridging

    有一些数据类型是能够在 Core Foundation Framework 和 Foundation Framework 之间交换使用的.这意味着,对于同一个数据类型,你既可以将其作为参数传入 Cor ...

  8. 摘录android工具类

    import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.Pac ...

  9. 【Java咬文嚼字】关键字(二):八个基本数据类型

    本次谈谈java中的基本数据类型.java中8个基本数据类型说多不多说少也不少,相对简单的记忆方式:整数型(byte,short,int,long).浮点型(float,double).逻辑型(boo ...

  10. bzoj1231: [Usaco2008 Nov]mixup2 混乱的奶牛

    思路:状压dp,设f[i][j]表示当前已经选出的牛的状态为i,最后一头选出的牛为j的方案数. 然后注意就是初值不能是f[0][i]=1,因为所有牛本来都可以第一个被选中,然而这样一定初值有些牛可能就 ...