基于OPENGL的三维地形的生成实现

2014-11-07 23:38马蕾龚戈淬
科技资讯 2014年11期
关键词:计算机图形学

马蕾 龚戈淬

摘 要:随着计算机图形学的发展,其在科学、工程、医学、娱乐、广告、图形艺术等众多领域得到了普遍应用。我们可以通过图形应用程序来虚拟现实,以及GIS领域方面的遥感图像信息系统的应用。为了逐步实现以上目标的应用,本文将以一个基于OPENGL的,使用高度图(Heightmap)进行地形(Terraain)生成及在此基础上的应用为实例,对系统的需求、算法、优化进行了详细的介绍,并给出了可行的解决方法。

关键词:计算机图形学 HeightMap OPENGL Terrain

中图分类号:G64 文献标识码:A 文章编号:1672-3791(2014)04(b)-0005-02

Abstract:With Computer Graphics is that figures study developments, its at science, numerous fieldses last general application at art, etc.s figures advertisements amusements medical sciences projects. We come virtual reality, and GIS the remote sensing picture the applications of information systems of field through figure application program. At application that realize the goal of the above progressively, this text at one a piece of one that is because of OPENGLs, The topography( Terraain) is produced and the application on the basis of this is the instance to use and highly pursue( Heightmap) to carry on , Demand, algorithm, optimize and introduce detailed one in system, besides, Have carried on brief analysis to some technological questions that are met in the course of developping, Give and publish feasible solution is from realizing angle explain figure the development and use the prospects of application program.

Key Words:Computer Graphics;HeightMap;OPENGL;Terrain

今天,对许多人而言,计算机和计算机图形学已经成为日常生活不可分割的一部分。计算机图形学在科学、工程、医学、娱乐、广告、图形艺术、商业、教育和培训等众多领域得到了普遍的应用。开发高性能的图形应用程序,就不可避免的使用到计算机图形学知识。计算机图形学是一门复杂而又多样化的技术。要想了解这项技术,必须把它分成几个易于操作的部分:如何在计算机中表示图形、如何准备图形的数据、如何显示已准备好的图形、如何实现人与图形的交互。这里,图形是一个广义的概念,凡是可以在图形设备上输出的点、线和文本等的集合都可以称为图形。

尽管许多算法以多边形或边作为图形的数据输入,但多边形或边最终都可以用点来表示。因此,点才是图形的基本组成元素。而曲线通常是通过段直线逼近来实现。至于材料纹理的表示子相当复杂,在许多情况下要使用曲线和点阵。本质上讲,材料纹理还是用算法描述下的点、线的集合来表示的。

OPENGL实际上是一个开放的针对图形硬件的三维图形软件包,它独立如窗口系统和操作系统,以它为基础开发的应用程序可以十分方便的在各种平台间移植;从程序员的角度来看,OpenGL实际上是一些指令和函数的集合,现在已经能够在多种平台上使用。

OpenGL自1992年出现以来,逐渐成为工业上应用最广泛的支持2D和3D图形的应用程序编程接口,并且出现了成千上万的基于各种计算机平台的应用程序。OpenGL通过集成大量的渲染、纹理映射、特殊效果和其他强大的可视化函数,使得其应用程序更加新颖,并大幅度加速了图形应用程序的开发。

1 OpenGL图形操作步骤

在OpenGL中进行主要的图形操作基本步骤如下:

首先根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述(OpenGL中把:点、线、多边形、图像和位图都作为基本图形单元)。然后把景物模型放在三维空间中的合适的位置,并且设置视点(viewpoint)以观察所感兴趣的景观。接着,计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定光照条件、纹理粘贴方式等。最后把景物模型的数学描述及其色彩信息转换至计算机屏幕上的象素,这个过程也就是光栅化(rasterization)。

在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。

2 地形生成实现

在进行三维图形编程的过程中,会遇到各种各样的图形格式,下面以TGA格式为例进行分析其处理过程:

首先需要处理TGA图形文件头信息,这其中包括从文件读取12字节的头、判断该TGA文件是否是压缩类型、最后通过fread(header, sizeof(header),1, file)函数将文件头信息读取header变量中。

接着通过获取的头文件信息来得到TGA文件的宽和高。

m_width=header[1]*256+header[0];

m_height=header[3]*256+header[2];

通过高和宽以及文件的位数(24位和32位)来判断该TGA文件是否是正确的文件格式。

// Is the width less than or equal to zero?

// Is the height less than or equal to zero?

// Is the TGA 24 or 32 bits?

if (m_width<=0 || m_height<=0 || (header[4]!=24 && header[4]!=32))

为TGA文件分配内存空间

// Divide by 8 to get the bytes per pixel

BytesPerPixel = m_bpp / 8;

// Calculate the memory required for the TGA data

ImageSize = m_width * m_height * BytesPerPixel;

// Allocate memory to hold the TGA data

m_data = new GLubyte [ImageSize];

最后读取不同TGA形式的数据内容存入到m_data变量中,关闭文件文件操作,对获取的数据进行纹理渲染。

3 使用高度图进行地形渲染

高度图,即一个给定大小的位图,已知点像素的颜色表明地形的高度。一般情况黑色可能是最低的高度,白色表明高度图中最高的点。

第一步加载高度图,将高度图数据被存入变量heightmap,从而使用heigthmap中的数据计算高度地形。

第二步利用加载的高度图,计算3D网格,即高度地形。

高度地形由一个顶点数组和一个索引数组组成,因此能够用索引化的三角形渲染地形。顶点结构如下:

struct Vertex

{

float x,y,z;

DWORD color;

float u, v;

};

第三步把高度图数据传递给负责用来生成3D地形CalculateHeightfield变量。通过为顶点分配空间并清空分配的内存。然后通过X和Z顶点进行计算纹理,获得Y坐标,通过从高度图得到当前像素值和比例因子的一半相乘来完成。

计算索引可以提高渲染期间性能,具体公式如图1所示。

首先沿着X轴(列)然后沿着Z轴(行)。计算两个连在一起生成一个方块的三角形的索引,如图1。第一个三角形是由cy,cv+1,cy+size构成,从而cv,triangle的值。当前的顶点(cy)是2因为z=0和x=2,然后(0*size+2)=2。因此第一个三角形看上去就像这:(cy,cv+1,cy+size)就是(2,2+1,128+2)或者(2,3,130)。

最后利用OpenGL的顶点数组来渲染我们的地形,渲染的代码和效果图如图2所示。

void __fastcall Terrain::Render()

{

// Enable using Vertex Arrays

glEnableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

// Set the Vertex Array to the start of our vertex data

glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &Vertices[0].posx);

glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &Vertices[0].u);

// Render the Terrain

glDrawElements(GL_TRIANGLES, NumIndices, GL_UNSIGNED_SHORT, Indices);

// Disable Vertex Arrays

glDisableClientState(GL_VERTEX_ARRAY);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);

}

4 结语

基于OpenGL的计算机三维图形应用程序的开发,是一项细致而又复杂的技术。本文首先对图像进行建模,从而生成各种类型图形文件,并以TGA格式为例进行渲染,然后使用高度图进行地形渲染,生成漂亮的地形图。

参考文献

[1] 尚游,陈岩涛.OpenGL图形程序设计指南[M].中国水利水电出版社,2001.

[2] OpenGL Architecture Review Board, 著,(美)Dave Shreiner,主编.OpenGL参考手册[M].机械工业出版,2001.

[3] (美)David F. Rogers,著.计算机图形学的算法基础[M].石教英,彭群生,等,译.机械工业出版,2002.

[4] (美)OpenGL体系评审委员会,Masson Woo,等,著.OpenGL编程权威指南[M].吴斌,等,译.机械工业出版,2001.

[5] Stefan R¨ottger Wolfgang Heidrich, Philipp Slusallek, Hans-Peter Seidel《Real-Time Generation of Continuous Levels of Detail for Height Fields》

[6] (美)Richard,S.著OpenGL超级宝典[M].2版.潇湘工作室,译.人民邮电出版社, 2001.

[7] 吴海平.OpenGL图形程序设计与 应用环境[M].国防科技大学出版社,1999.

[8] www.opengl.org OpenGL[EB/OL]. http://www.opengl.org/developers/about/overview.html.

[9] http://www.opengl.org/developers/documentation/glut.html SGI OpenGL Extension Registry - http://oss.sgi.com/projects/ogl-sample/registry/.

[10] www.flipCode.com,日常游戏开发信息及资源网站.

[11] mays.6to23.com,中国游戏开发者.

猜你喜欢
计算机图形学
边标志算法中常见问题及解决方法
计算机图形学教学中的“差别”培养
计算机图形学与图形图像处理技术
用面向科学思维的教学方法改进计算机图形学课程教学
三维投影变换的MATLAB实现
二维离散点集Delaunay三角网生长算法的改进
论数字媒体艺术教育中专业方向细分的必要性
基于计算思维的计算机图形学教学改革与实践
计算机图形学教学改革浅论
多边形裁剪算法实现与改进