地形系统在3d程序中是一个重要的部分,这里介绍一下我正在使用的一个简单的地形类.地形数据可以保存在一张灰度图里面,所谓的灰度图就是一张只有黑色和白色的图片,使用颜色深度代表数据大小.我们可以读取出图片上每个像素的颜色值作为地图中某个位置的高度,下面是地形网格投影在平面上的样子
嗯,也可以用三角形网格组织,我的地形类用的就是三角面.
看一下加载数据的方法:
Terrain::Terrain(const char* strName,BYTE* pHeightMap) {
int nSize=MAP_SIZE * MAP_SIZE;//地图大小平方
FILE *pFile = NULL;
pFile = fopen( strName, "rb" );
if ( pFile == NULL )
return;
fread( pHeightMap, 1, nSize, pFile );
int result = ferror( pFile );
if (result)
return;
fclose(pFile);
vertice=0;
normal=1;
texcood=2;
vbos=new GLuint[3];
int nums=6*(MAP_SIZE-STEP_SIZE)*(MAP_SIZE-STEP_SIZE)/(STEP_SIZE*STEP_SIZE);
vertics=new GLfloat[nums*3];
normals=new GLfloat[nums*3];
texCoods=new GLfloat[nums*2];
planarNum=2*(MAP_SIZE-STEP_SIZE)*(MAP_SIZE-STEP_SIZE)/(STEP_SIZE*STEP_SIZE);
terrainPlanar=new Planar*[planarNum];//保存网格平面方程
}
其中的terrainPlanar用于储存平面信息,这些信息将会用于之后的地形漫游方法中.