《DEM分析与可视化-第5章.ppt》由会员分享,可在线阅读,更多相关《DEM分析与可视化-第5章.ppt(89页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章 地形三维显示的基本理论江文萍武汉大学资源与环境科学学院2015.105-1 三维图形显示流程一、一、OpenGL介绍介绍Open GL(Open Graphics Library)是AT&T公司UNIX软件实验室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft和SGI公司在GL(Graphics Library)的基础上联合推出的三维图形标准,它实际上是一种图形与硬件的接口。OpenGL是开放式图形工业标准,是绘制高真实感三维图形,实现交互式视景仿真和虚拟现实的高性能开发软件包。国内外相继推出专门对OpenGL进行硬件加速的三维图形加速卡,从而为OpenGL提供了广阔
2、应用前景。基于OpenGL进行三维显示和交互,是当前的发展趋势。OpenGL实际上是一种与硬件无关的编程界面,可以建立活动的三维几何对像的交互式程序。它可以在连接各种计算机的网络环境中。它独立于硬件设备、窗口系统和操作系统。作为一种开放的图形标准,用OpenGL编写的软件可以在UNIX系统和Windows 95/NT间实现移植。此外,OpenGL是网络透明的,在客户/服务器(Client/Server)体系结构中,OpenGL允许本地和远程绘图。5-1 三维图形显示流程OpenGL给Windows系统带来了一种新的图形编程模式。使用GDI时,程序员考虑的是如何用画笔或画刷来绘制一幅图片。而Op
3、enGL程序员则将物体在三维场景中分解成为许多多边形,然后让OpenGL在根据光照、阴影、纹理和消去隐藏面等计算后,再生成一幅极其逼真的三维场景图。而且,Windows 95/NT下的OpenGL对工业标准的OpenGL做了扩展。Windows 95/NT环境下的OpenGL包括核心库、实用库、辅助库三部分,共约100多个功能强大的图形函数以及几个WGL函数和Win32函数。其基本功能包括:模型绘制、模型观察、颜色模式的指定、光照应用、图象效果增强、位图及图象处理、纹理映射、多缓存应用、实时动画、交互技术等。利用OpenGL可以创作出高质量的独立于操作系统和硬件平台的三维彩色图形和动画。5-1
4、 三维图形显示流程OpenGL实用库(实用库(GLU)利用较低层OpenGL命令编写一些执行特殊任务的例程,如纹理映射、坐标变换、多边形网格化,NURBS曲线和 曲面等。GLU例程前缀用glu。OpenGL的的XWindow系统扩充(系统扩充(GLX)在使用X Window系统的机器上,提供一种OpenGL现场 (context),并把它与可绘(drawable)窗口关联起来的方法。GLX作为OpenGL的附件提供。GLX利用前缀glx。5-1 三维图形显示流程OpenGL辅助库(辅助库(AuxiliaryLibrary)这个库建立一系列简单而又完整的编程例子,例如初试化窗口、监控输入,以及绘
5、三维对像等。辅助库例程用前缀aux。其它基于其它基于OpenGL的开发工具的开发工具OpenGL InventorOpenGL OptimizerOpenGL PerformerMultigenCreatorVega5-1 三维图形显示流程OpenGL的主要功能1,建模:不但有简单的点线面还提供了复杂的三维物体(球、锥等)以及复杂的曲线曲面(Bezier、Nurbs等)绘制函数;2,变换:主要包括基本变换(平移、旋转等)和投影变换(平行、透视投影等);3,颜色模式设置:RGBA模式、ColorIndex颜色索引;4,光照和材质设置:OpenGL光有辐射光、环境光、漫反射光、镜面光;材质是用光反
6、射率来表示的。场景中物体最终反映到人眼的颜色是光的RGB分量和材质的RGB分量叠加形成的;5,纹理映射:主要表达物体表面的细节;6,位图显示和图像增强:图像功能除了基本的复制和图像象素读写外,还提供融合(Blending)、反走样(Antialiasing)、雾柔化(Fog)等特殊的图像处理效果;5-1 三维图形显示流程7,双缓冲(Double Buffering)动画:双缓冲即前台缓冲和后台缓冲。后台计算场景、产生画面,前台显示后台已经计算好的画面;8,交互技术:主要是提供三种工作模式:绘图模式、选择模式和反馈模式。绘图模式完成场景的绘制,可以借助物体的几何参数及运动控制参数、场景的观察参数
7、、光照参数和材质参数、纹理参数、OpenGL函数的众多常量控制参数、时间参数等和Windows对话框、菜单、外部设备等构成实时交互的程序系统。在选择模式下,则可以对物体进行命名,选择命名的物体,控制对命名的物体的绘制。而反馈模式则给程序设计提供了程序运行的信息,这些信息也可反馈给用户,告诉用户程序的运行状况和监视程序的运行进程。9,其它:利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。5-1 三维图形显示流程OpenGL的基本原理 OpenGL是一个硬件发生器的软件接口,其主要目的是将二维、三维物体绘制到一个帧缓冲里,它包括几百个图形函数。
8、开发者主要利用这些函数来建立三维模型和进行三维实时交互。1,图元操作和指令OpenGL能够从多种可选择的模式画图元,而且一种模式的设置一般不会影响其他模式的设置,无论发生深墨情况,指令总是被顺序处理,也就是说,一个图元必须完全画完之后,后继图元才能影响帧存。2,图形控制OpenGL提供诸如变换矩阵、光照、反走样方法、像素操作等参数来控制二维和三维图形的绘制。它并不提供一个描述或建立复杂几何物体的手段。OpenGL提供的是怎样画复杂物体的机制而非描绘复杂物体本身的面面俱到的工具。即OpenGL是过程性的而非描述性的。3,执行模式OpenGL命令的解释模式是客户/服务器模式的,即由客户发布命令,命
9、令由OpenGL服务器(解释器)来处理,服务器可以运行在客户在相同的或不同的计算机上,基于这一点,OpenGL是网络透明的。5-1 三维图形显示流程OpenGL的命令语法与状态 基于OpenGL 标准的开发的微机应用程序必须在32位Windows平台下,如Windows 98/NT环境,运行时所需的动态连接库为OpenGL32.DLL、Glu32.DLL,OpenGL包含100多个库函数,这些函数按一定的格式来命名。1,核心函数115个每个函数以gl开头,这些函数是最基本的,可以运行在任何工作平台上。这些函数创建二维和三维几何形体,设置视点,建立视觉体,设置颜色及材质,建立灯光、进行纹理映射,
10、反走样,处理融合,雾化场景等,它们可以接受不同的参数因而可派生300多个函数。2,OpenGL实用库函数以glu开头。共43个这些函数基于OpenGL核心函数,主要提供对辅助函数的支持,并且执行了核心OpenGL函数的交互,因而是比核心函数更高一层的函数,也更有通用性。可以运行在任何OpenGL工作平台上。3,辅助库函数,共31个。以aux开头,它们是一类特殊的OpenGL函数,是帮助初学者尽快进入OpenGL编程而做简单练习用的。因此并不能在所有平台上运行。但Windows 98/NT支持它们。4,Windows专用库函数,以wgl开头。主要是连接OpenGL和Windows窗口系统的用它们
11、可以管理着色描述表及显示列表,扩展功能,管理字体位图等。5,Win32 API函数,共6个,用于处理像素格式及缓冲。6,OpenGL结构 共四个。5-1 三维图形显示流程二、从三维空间到二维平面二、从三维空间到二维平面真实世界里,所有物体都是三维的,但是这些三维物体在计算机世界中必须以二维平面物体的形式在屏幕上表现出来。5-1 三维图形显示流程 实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤(括号内表示的是相应的图形学概念):第一步,将相机置于三角架上,让它对准三维景物(视点变换视点变换,Viewing Transformation);第二步,将三维物体放在适当的
12、位置(模型变换模型变换,Modeling Transformation);第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换投影变换,Projection Transformation);第四步,决定二维像片的大小(视口变视口变换换,Viewport Transformation)。这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的计算机屏幕上正确显示了。5-1 三维图形显示流程第一步,视点变换视点变换在视点坐标系中进行。视点坐标系,左手法则世界坐标系,右手法则第二步,模型变换模型变换在世界坐标系中进行对物体进行平移、旋转、缩放第三步,投影变换投影变换类似
13、于选择相机的镜头,定义一个视景体,位于视景体内的物体部分可见,视景体外的部分不可见。第四步,视口变换视口变换 将视景体内的投影的物体显示在二维的视口平面上。这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的计算机屏幕上正确显示了。5-1 三维图形显示流程三、三维图形显示流程三、三维图形显示流程投影变换5-2 基本变换一、几何变换一、几何变换视点变换和模型变换本质上是一回事,即图形学中的几何变换。只是视点变换一般只有平移和旋转,没有比例变换。当视点进行平移或旋转时,视点坐标系中的物体就相当于世界坐标系中做反方向的平移或旋转。1、平移glTranslatefd(x,y,z)
14、将目标分别沿三个轴进行平移2、旋转glRotatefd(angle,x,y,z)将目标沿从点(x,y,z)到原点的方向逆时针旋转角度angle3、缩放和镜像glScalefd(x,y,z)将目标分别沿三个轴向进行缩放5-2 基本变换1、平移2、旋转3、缩放和镜像5-2 基本变换二、投影变换二、投影变换1、正射投影、正射投影(Orthographic Projection)正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物
15、体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。5-2 基本变换void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top);第一个函数,它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近剪取平面是一个矩形,矩形左下角点三维空间坐标是(left,bot
16、tom,-near),右上角点是(right,top,-near);远剪取平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。第二个函数是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-10和10,所有二维物体的Z坐标都为00。因此它的剪取面是一个左下角点为left,bottom)、右上角
17、点为(right,top)的矩形。5-2 基本变换二、投影变换二、投影变换2、透视投影、透视投影(Perspective Projection)透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。5-2 基本变换OpenGL透视投影函数也有两个,函数glFrustum()所形成的视void glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdou
18、ble znear,GLdouble zfar);void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);5-2 基本变换三、剪取变换三、剪取变换在OpngGL中,空间物体的三维剪取变换包括两个部分:视景体剪取和附加面剪取。视景体剪取由投影变换来定义。除了视景体定义的六个剪取平面(上、下、左、右、前、月用户还可以自己再定义一个或多个附加剪取平面,以去掉场景中无关的目标。5-2 基本变换四、视口变换四、视口变换运用相机模拟方式,我们很容易理解视口变换就是类似于照片的放大与缩小。在计算机图形学中
19、,它的定义是将经过几何变换、投影变换和剪取变换后的物体显示于屏幕窗口内指定的区域内,这个区域通常为矩形,称为视口。5-2 基本变换void glViewport(GLint x,GLint y,GLsizei width,GLsizei height);这个函数定义一个视口。函数参数(x,y)是视口在屏幕窗口坐标系中的左下角坐标,参数width和height分别是视口的宽度和高度。缺省时,参数值即(0,0,winWidth,winHeight)指的是屏幕窗口的实际尺寸大小。所有这些值都是以像素为单位,全为整型数。在实际应用中,视口的长宽比率总是等于视景体剪取面的长宽比。如果两个比率不相等,那么
20、投影后的图像显示于视口内时会发生变形。在调用这个函数时,最好实时检测窗口尺寸,及时修正视口的大小保证视口内的图像能随窗口的变化而变化,且不变形。5-3 基本几何图元的显示一、构成三维复杂形体的基本图元一、构成三维复杂形体的基本图元点(顶点)用浮点值表示的点称为顶点(Vertex)。所有顶点都是三维的,用二维坐标(x,y)定义的点,其z值默认为0。为表达复杂目标的真实感图形,在顶点处计算下列属性坐标几何坐标法向坐标颜色坐标纹理坐标5-3 基本几何图元的显示线(Line)线代表线段(Line segment),由一系列顶点顺次连接而成,有闭合和不闭合两种线的几何属性颜色(关闭光照)5-3 基本几何
21、图元的显示面(多边形)(Polygon)多边形是由一系列线段依次连接而成的封闭区域,这些线段不能交叉,区域内不能又空洞,多边形必须是凸多边形,否则就不能被正确显示。多边形可以是平面多边形,即所有顶点在一个平面上,也可以是空间多边形。颜色坐标法向坐标5-3 基本几何图元的显示二、图元的绘制二、图元的绘制1、定义顶点所有几何物体最终都由一定顺序的定点集来描述。双精度3维顶点用齐次坐标定义3维顶点,真实坐标为(1.2,0.5,-1.1)5-3 基本几何图元的显示2、构造几何图元在实际应用中,通常用一组相关的顶点序列以一定的组织方式组织起来定义某个几何图元,而不采用单独定义多个顶点来构造几何图元。在O
22、penGL中,所有被定义的顶点必须放在glBegin()与glEnd()两个函数之间才能正确表达一个几何图元或物体,否则glVertex*()不能完成任何操作。5-3 基本几何图元的显示5-4 真实感地形表面的绘制一、真实感图形的基本概念一、真实感图形的基本概念真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学和其它科学知识在计算机图形设备上生成象彩色照片那样的具有真实感的图形。5-4 真实感地形表面的绘制一般说来,用计算机在图形设备上生成真实感图形必须完成以下四个步骤:一是建模,即用一定的数学方法建立所需三维场景的几何描述,场景的几何描述直接影响图形的复杂性和
23、图形绘制的计算耗费;二是将三维几何模型经过一定变换转为二雏平面透视投影图;三是确定场景中所有可见面,运用隐藏面消隐算法将视域外或被遮挡住的不可见面消去;四是计算场景中可见面的颜色,即根据基于光学物理的光照模型计算可见面投射到观察者眼中光亮度大小和颜色分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一像素的颜色,最终生成图形。5-4 真实感地形表面的绘制由于真实感图形是通过景物表面的颜色和明暗色调来表现景物的几何形状、空间位置以及表面材质的,而一个物体表面所呈现的颜色是由表面向视线方向辐射的光能决定的。在计算机图形学中,常采用一个既能表示光能大小又能表示其颜色组成的物理量即光亮度(l
24、uminance)或光强(intensity of light)来描述物体表面朝某方向辐射光能的颜色。采用这个物理量可以正确描述光在物体表面的反射、透射和吸收现象,因而可以正确计算处理物体表面在空间给定方向上的光能颜色。物体表面向空间给定方向辐射的光强可应用光照模型进行计算。5-4 真实感地形表面的绘制简单的光照模型通常假定物体表面是光滑的且由理想材料构成,因此只考虑光源照射在物体表面产生的反射光,所生成的图形可以模拟不透明物体表面的明暗过渡,具有一定的真实感效果。复杂的光照模型除了考虑上述因素外,还要考虑周围环境的光对物体表面的影响。如光亮平滑的物体表面会将环境中其它物体映像在表面上,而通过
25、透明物体也可看到其后的环境景象。这类光照模型称为整体光照模型,它能模拟出镜面映像、透明等较精致的光照效果。为了更真实的绘制图形,还要考虑物体表面的细节纹理,这通常使用一种称为“纹理映射”(texture mapping)的技术把已有的平面花纹图案映射到物体表面上,并在应用光照模型时考虑这些花纹的颜色,物体表面细节的模拟使绘制的图形更接近自然景物。5-4 真实感地形表面的绘制二、基于二、基于DEM构造地形表面构造地形表面任何复杂表面都可以分解为若干个由基本图元构成的图形。由众多三角网无限逼近而形成光滑曲面是生成复杂地形表面的一个基本途径。1、基于正方形网格DEM5-4 真实感地形表面的绘制2、基
26、于TIN结构的DEM5-4 真实感地形表面的绘制三、地形表面的绘制三、地形表面的绘制众多三角形(空间三角面)构成了地形表面1、循环绘制单个三角形顶点重复定义、绘制,绘制效率低形成的地表有棱角,不光滑2、构成三角网状结构大量减少顶点的颜色、光照等的计算提高绘制效率形成真实感图形5-4 真实感地形表面的绘制构成复杂表面的数据结构5-4 真实感地形表面的绘制四、光照处理与材质四、光照处理与材质1、光照模型、光照模型 1)光照概述当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射,产生反射光。其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光。最后,部分光将被物体
27、表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。一般来说,反射光可以分成三个分量,即环境反射、漫反射和镜面反射。5-4 真实感地形表面的绘制一般来说,反射光可以分成三个分量,即环境反射、漫反射和镜面反射。环境反射分量假定入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去,通常物体表面还会受到从周围环境来的反射光(如来自地面、天空、墙壁等的反射光)的照射,这些光常统称为环境光(Ambient Light);漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光,这些光常称为漫射光(Diffuse Light);镜面反射光为朝一定
28、方向的反射光,如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight)”,它是光源在金属球面上产生的镜面反射光(Specular Light)。对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。5-4 真实感地形表面的绘制2)光组成在OpenGL简单光照模型中的几种光分为:辐射光(Emitted Light)环境光(Ambient Light)漫射光(Diffuse Light)镜面光(Specular Light)5-4 真实感地形表面的绘制辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影
29、响。环境光是由光源发出经环境多次散射而无法确定其方向的光,即似乎来自所有方向。一般说来,房间里的环境光成分要多些,户外的相反要少得多,因为大部分光按相同方向照,而且在户外很少有其他物体反射的光。当环境光照到曲面上时,它在各个方向上均等地发散(类似于无影灯光)。漫射光来自一个方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去。于是,无论视点在哪里它都一样亮。来自特定位置和特定方向的任何光,都可能有散射成分。镜面光来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射。光亮的金属和塑料具有很高非反射成分,而象粉笔和地毯等几乎没有反射
30、成分。因此,三某种意义上讲,物体的反射程度等同于其上的光强(或光亮度)。5-4 真实感地形表面的绘制3)创建光源创建光源(Light Source)光源有许多特性,如颜色、位置、方向等。选择不同的特性值,则对应的光源作用在物体上的效果也不一样。定义光源特性的函数void glLightifv(GLenum light,GLenum pname,TYPE param)创建具有某种特性的光源。其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、.、GL_LIGHT7。第二个参数pname指定光源特性,这个参数的辅助信息见下表所示。最后一个参数设置相应的光源特性值。
31、5-4 真实感地形表面的绘制void glLightifv(GLenum light,GLenum pname,TYPE param)参数参数pname指定光源特性,参数如下:指定光源特性,参数如下:_ pname 参参 数数 名名 缺缺 省省 值值 说说 明明GL_AMBIENT (0.0,0.0,0.0,1.0)RGBA模式下环境光模式下环境光GL_DIFFUSE (1.0,1.0,1.0,1.0)RGBA模式下漫反射光模式下漫反射光GL_SPECULAR (1.0,1.0,1.0,1.0)RGBA模式下镜面光模式下镜面光GL_POSITION (0.0,0.0,1.0,0.0)光源位置齐
32、次坐标光源位置齐次坐标(x,y,z,w)GL_SPOT_DIRECTION (0.0,0.0,-1.0)点光源聚光方向矢量点光源聚光方向矢量(x,y,z)GL_SPOT_EXPONENT 0.0 点光源聚光指数点光源聚光指数GL_SPOT_CUTOFF 180.0 点光源聚光截止角点光源聚光截止角GL_CONSTANT_ATTENUATION 1.0 常数衰减因子常数衰减因子GL_LINER_ATTENUATION 0.0 线性衰减因子线性衰减因子GL_QUADRATIC_ATTENUATION 0.0 平方衰减因子平方衰减因子5-4 真实感地形表面的绘制用法:GLfloat light_po
33、sition=1.0,1.0,1.0,0.0;glLightfv(GL_LIGHT0,GL_POSITION,light_position);GLfloat light_ambient =0.0,0.0,0.0,1.0;GLfloat light_diffuse =1.0,1.0,1.0,1.0;GLfloat light_specular=1.0,1.0,1.0,1.0;glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,
34、GL_SPECULAR,light_specular);5-4 真实感地形表面的绘制启动光照在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感,如前几章例程运行结果显示。要使光照有效,首先得启动光照,即:glEnable(GL_LIGHTING);若使光照无效,则调用 gDisable(GL_LIGHTING)可关闭当前光照。然后,必须使所定义的每个光源有效,例light0.c中只用了一个光源,即:glEnable(GL_LIGHT0);其它光源类似,只是光源号不同而已。5-4
35、真实感地形表面的绘制2、明暗处理明暗处理在计算机图形学中,光滑的曲面表面常用多边形予以逼近和表示,而每个小多边形轮廓(或内部)就用单一的颜色或许多不同的颜色来勾画(或填充),这种处理方式就称为明暗处理。用单一颜色处理的称为平面明暗处理(Flat Shading)。用许多不同颜色处理的称为光滑明暗处理(Smooth Shading),也称为 Gourand 明暗处理(Gourand Shading)。设置明暗处理模式的函数为:void glShadeModel(GLenum mode)函数参数为GL_FLAT或GL_SMOOTH,分别表示平面明暗处理和光滑明暗处理。应用平面明暗处理模式时,多边形
36、内每个点的法向一致,且颜色也一致;应用光滑明暗处理模式时,多边形所有点的法向是由内插生成的,具有一定的连续性,因此每个点的颜色也相应内插,故呈现不同色。5-4 真实感地形表面的绘制Gouraud明暗处理通常算法为:先用多边形顶点的光强线性插值出当前扫描线与多边形边交点处的光强,然后再用交点的光强线插值处扫描线位于多边形内区段上每一象素处的光强值。图中显示出一条扫描线与多边形相交,交线的端点是A点和B点,P点是扫描线上位于多边形内的任一点,多边形三个顶点的光强分别为I1、I2和I3.取A点的光强Ia为I1和I2的线性插值,B点的光强Ib为I1和I3的线性插值,P点的光强Ip则为Ia和Ib的线性插
37、值。采用Gouraud明暗处理不但可以使用多边形表示的曲面光强连续,而且计算量很小。这种算法还可以以增量的形式改进,且能用硬件直接实现算法,从而广泛用于计算机实时图形生成。gouraud 明暗处理5-4 真实感地形表面的绘制3、材质材质1)材质颜色OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。与光源类似,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合。对漫反射光的反射率与每个进入光源的漫反射光结合。对镜面光的反射率与每个进入光源的镜面反射光结合。对环境光与
38、漫反射光的反射程度决定了材料的颜色,并且它们很相似。对镜面反射光的反射率通常是白色或灰色(即对镜面反射光中红、绿、蓝的反射率相同)。镜面反射高光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球,球的大部分表现为红色,光亮的高光将是白色的。5-4 真实感地形表面的绘制2)2)材质定义材质定义材质的定义与光源的定义类似。其函数为:void glMaterialifv(GLenum face,GLenum pname,TYPE param);定义光照计算中用到的当前材质。face可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,它表明当前材质应该应用到物体
39、的哪一个面上;pname说明一个特定的材质;param是材质的具体数值,若函数为向量形式,则param是一组值的指针,反之为参数值本身。非向量形式仅用于设置GL_SHINESS。5-4 真实感地形表面的绘制函数glMaterial*()参数pname的缺省值_ 参数名 缺省值 说 明_GL_AMBIENT (0.2,0.2,0.2,1.0)材料的环境光颜色GL_DIFFUSE (0.8,0.8,0.8,1.0)材料的漫反射光颜色GL_AMBIENT_AND_DIFFUSE 材料的环境光和漫反射光颜色GL_SPECULAR (0.0,0.0,0.0,1.0)材料的镜面反射光颜色GL_SHINES
40、S 0.0 镜面指数(光亮度)GL_EMISSION (0.0,0.0,0.0,1.0)材料的辐射光颜色GL_COLOR_INDEXES (0,1,1)材料的环境光、漫反射光 和镜面光颜色_参数GL_AMBIENT_AND_DIFFUSE表示可以用相同的RGB值设置环境光颜色和漫反射光颜色。5-4 真实感地形表面的绘制光源与材质例子光源与材质例子 GLfloat mat_ambient=0.8,0.8,0.8,1.0;GLfloat mat_ambient=0.8,0.8,0.8,1.0;GLfloat mat_diffuse=0.8,0.0,0.8,1.0;/*GLfloat mat_dif
41、fuse=0.8,0.0,0.8,1.0;/*紫色紫色*/GLfloat mat_specular=1.0,0.0,1.0,1.0;GLfloat mat_specular=1.0,0.0,1.0,1.0;GLfloat mat_shininess=50.0;GLfloat mat_shininess=50.0;GLfloat light_diffuse=0.0,0.0,1.0,1.0;/*GLfloat light_diffuse=0.0,0.0,1.0,1.0;/*蓝色蓝色*/GLfloat light_position=1.0,1.0,1.0,0.0;GLfloat light_posi
42、tion=1.0,1.0,1.0,0.0;glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular)
43、;glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL
44、_LIGHTING);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT0);glDepthFunc(GL_LESS);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);glEnable(GL_DEPTH_TEST);5-4 真实感地形表面的绘制3)材质材质RGBRGB值和光源值和光源RGBRGB值的关系值的关系材质的颜色与光源的颜色有些不同。对于光源,R、G、B值等于R、G、B对其最大强度的百分比。若光源颜色的R、G、B值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度
45、为原来的一半,于是表现为灰色;若RG1.0,B0.0,则光源为黄色。对于材质,R、G、B值为材质对光的R、G、B成分的反射率。比如,一种材质的R1.0,G0.5,B0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LR,LG,LB),材质颜色为(MR,MG,MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR,LG*MG,LB*MB)。同样,如果有两束光,相应的值分别为(R1,G1,B1)和(R2,G2,B2),则OpenGL将各个颜色成分相加,得到(R1+R2,G1+G2,B1+B2),若任一成分的和值大于1
46、(超出了设备所能显示的亮度)则约简到1.0。多种光和材质的变化效果5-4 真实感地形表面的绘制4、法向计算、法向计算1)概念法向,又称法向量(Mormal Vector)法向量,是面上某一点处垂直于该面的向量。几何对象的法向量定义它在空间中的方向,特别定义相对于光源的方向,因此某顶点的法向量决定了对象在该点上可接受多少光照。对于一个平面,其上各点的法向的一样,统一为这个平面的法向,所以称为平面法向。对于一个曲面,虽然它在计算机图形中是由许多片小的平面多边形逼近,但是每个顶点的法向都不一样,因此曲面上每个点的法向计算就可以根据不同的应用有不同的算法,则最后效果也不相同。5-4 真实感地形表面的绘
47、制OpenGL有很大的灵活性,它只提供赋予当前顶点法向的函数,并不在内部具体计算其法向量,这个值由自己根据需要计算。正确设定点或面的法向是获得正确光照的前提条件。5-4 真实感地形表面的绘制2)法向计算方法在一个平面内,有两条相交的线段,假设其中一条为矢量W,另一条为矢量V,且平面法向为N,如图所示,则平面法向就等于两个矢量的叉积(遵循右手定则),即NWxV。平面法向计算5-4 真实感地形表面的绘制三角形平面的法向计算计算一个三角形平面的法向,就可以用它的三个顶点来计算。(对于规则几何体)设三个顶点分别为P0,P1,P2,相应两个向量为W、V,三角平面法向的计算方式:void getNorma
48、l(GLfloat gx3,GLfloat gy3,GLfloat gz3,GLfloat*ddnv)GLfloat w0,w1,w2,v0,v1,v2,nr,nx,ny,nz;w0=gx0-gx1;w1=gy0-gy1;w2=gz0-gz1;v0=gx2-gx1;v1=gy2-gy1;v2=gz2-gz1;nx=(w1*v2-w2*v1);ny=(w2*v0-w0*v2);nz=(w0*v1-w1*v0);nr=sqrt(nx*nx+ny*ny+nz*nz);ddnv0=nx/nr;ddnv1=ny/nr;ddnv2=nz/nr;三角形平面法向计算5-4 真实感地形表面的绘制曲面各顶点的法向
49、计算对于曲面,必须计算构成曲面的各顶点处的法向。对于正方形格网DEM和由不规则三角网构成的DEM,必须依次计算各个格网顶点的法向量。计算每个顶点的法向量有多种方法:可以简单地将周围三角形的法向直接相加得到可以由其周围三角形的法向加权平均得到,并对结果向量进行单位化。权值的取法有多种,该权值代表当前三角形所在的面对顶点法向量的贡献大小。可以是每个三角形的面积可以是每个三角形在该点处的夹角5-4 真实感地形表面的绘制顶点P0 的法向可以由其周围的三角形(实际上是三角面)P0P1P4,P0P4P6,P0P6P7,P0P7P8,P0P8P5,P0P5P3,P0P3P2,P0P2P1 和P0P2P4,P
50、0P4P7,P0P7P5,P0P5P2 的法向加权平均得到。三角形法向的计算 顶点法向的计算 规则三角网的构造5-4 真实感地形表面的绘制5、地表材质设定、地表材质设定地表材质通过设定顶点的颜色来实现粘贴影像单一颜色分层设色如果地表模型不粘贴航空影像,则可以采用地势图中分层设色的原理来对三维地形模型进行分层设色,主要是通过对各顶点分别设色来实现的。顶点的颜色可以根据其高程值从高程的分层设色表中获得,该分层设色表中所存储的是各高程带所对应的颜色。在绘制某顶点前将设定该顶点颜色设为该点的材质的漫反射颜色 5-5 三维地形的纹理叠加技术一、概念一、概念纹纹理理映映射射(Texture Mapping