相对于二维图形开发,大家一般认为三维开发要难很多。其实也不一定。相比二维开发,三维开发一般都是在三维图形引擎的基础之上进行的,比如常用的OpenGL或DirectX,而在工程和行业应用领域中,OpenGL比较流行一样(DX在多媒体相关开发中比较流行)。三维引擎一般提供了比较好的底层接口,包括显存/内存数据交换、快速体绘制算法、视场、光照、帖图及一些工具箱等的支持,大家在此基础上很方便地就能显示一个旋转的立方体、茶壶等,更复杂的模型如体育馆、火车头、人脸等,就需要用专业软件做建模工作(如3DMax、AutoCAD等);而在地理领域,要生成三维的地形地貌,所涉及的技术要点就稍微有些不同。我们可以首先看看CS中的三维场景,大家都会感觉CS中的场景精美、视图变换与刷新很快,操作敏捷,其实CS每一场景中的三维要素并不复杂,都是一些加了帖图的墙面、斜坡等(用专业的说法就是需要生成和刷新的三角面并不多),而要生成一段简单的山坡地形,就有可能涉及成万上亿的三角面,因为地理世界是分形的(fractal),没有规律的,三维引擎首先要生成这么多的三角面,再计算其法向量(光照要用的),再在上面帖图,还要保证很好的体绘制速度(还没考虑地貌上加树林、民居等),这样就为计算机系统带来了存储量和计算时间的要求,这两点,才真正是三维GIS要考虑的重点之重点。

让我们来先看看下面的两个DEM(数字高程模型),这些模型都是来自于卫星遥感或其他测量工作:

有时DEM也以点黑白位图的方式进行提供,每一像素的灰度值就是代表该点的高程采样,这种灰度图也是进行了坐标配准的,也就是说位图上的每一个点都是与某一地理坐标值相对应。如果我们要把这个DEM用三维的方式展现出来,就需要调用OpenGL的相应图形操作接口来完成。

回到OpenGL,三维开发之前首先要对场景进行一些初始化,包括激活三维场景、初始化视点、光照和材质等工作,然后才能进行地物的绘制,如下是一个比较标准的OpenGL操作代码:
  glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHT0);

glenable (GL_COLOR_MATERIAL);
  gldisable (GL_NORMALIZE);

PaintStruct ps;
   BeginPaint (Handle, ps);
   glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glPushMatrix;

glRotatef (Anglex, 1.0,0.0 , 0.0);
    glRotatef (Angley, 0.0,1.0 , 0.0);

//绘制图形
    //MyMesh.Draw;  //MyMesh是一个经封装的DEM类

glPopMatrix;

SwapBuffers (DC);
  EndPaint (Handle, ps);

OpenGL提供了一些基本的画点、画线、画折线、画多边形以及画连续Strip地物等的函数接口,这些接口可以通过嵌套在
  glBegin(mode)
  glEnd();
  的代码段中运行,如下就是一个代码片断:
  glBegin(MeshConfig.mode);
                    n1 := GetNormal(pts[I].dX, pts[I].dY, Pts[I].dZ, pts[I + nXWidth].dX, pts[I + nXWidth].dY, Pts[I+ nXWidth].dZ ,pts[I + 1].dX, pts[I + 1].dY, Pts[I + 1].dZ);
    //             n1 := GetNormal(pts[I].dX, pts[I].dY, Pts[I].dZ, pts[I + 1].dX, pts[I + 1].dY, Pts[I+ 1].dZ ,pts[I + nXWidth].dX, pts[I + nXWidth].dY, Pts[I + nXWidth].dZ);
                    glNormal3fv(@n1);
                    glTexCoord2f((I mod nYWidth) / nXWidth, (I div nXWidth) / nYWidth);
                    glVertex3f(pts[I].dX, pts[i].dy, pts[i].dZ);
                    glTexCoord2f(((I + nXWidth) mod nXWidth) / nXWidth, ((I + nXWidth) div nYWidth) / nYWidth);
                    glVertex3f(pts[I + nXWidth].dX, pts[I + nXWidth].dy, pts[I + nXWidth].dZ);
                    glTexCoord2f(((I + 1) mod nXWidth) / nXWidth, ((I + 1) div nYWidth) / nYWidth);
                    glVertex3f(pts[I + 1].dX, pts[I + 1].dy, pts[I + 1].dZ);
                glEnd;

是不是很简单就可以把一个多边形画出来?是的。接下来如果我们要旋转这个多边形,画是想“凑近”看看这个多边形,怎么办?是不是把多边形的坐标进行旋转变换就可以了?没必要这么复杂,OpenGL是通过改变“观众”视角的方式来实现地物的旋转和变化的,看看如下代码片断:

dLength := 0.1;
 gluLookAt(0,0,dLength,0,0,-100,0,1,0);

是不是很简单啊?一个LookAt就解决问题了。

地物可以动起来了,我们下面关心的就是地物显示的逼真。大家知道要使三维地物和场景显示得真实,逼真的光影表现是最重要的,也就是说地物和场景要有真实的明暗对比,这就需要我们为地物照上一些光。OpenGL中可以为地物设置多个光源,还可以为光源设置平行光、点光及相应的颜色等,如下:

glEnable(GL_LIGHTING);

还是这么简单!当然,要细致控制光源的效果,还有很多的函数需要调用。并且要记住二点:一是要为光源计算每个面的法向量(Normal vector),二是每一个面是由“正反”两面构成,别忘记了还有背面,否则会造成一个面旋转到背面,就神秘地消失了!

接下来是帖图,也很简单。

glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, Texture_pointer);

可以为场景设置多个素材,每个素材同地物的坐标一配,就可以自动地“套上”地物了。

这样说是不是太简单了?呵,要做到工业级的产品,肯定还是少不了精细的开发。大家可以到这里下载我的程序和演示数据:
 
  http://www.delphibbs.com/keylife/images/u43/3Dbuilder_.rar

另外说几点我的心得:

1,可以通过一些内存映射的方式来提高数据载入速度和占用内存的空间,如我用FileMapping的方式,直接将三维模型文件映射到内存中进行显示,速度比较快,不过这个三维模型和材质要预先处理好,以便于在映射时字节对齐;
  2,用规则三角网来生成和显示DEM比较简单,但数据有一些冗余,我在DEMO中试着做了一些四叉树的三角合并,在有些面的接鏠处还处理得不好,也没有进一步研究了;不规则三角网(TIN)会好一些,也可以通过算法将规则三角网生成为TIN;
  3,空间选取这块还没有太多的研究,不是太清楚OPENGL提供的SELECT功能能到什么地步,还是需要自已开发?
  4,我在DEMO做的是单键操作,即一个鼠标完成旋转、平移、缩放操作,效果比较好;

OpenGL之三维GIS相关推荐

  1. 三维gis系统 开发

    开发背景 之前项目要开发一个三维gis系统,可以进行DEM,BIM数据的导入,计算分析,以及RTSP流对接,传感器数据获取等等,到此,对项目做一下效果浏览: 框架 基于wpf+skyline; 其它技 ...

  2. 10种具有代表性的三维GIS软件系统

    为三维GIS巨大的应用潜力所牵引,众多科研机构.高等院校.商业公司积极投身于三维GIS的研究开发之中,目前已开发出了多种三维GIS软件,下文介绍一些具有代表性的软件系统. 1.NewMap3DV Ne ...

  3. 基于三维GIS技术的动态LOD渲染方法的实验及验证

    针对透视投影下现有矢量地图动态LOD渲染方法存在的不足,本文从渲染的客观需求出发使用梯形格网统一了简化与剖分的过程,并研究了透视投影下梯形格网的简化算法.之后,分析了地图简化的影响因素,最终,针对GP ...

  4. 基于三维GIS技术的行业发展及研究现状

    一.三维GIS的研究现状 伴随着大家衣食住行的丰富多彩,三维GIS技术被愈来愈多使用在各个领域,如开采.地质学.原油等制造行业.三维GIS研究分析职责分工也愈来愈细,成长了好几个研究内容. 1.三维G ...

  5. 从事GIS开发多年,2017年对GIS行业的心得,尤其对三维GIS的理解

    个人群号 309141738 本人从事GIS方面开发六年了,但是一开始大学并未学的是GIS方面的专业,本人学习的专业叫对日软件开发,呵呵...很新颖的一个名字把,没错,本来想着毕业后去日本从事软件开发 ...

  6. 基于TerraDeveloper的三维GIS开发研究

    [中文题名]  基于TerraDeveloper的三维GIS开发研究 [英文题名]  Research on the Development of 3D GIS Based on TerraDevel ...

  7. 超图三维GIS在线示例

    地址 http://support.supermap.com.cn:8090/webgl/examples/examples.html http://support.supermap.com.cn:8 ...

  8. 超图三维GIS开发概念学习

    1 二三维一体化 所谓三维是指三维地理空间和基于地理球面或椭球面的二维地图空间. 三维 GIS 指的是以三维地理空间和基于地理球面或椭球面二维地图空间为基础的 GIS. 三维 GIS 在展示效果和分析 ...

  9. gis环境设置在哪_三维GIS平台的可视化应用 (下)

    上一篇主要对三维GIS的基础数据和三维模型进行了一点说明,本篇将接着聊剩下的部分,主要是三维GIS平台能够支持什么样的场景展示,并来对平台的应用进行一些介绍. 没看过上篇的朋友可以先了解一下再看本篇: ...

最新文章

  1. python文件安全传输系统_安全的directconnect文件传输程序
  2. iOS 11和xcode9
  3. Start – Modern minimalist OpenCart 2.X 自适应主题模板 ABC
  4. Pyhton基础篇(1)-第一个Pyhton程序(已更新)
  5. 三维重建——纹理映射
  6. 渲染已保存的几何图形
  7. dsu on tree入门
  8. 2016北京集训测试赛(十三) Problem B: 网络战争
  9. NYOJ--456--邮票分你一半
  10. Django框架(二)---- 常用命令
  11. LINUX编译spandsp
  12. 服务器远程ghost,Ghost win7系统64位远程桌面连接教程
  13. 樊昌信 通信原理第七版 第十一章 思考题答案
  14. iOS - iOS6 越狱及必装源、软件
  15. Android跳转小项目-CHANGE页面-Recycylerview、List、Context(二)
  16. w3school中文离线手册
  17. 判断是页面否为微信打开
  18. 【运营】运营网课之活动运营
  19. 课程设计+毕业设计(合集)
  20. python 使用pika对接rabbitMQ

热门文章

  1. LTE 终端如何申请 RB 资源以及现实面临的问题
  2. Android的根证书颁发机构列表
  3. 深入理解LEFT JOIN
  4. Simple Mover
  5. windows11虚拟机安装出现蓝屏
  6. web前端开发中需要掌握的技术:
  7. 并发编程之并发包详解
  8. 加强防护,近期勒索病毒有点疯狂!
  9. python 安装TFLearn模块
  10. python选择文件读入_Python学习-文件的调用-读取