・32・ 机械工程与自动化 2007年第6期 件,将两 、文件拷贝到当前工程目录中.在考U始化函 数Init中加入“Model—GI 3DS initialize—ZhuanXJ ()”,GI 3DS initialize—ZhuanXJ()函数应用显示列表 凸的高低,将位图保存为长宽为2的幂,如64×64。 (2)渎取位图颜色值。由于Windows位图的颜色 是BGR顺序存储的,在存储颜色数值之前,需要将B 技术完成了转向架的绘制。其定义在文件ZhuanXJ.h 中给出;最后在绘制函数中采用glCall[ ist(Mode1)程 值和R值交换,使颜色存储顺序为RGB顺序。其关键 程序如下: //实现各像素中R、B成分的交换 for(Index一0:lndex<CbitmaplnfoHeader— ̄>biSizelmage; Index+一3) 序完成整个转向架的导人和绘制工作。 1.3特殊建模 1.3.1地形的生成 在三维场景的仿真中,地形模拟是其中重要的环 节之一,常用的地形建模方法有真实地形和模拟地形 两种。真实地形一般采用数字高程模型(Digital Elevation Model,VEM)方法,这种方法生成的地形真 { tempRGB=bitImage[I【ldex]; bitlmage[Index]=bitlmage[Index-k23; bitlmage[Index+2]--_tempRGB; ) 实度高,但数据结构复杂,数据获取费用昂贵,图形 生成速度慢。模拟地形一般采用随机生成地形或采用 分形法生成地形,这两种方法生成速度快,但很难生 成用户需要的地形特征。 鉴于以上各种地形建模的优缺点,本文采用基于 (3)建立颜色值与高程的对应关系,求出各网格 点三维坐标值,用OpenGI 绘图函数绘出三维地形。 主要程序如下: for(int z一0:z<MAP…Z;Z++) { for(int X-二0;X<MAP—X;x++) 位图颜色值生成地形高程的建模方法。首先获取一张 用颜色代表高程的地形图(这里采用黑白颜色描绘的 位图),用经纬度线将地形图网格化,并获取对应网格 { g—terrain[x-kMAP~z*z]EO2=float(x)*MAP—SCALE; //建立颜色值与高程值的对应关系 点的颜色值,其中经纬度是因变量,颜色值随经纬度 的变化而变化;各网格点颜色值获取后可根据函数关 g—terrainIx+MAP~z*z]E1]一(float)(g~imageDataE(z*MAP~z+ x)*3]~g—imageData[0]); g terrain[x+MAP~z*z][2]=float(z)*MAP—SCALE; } ) 系式计算出相应高程值,经纬度线用 、z坐标值表 示,高程值用Y坐标值表示,(z,Y,z)即为各网格点坐 标值;求出各网格值(z,Y,z),即获得了地形各网格点 (4)加入光照模型、纹理细节等,使三维地形更 逼真。 图2是应用基于位图颜色值生成的海域地形图 三维坐标值,应用OpenGL绘图函数将各网格点用三 角面片连接起来可得到二维地形位图对应的三维地 形。该方法生成速度快,而且可以根据用户对地形特 (图2(b)、2(c)J3n人了简单桥梁)。图2(a)是黑白位图, 图2(b)是图2(a)对应的地形图,图2(c)是加入了海 征的要求生成各种三维地形。具体实现步骤如下: (1)用Photoshop等绘图软件绘制一幅黑白位 图,其中黑的程度代表地形凹的深浅,白的程度代表 水纹理后的海域图。同样,其它如丘陵、大山等地形 也可应用该方法生成。只需要绘制不同的黑白位图,贴 上相应的纹理即可。 . .置 ; _ _ _ _ ?■ ■ (a)64X64位圆 (b)地形图 f c)海域 图2基于位图颜色值生成的海域地形图 1.3.2透明贴图法建模 所谓透明贴图法就是只将一幅图中需要的部分重 叠到背景图像上。它应用RGBA颜色模式中的Alpha 通道(Alpha值表示不透明度),通过进行Alpha测试 在三维场景建模过程中,还有一种特殊的建模方 法——透明贴图法建模。在列车运行场景仿真中,树 木、雪花的建模可以通过将处理后的位图贴到相应的 平面上来完成。 来确定接受或放弃一个片段值。其具体实现的方法是: 首先为一幅图的不同部分设置不同的Alpha值,为方 维普资讯 http://www.cqvip.com
2007年第6期 曾晓芳,等:三维场景图形建模和场帚对象管理方法 ・33・ 便起见用Photoshop等绘图软件将图中不需要的部分 运行场景仿真系统中,将各种线路和地形场景组合构 描成单一颜色,并将其Alpha值设为0(表示透明),将 成多种场景模块.这些模块也就是用来构成列车运行 图中需要的部分的Alpha值设为1(表示不透明);再 场景的场景对象.整个场景由场景对象链式连接而成。 用glAlpha()函数设置Alpha测试条件;最后利用 用户可任意铺设场景,系统记录下每一场景对象的相 Alpha信息、深度信息、场景和绘制条件等进行处理, 关信息,如每个场景对象起点坐标、方位等,随着列 最终将需要部分显现出来。以下是给位图设置不同 车的运行,系统可通过判断各场景对象与视点的距离 Alpha值的关键程序: 来确定是否绘出该场景(视点可在列车附近漫游)。远 for(unsigned int sr ̄一0,dst一0;src<bitmaplnfoHeader一> 离视点位置的场景对象将被淘汰。由于各场景对象可 biSizeImage;src+一3,dst+=4) 近似为在一个平面上,测试球可进一步简化为水平的 { 测试圆。很显然,场景对象淘汰可提高仿真的实时性, //如果颜色值是黑色的(0,0.O).将Alpha值设为0;否则Alpha 改进渲染性能。 值设为255。 3 总结 jf(bjtmap1mage[src]一=o&g bitmapImage[src+1]=一O&&bitmapImage[src+2]一一o) ()penGI 作为一个性能优越的图形应用程序设计 bitmapWithAlpha[dst+3]一0; 界面,已成为目前的三维图形开发标准,能实现高性 else 能的三维绘图功能。本文在VC++6.0/WindowsXP环 bitmapWithAlpha[dst+3]=0xFF; 境下,以OpenGI 作为三维绘图工具,完成了对列车 bitmapWithAlpha[dst]一bitmapImage[src]; 运行场景的生成和管理。图4为截取的部分列车运行 bitmapWithAlpha[dst+1]一bitmapImage[src+1]; 三维场景效果图。 bitmapWithAlpha[dst+2]一bitmapImage[sre+2]; ) 图3是用透明贴图法生成的列车头(正面观看)、 树木(应用十字交叉法)的效果图。 )列车通过海域 (b)列车通过丘陵 图4 列车运行三维场景效果图 参考文献: [1]潇湘工作室.OpenGL超级宝典[M].北京:人民邮电出版 图3列车头、树木的效果图 社,2001. 2场景对象管理 [2] 和平鸽工作室.OpenGL高级编程与可视化系统开发 三维场景往往由多个对象组成,当对象数目很多 [M].北京:中国水利水电出版社,2003. 时,如果每一帧都将所有场景对象绘出,这势必会影 [3]范乃梅,熊坤.基于OpenGL的三维地形的生成与简化 响整个场景的渲染速度。如果能够以某种方式确定哪 [J].郑州轻工业学院学报(自然科学版),2006(5):84—87. 些模型看不到,不把它们发送到OpenGI ,就能节省大 [42 吕希奎,韩峰.韩春华.线路三维仿真系统中对称物的简 量的处理时间。本设计以视点为中心设置了一个测试 化绘制方法口].兰州交通大学学报(自然科学版),2004 (6):3O一33. 球体,场景在球体内则绘出,否则淘汰。在列车虚拟 GraphiC Modeling of 3D Scene and Method of Model Management Based on OpenGL ZENG Xiao-fang.XIAO Shi—de,YU Xiao-ming (Southwest Jiaotong University,Chengdu 610031,China) Abstract:In the 3D scene simulation,graphic modeling is the prime part.In this paper,the 3D scene simulation of train movement is taken as an example tO present the methods and principles of graphic modeling.This paper has also given a valid way of managing 3D scene models. Key words:OpenGI ;graphic modeling;model management
因篇幅问题不能全部显示,请点此查看更多更全内容