基于VC++的3D地形绘制与纹理贴图

前言

随着地理信息系统产业的发展,三维产品也在生活中处处吸引着我们的眼球。作为数字城市的核心内容,城市模型的构建成为了目前研究的热点。OpenGL是独立于操作系统和硬件环境的三维图形库,其为实现逼真的三维绘制效果和建立交互的三维场景提供了高效率的函数库,在交互式三维图形建模能力和编程方面具有无可比拟的优越性。在VC++中配置OpenGL开发环境,利用OpenGL,VC++构建了地形的三维可视化模型,通过对三维地形进行纹理贴图,光照设置使得绘制结果更具真实感。结果表明,利用利用 VC++和OpenGL进行三维真实感地形生成是切实可行的,其实现的功能全面而且效率高。

三维地形可视化可以直观、真实地表达地形的三维信息及综合特征,在国民经济各个领域中有着广泛的应用价值和广阔的应用前景。基于上述理论及成果,以VC++为平台,利用OpenGL库函数编写三维地形可视化过程。首先读取DEM数据,构建三角面片,计算其法向量;以BMP格式图片作为纹理,通过纹理坐标与三角面片顶点坐标的匹配实现纹理贴图;最后为场景添加光照、投影等,使场景更具真实感。最终实现了一个可以旋转、缩放的三维地形展示。

一、技术路线

本文主要分为两个部分,三维地形生成与纹理贴图和环境设置。前者是研究的主要内容。先生成并读取DEM数据,运用栅格的位置坐标和高程值生成三维点,基于三维点构建三角面片;接着利用法向量生成函数计算得到各三角面片的法向量,为添加光照服务;最后读取RGB图像作为纹理,利用glTexCoor2f()与glVertex3f()函数为三角面片顶点指定纹理坐标,将纹理贴到三角面片上。同时运用OpenGL添加光照,设置视点等,使地形的三维效果更具真实感。技术路线如图1。

基于VC++的3D地形绘制与纹理贴图_第1张图片

图1 技术路线

二、程序实现

1.建立光照模型

(1)打开光源

(2)设置光源属性

光源属性主要包括Position、Ambient、Diffuse、Specular,本文只考虑了前三者。

GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)。GL_DIFFUSE 表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)。每个属性由四个值表示,分别代表了颜色的R,G,B,A值。GL_POSITION属性。表示光源所在的位置。由四个值(X,Y,Z,W)表示。如果第四个值 W为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。这种光源称为方向性光源,通常,太阳可以近似的被认为是方向性光源。本文设置的即为接近太阳的光源。

glClear函数来自OpenGL,其中它是通过glClear使用红,绿,蓝以及AFA值来清除颜色缓冲区的,并且都被归一化在(0,1)之间的值,其实就是清空当前的所有颜色。

(3)设置材质参数

其中,GL_FRONT_AND_BACK代表材质的面,GL_DIFFUSE代表漫反射反射系数,包括四个参数,前三个参数RGB对应于该色光的反射百分比(反射系数)。如R=1.0,G=0.5,B=0.0,则反射全部红光,一半绿光,不反射蓝光。

2.读取DEM数据

(1)在Arcmap中将DEM数据转换成ASCII码存储形式,即将每个栅格的高程用文本的形式记录下来,或者可以自动生成一个指定大小n*n的二维数组,存放指定的高程信息。

(2)通过文件操作将栅格大小和每个栅格的高程读入,使用数组记录下高程,即为Z轴坐标,通过栅格大小计算出每个栅格距离中心点的X轴方向距离和Y轴方向距离,即为X轴坐标和Y轴坐标。将X、Y、Z存入动态数组DTMX、DTMY和DTMZ。具体的程序实现为:

你可能感兴趣的:(图像处理,c++,c++,3d,贴图)