用OpenGL构造三维地形
来源:华佗健康网
维普资讯 http://www.cqvip.com 山西电子技术 2002年第3期 软件天地 用OpenGL构造三维地形 孙向东 (三益电子计算机公司,山西太原030024) 摘要:地形的构造是绘制三维电子地图的开端,文章介绍了一种先绘制等高线位图,再间接生成不规 网格函数程序 则三维地表模型的方法,对这种方法的编程实现也作了描述。 关键词:地形OpenGL位图 等高线中图分类号:TP391.72 文献标识码:A 引 言 OpenGL是目前最主要的二维和三维交互式图 形应用程序开发环境,强大的图形操作功能使其在 许多领域都有应用,并得到硬件(显卡)厂商的广泛 1 绘制等高线位图 图1就是在“画图”中绘制的512×512像素宽 度的位图,每一种颜色代表一种高度值。为了方便 绘制,颜色的顺序是按照“画图”中“颜料盒”工具条 的缺省顺序来的,黑色最低,白色次低,接着是深 支持。三维电子地图是在计算机系统上构造的三维 真实感地形背景,主要用于三维动画、虚拟现实、军 事模拟训练、游戏等方面。用OpenGL构造三维电子 地图,可以最大限度地利用计算机硬件的功能,达 到连贯平滑的动画效果。但其问的问题在于,真实 地面形状是非常不规则的,往往无法用数学方法得 灰、浅灰,以此类推,共用了16种颜色。 到地形三维坐标。作者在工作中摸索出一种用等高 线位图间接生成复杂地形三维坐标的方法,具体步 骤如下:先绘制出一定幅画(本文设为512×512像 素)的地形等高线位图,位图像素点代表网格状地 形的节点,不同的颜色代表不同的高度;建立程序 读入位图像素颜色值,根据其颜色给每个像素点赋 予高度;对各点高度进行平滑调整;用OpenGL的三 维造型功能建立三维地表形状。 本文程序运行的操作系统是Windows98第二 版,编译环境是VC++6.0,位图的绘制用的是 Windows自带的“画图”工具(mspsint.exe)。本文着 图1 等高线位图 2 构建程序框架 2.1 建立程序工作空间 重于方法的讨论,至于程序编制方面的内容,将力 求简洁,将力求简洁。有关编程的问题和OpenGL函 进入MS VC++6.0编程环境,建立一个空的 工程,类型为“Win32 Console Application”,名称为 “MyTerrain”。给工程中加人一个名为“MyTerrain.c” 数的说明,请参阅MSDN联机文档。 收稿13期:2002—04—09 作者孙向东 男 32岁 工程师 维普资讯 http://www.cqvip.com 4 山西电的源文件,这个文件是我们这个程序所用到的唯一 的一个程序源文件。链接opengl 32.1ib、glaux.1ib三 个函数库,这就完成了程序工作空间的创建工作。 2.2 全局变量与文件包含 将windows.h、g1.h、glu.h、6aux.h等头文件的 包含语句写进MyTerrain.C,然后对一些后面将用到 的函数进行预定义,另将下面的两上函数声明为回 调性质: void CALLBACK Reshape(Glsizei W, Glsizei h);//刷新函数 void CALLBACK DrawScene(void);//绘图函数 接着是一些全局变量的定义,包括:Gllfoat ground[512】[512】(最终的地形数据数组);Gllfoatg hsgnd[512】[512】(水平平滑调整后的高度数组); Glfloat vsgnd[512】[5l2】(垂直平滑调整后的高度数 组),unsigned char horder[512】[5l2】(高度标志值数 组)Gluint list(显示列表号)。 2.3 创建程序运行窗口 本文使用了OpenGL辅助函数库提供的函数来 初始化0penGL和创建程序运行窗口,这些都在 main()函数中进行: int main(int argc,char-k-k argv) {//设置显示模式 auxlnitDisplayMode(AUX—RGBA I AUX— DEPTHIAUX—DOUBLE); auxInitP0sition(O,0,400,300); //设置窗口 起始位置和大小 auxInitWindow(”OpenGL三维地形”);//创建窗 口 Init(); //地形数据初始化 auxReshapeFunc(Reshape); //刷新回调函数 auxMainLoop(DrawScene); //主回调函数 return0; //程序结束 l 2.4 绘图 main()函数中的auxReshapeFunc()和auxMain— Loop()用于设置刷新回调用函数和主回调函数。当 窗口发生移动、缩放等事件时,调用Reshape()回调 函数重设绘图区和投影模式。本程序任务简单,用 glPerspective()函数重设透视投影模式。DrawScene ()中应包含下面两句: g|uLookAt(一3500.0, 2222.0, 3500.0,一 1000.0,0.0,1000.0,0.0,1.0,0.0); 子技术 2002 年 glCallList(1ist);//调用显示列表 gluLookAt()设置观察点和观察方向,观察者位 于空间坐标x=一3500,Y=2000,z=3500)处,视线 投向空间坐标(x=一1000,Y=0,z=1000)处,向上 矢量映射到正Y轴方向;glCallLiat()函数调用了一 个在图形初始化时生成的显示列表(见下),执行所 有的地形绘制工作。 3 图形初始化 3.1 读入位图 图形初始化工作由Init()函数来完成。其中包 含一个OpenGL辅助函数库中的auxDIBImageLoad ()函数,它专门用来装入位图数据,其参数是位图文 件名字符串,返回一个指向位图文件中颜色数据区 起始点的指针。有了这个指针,就可以读人等高线 位图中的像素颜色数据,为不同颜色的像素赋予不 同的高度标志值,然后将这些数值按顺序存人 horder数组。本文所用的颜色为l6种,高度标志值 范围是0—15。 3.2 平滑调整 程序中只使用了l6种颜色来标识高度,对于自 然界的复杂地貌来说,这显然是不够的。如果对这 些高度值不进行平滑运算的话,构成的将是梯田式 的地形,许多场合中,这并不能满足我们的需要。本 文使用了一种相对简单的平滑运算方法,对horder 数级进行行方向和列方向两次扫描,分别进行平滑 运算,求平均值。这种方法运算简单,效果不错。 假设horder数组中某一行开始的几个数据是这 样的: 垒l 0 l I 1 l 1 I l 2 l 2 l 2 I l…’ 加双下划线的数据被称作转折点,按从左向右 (数组列标从小到大)的顺序,是相同数值的一组数 据中的第一个。作平滑运算时,转折点的数据保持 不变,转折点之间的数据按与转折点的距离作线性 增减。设t。、t:是两个转折点,a 、a2是这两点之间的2 个数据,则: a1=t2一(t2一t1)/3 a2=t2—2(t2一t1)/3 上面的那组数据运算后就是t 1 0.5l I1.33l 1.67l l 2.55I2・75 l I… 图2是关于这种运算方法的更为直观的表述, 实线代表原来的地形轮廓,虚线是运算后的地形轮 维普资讯 http://www.cqvip.com 第 3 期 孙向东:用OpenGL构造三维地形 5 廓。经过对horder数组中行向量和列向量的两次同 理运算后,形成两个高度数组,求它们的平均值,然 后与一个固定因子(高度间隔,本文为30)相乘得 到最终的高度值,存入ground数组。至于这种运算 方法的编程,这里就不再赘述了。 图2 平滑运算示意 3.3 显示列表 OpenGL中的显示列表可以极大地提高程序执 行的效率。Init()函数的最后产生一个标号为list的 显示列表,前面所讲的glCallList()函数调用是就是 它,其中执行的工作是画一个网格状的地形。网格 图3 最终结果 5 结束语 本文采用的一些参数均是可以根据不同需要而 改变的,如高率间隔、网格间隔、位图幅画、颜色数 量,改变它们可以改变三维地形的大小和分辨率方 面的特性。由于等高线位图可以根据真实自然景观 或按各自不同的特殊需要(如游戏中的虚拟场景)绘 制,所以本文所介绍的方法可以应用的领域是比较 广的。 节点的X和z坐标由ground数组行列标号分别与 一个固定因子(网格间隔,本文为10)相乘得来,Y 坐标由ground数组中相应行列标号对应的元素值 得来。另外,为了使最终的显示结果能清楚地表示 出地形的上下起伏,本文使用了不同的颜色灰度值 (红绿蓝三色同值)来绘制不同高度的网格节点。 4 结果显示 将程序编译运行,一个包含三维地形图象的窗 这里讨论的是如何生成不规则地表形状的方 法,这是构造一个与自然贴近的三维电子地图的开 端。在此基础上进行纹理贴图,并加入诸如树木、河 口即可在计算机屏幕上显示出来,如图3所示。由 于我们定义的网格间隔是10,高度间隔是30,长宽 流、建筑等各种形状的地物模型,就可构成一幅真正 的三维电子地图。 参考文献 方向的网格节点数均为5l2,高度分为l6个等级, 所以生成的是一个长度宽度均为5 ll0,高度为450 的三维地表模型。 1 贾志刚.精通OpenGL[M】.北京:电子工业出 版社,1998. Constructing 3D Terrain by OpenGL Sun Xiangdong r Sanyi Electronic Computer Company,Taiyuan Shanxi 030024,ChinaJ n of drawing a 3D electronic map,this paper introduces a method of Abstract:The buildof terrain is the begi.creating 3D terrain,which is preceded by painting contours in a bitmap,and describes the program resolution of the method. Key words:terrain;OpenGL;bitmap;contour;mesh;function;program
因篇幅问题不能全部显示,请点此查看更多更全内容