第33卷第1期 V01.33 No.1 ・358・ 2 0 0 7年1月 山 西 建 筑 SHANXI ARCHITE 兀瓜E Jan.2007 ・计算机技术与应用・ 文章编号:1009—6825{2007}01—0358-02 基于OpenGL的城市三维模型可视化研究 岳朝瑞 摘要:在介绍基于Ow ̄GL的三维景观显示原理和关键技术的基础上,对地形、地物的可视化进行‘了分析,研究了对三 维场景实时目标选取的方法和技术。 关键词:可视化,三维模型,Ow ̄GL 中图分类号:TP319 文献标识码:A 1 OVenGL的工作流程及三维图像生成原理 现实与虚拟现实的结合。三维景观模型进行可视化的过程,涉及 OpenGL的工作流程图如图1所图。 大量的诸如坐标变换、法向量、反走样、光照、材质、纹理映射等图 形编程细节。下面仅就三维场景的纹理映射、动态漫游和交互操 作的有关技术和实现做一探讨。 2.1 纹理映射 为了能够真实地表现景观特征,必须进行纹理映射。纹理映 射的基本思路是把纹理影像“贴”到由几何数据所构成的三维表 面。纹理映射的关键是实现纹理与几何多边形顶点的三维空间 坐标数据之间的正确对应。纹理贴图的数学过程是十分复杂的, 但Ow ̄GL已对其进行了处理,使编程者可以利用几个函数就可 以完成纹理贴图。执行纹理贴图的步骤可以概括为:定义纹理贴 图1 O0enGL的工作流程图 图,控制纹理,说明纹理贴图方式,定义纹理坐标与几何坐标等。 基于OpenGL构造城市三维景观模拟场景的基本步骤如下: 具体实现如下: 1)数据准备与预处理。用于构造物体三维景观的数据包括 1)定义纹理:纹理可以是一维的也可以是二维的。在图像处 几何数据和纹理数据。几何数据预处理包括DEM数据的改正、 理中,常常采用的是二维纹理。函数glTexlmage2D()定义二维纹 建筑物几何数据的检测等。纹理数据预处理包括影像质量改善、 理贴图,该函数说明所映射的纹理内容,其中包括纹理数据的指 纹理图像格式转化等。 针、纹理的大小、纹理的类别(灰度或彩色)等。 2)设置像素格式。无论进入OpenGL的是何种数据,OpenGL 2)控制纹理:说明纹理图像的纹理以何种方式映射到三维模 最终都将进行像素操作,即把像素写到帧存上去。像素格式告诉 型表面上。OpenGL通过glTexParameter()函数来解决这种映射 OpenGL如何操纵这些像素,如绘制风格、颜色模式、颜色数据的 问题,OpenGL提供了多种映射方式,其中包括纹理滤波、重复与 位数、深度缓存的位数、模板缓存的位数、掩膜的可见性等信息的 缩限等。 设置。 3)说明纹理贴图方式:在进行纹理贴图时,纹理图像可以直 接贴到物体上,从而覆盖原来的颜色,也可以和物体的原有颜色 3)建立模型。根据基本图元(OpenGL中把点、线、多边形、图 像和位图都作为基本的图形单元)建立景观的三维模型,并对所 进行融合。融合是一种重要的图像处理技术,主要用于透明纹理 处理。OpenGL用于纹理贴图方式的函数为glTexEnv()。 建立的模型进行数学描述。 4)舞台处理。把景观模型放在三维空间中合适的位置,设置 ’4)定义三维模型顶点的纹理坐标与几何坐标,绘制场景:几 何坐标决定了顶点在屏幕上的绘制位置,纹理坐标决定纹理图像 三维透视体以观察场景。 中哪一个纹素(纹理图像的像素)赋予该顶点,其调用函数为 — 5)效果处理。赋予物体模型材质(颜色、光照及纹理等),以 增强场景的真实感。 TexCo3rd()。 通过三维模型的构造和真实纹理映射,再经过投影变换、视 6)光栅化。把景物模型的数学描述及其材质信息转换至计 觉变换等操作后就能够获得十分逼真的三维景观模型。 算机屏幕上的像素信息。 2.2三维场景中物体的选择与拾取 2基于OpenGL的三维景观模型显示 应用OpenGL不仅可以控制物体的绘制,还可以对物体进行 城市三维景观系统要求通过视觉变换,可以建立自己的视 标记以区分在指定区域上绘制了哪些物体以及返回绘图信息。 点,指定观察方向、角度及观察范围的大小,通过模型变换,可以 绘制物体是在OpenGL缺省的绘图模式下进行的,而标记物体和 从不同侧面观察三维景观,进行漫游,还希望能够实时地查询到 反馈信息则分别在选择模式和反馈模式下完成。绘图模式、选择 自己感兴趣的区域或某一特定目标的详细信息,如房屋属性等。 模式和反馈模式构成了OpenGL开发三维图形应用程序的基础。 此外,在城市三维场景观中,还可以进行参数化设计,例如将规划 1)选择物体。选择物体事实上是响应OpenGL应用程序的 区中的旧房移去,按给定的参数构建出新的建筑,实现可视真实 一个拾取事件,该事件通常是由鼠标来触发的。为此,应用程序 收稿131 ̄:2006—09—27 .作者简介:岳朝瑞(1980一),男,昆明理工大学地图制图学与地理信息工程专业硕士研究生,云南昆明650093 维普资讯 http://www.cqvip.com
2 第33卷第1期 0 0 7年1月 岳朝瑞:基于OpenGL的城市三维模型可视化研究 ・359・ 必须建立物体的名称,并将名称加以组织。然后当发生拾取事件 息。生成一个记录表示一个物体被命中。一个命中记录由以下 时,就对其进行响应。当拾取一个物体后,就以记录的形式组织 几项组成: 相关信息并返回给应用程序。 a.名称堆栈中名称的个数; 要使用OpenGL的选择机制,首先要在帧缓冲区中绘图,再 b.被命中物体位于视景体内的部分几何顶点的最大和最小 进入选择模式,重新绘制场景。在选择机制下,不会改变帧缓冲 窗口坐标的深度值; 区中的内容,退出这个模式时,OpenGL返回与取景体积相交的几 c.名称堆栈中名称的内容,其顺序是按进入名称堆栈的顺序 何要素列表,即选中了这些几何要素。实际上,这些几何要素是 排列。 以整数数组名称和与当前名称堆栈相应的选中记录的形式返回。 此外,OpenGL的应用函数库定义了两个函数gluUnProject() 在选择模式下,绘制的几何要素被载入名称堆栈,返回名称列表 和gluPmject(),前者把窗I:1坐标映射到物体坐标,后者把由前者 时,可以确定用户选中的几何要素。 获得的物体坐标映射到窗口坐标,这在交互应用中很重要。其函 使用选择机制的基本步骤概括如下:a.创建存储返回命中记 数说明如下: 录的数组,由glSelectBuffer()函数来实现;b.进入选择模式,由 int gluUnPmject(GLdouble winx,GLdouble winy,GLdouble glRenderMode(GL—sELEcT)函数来决定;C.初始化名称堆栈;d. winz, 定义用于选择模式的视景体,拾取区域;e.建立名称堆栈;f.退出 . const GLdouble moddMatrix[16], 选择模式。 const GLdouble pmjMatrix[16], 选择模式是由外部时间来触发的,当退出时就可以决定是否 const GLint viewport[4], 有物体被命中。 GLdouble*0bjx,GLdouble*objy, 其中,名称堆栈可以对物体进行命名,并通过名称堆栈建立 GLdouble*obiz): 物体的名称层次关系,以最终标记物体的各个组成部分。要建立 其中, 名称堆栈,首先应利用gllnitNames()函数初始化名称堆栈,即清 winx,winy,winz:要映射的窗口坐标,winx,wlny可由鼠标从 除名称堆栈,然后将名称压入名称堆栈和弹出名称堆栈。在操作 屏幕获取,winz为深度初值,可以为0.0~1.0之间的任意浮点 名称堆栈时,还可以用指定的名称来替换堆栈顶层中的名称。这 值: 些操作命令有:glPushName将名称推进栈;glPopName将名称弹 ModelMatrix:模型取景矩阵; 出堆栈;glLoadName用不同的名称替换最顶层堆栈的名称 — ProjMatrix:投影矩阵; PnshName()和glLoadName()函数以一个无符号整数为参数,这 Viewlmrt:视见区; 个整数就是物体的名称。可以用glPnshName()/glPopName()函 0bjx,By,0bjz:计算后返回的物体坐标。 数对来建立多层次的名称堆栈。 int gluPmject(GLdouble 0bjx,GLdouble 0bjy,GLdouble 0bjz, 2)拾取物体。拾取是选择处理的一种扩充,利用选择模式可 const GLdouble naodelMatrix[16], 确定是否拾取物体。拾取物体最重要的是要确定鼠标位置所在 cOnst GLdouble pmjMatrix[16], 位置是哪一个物体,这就需要定义一个有效的拾取区域。比如, const GLint viewport[4], 鼠标热点周围的5个像素构成的区域为有效区时,则在此区域外 GLdouble*winx,GLdouble*winy.GLdouble 的物体就不会获得拾取机会。 *winz); 在OpenGL中,拾取物体时利用拾取矩阵和投影变换,将绘 利用gluPmject()函数可以把由gluUnPmject()函数获得的物 图和拾取范围限制在鼠标热点的有效区域中,_旦触发鼠标时间 体坐标objx,objy,objz映射到窗I:1坐标winx,winy,winz。 就进入选择模式并将其初始化,最后利用拾取矩阵拾取有效区的 通过拾取函数与这两个函数结合使用,只要在视图区中利用 物体。有效拾取区的定义由gluPickMatrix()函数来完成,其原型 鼠标移动或左键消息,获取任意模型点的二维坐标信息,再在空 为: 间坐标信息显示窗I:1加上其他消息便能实现所需目标查询的交 'void gluPickMatrix(Gldouble x,Gldouble y,GIdoLible width. 互操作。 Gldouble height,Glint viewport[4]); 参考文献: 其中, [1]费广正.Visual C一6.0高级编程技术——0penGL篇[M].北 X,Y参数为拾取区域的中心,通常就是鼠标热点的窗I=1坐标; 京:中国铁道出版社.2000. width,height参数为拾取区域的宽度和高度; [2]Jeffrey Abouaf Dong Bamard.3DStudio MAX3从入门到精通 viewport参数是存储窗口大小信息的地址,可通过调用以下 [M].希望图书创作室,译.北京:希望电子出版社,2000. 函数得到: [3]张秀山.虚拟现实技术及编程技巧[M].长沙:国防科技大学 void glGetlmegerv(GL—VIEWFORT,GIint*viewport); 出版社.1999. 一旦拾取成功,就以记录的形式返回与拾取物体相关的信 Oppidan three-dimensioned mode visualized research based on OpenGL ⅧE Chao-nli Abstract:Based on the revealing principles and key skills of three-dimensioned sight,it analyses the visualization of terrain and s1lr.face features. researches teh methods and skills of choosing real-time dbj∞t in trhee-dimensioned Scene. Key words:visualization,three-dimensioned mode,OpenGL
因篇幅问题不能全部显示,请点此查看更多更全内容