学习WW中DEM的加载和应用对于基于WW搞三维GIS插件开发很重要。我一直也想关注和搜集相关学习资料,之前没有开始研究它,主要是自己没能在WW看到高程应用功能,感觉没法切入。我昨天下午和今天上午的时间就花在找研究切入点啦!实质上就是找如何在WW查看高程的功能。(现在回想一下,感觉浪费时间了,还是因为我对WW的功能没能完全知道)
我在开始学习DEM加载和应用前,我主要参看了CSDN上的博文——《庆贺,绘制出World Wind的LOD地形网格》(http://blog.csdn.net/paul_xj/archive/2007/08/29/1763585.aspx),相信研究WW的人都应该看过这篇和他的三篇学习总结。我也看过研究过好多遍,结合自己的学习,每遍拜读都有些收获。他的文章关注度很高,绝对是WW初学者的起航灯塔。但是,我对上面提到的《绘制出World Wind的LOD地形网格》几乎要全文否定。我不希望网友以该文为标准来学习WW的地形网格(即DEM加载应用),因为我原本也是很相信他说的,按他说的去做的,事实不是那样的,相信他也是刚入门时写下的,很多DirectX的东西理解也不是很深刻的。
所谓的绘制出LOD地形网格有问题!怎么能将DirectX三维渲染与GIS中DEM混为一团?!地形图包括地物和地貌。而地貌主要体现在等高线上,在三维中体现为DEM应用(数字高程模型)!上面博客中讲到的构建地形网格只是将DirectX的面渲染改为线渲染,这还是平面级别的,根本没有体现高程,怎么就是地形网格啦?!从DirectX三维技术角度讲,也是有问题的:DX中面渲染和线渲染存储点的方式是不同的,因为WW中使用LOD模型各层要渲染的面很多且相邻,所以简单更改渲染方式没能看出影响。但如果你绘制单个面然后更改为线性渲染,就会看出问题啦!这还是平面级别上面,面渲染改为线渲染会出现问题,如果是三维物体(立方体)如果简单改为线渲染,问题更明显!(你学过DirectX后,试一下就知道啦!)
至于博客中说到的:“按下‘Ctrl+W’出来的网格,是什么空中网格”,只是简单地操作,放大后看到后面是“天空”,就认为是什么空中网格,这真是典型的形而上学啦!真正学习过三维开发的人都会知道:为了提高效率,三维渲染只是渲染可视的前一面,不被看到的面统统隐去(不渲染)。大家放大操作后看到“天空”而不是又一层网格,就是因为后面的网格不可视。‘Ctrl+W’出来的网格,是个空心球体框架。只是更改DX三维球体渲染时FillMode而已。
WorldWindow.cs中响应“CRL+W”的处理代码:
1351行:
// Control key down
else if (e.Control)
{
switch (e.KeyCode)
{
case Keys.D:
this.showDiagnosticInfo = !this.showDiagnosticInfo;
return true;
case Keys.W:
renderWireFrame = !renderWireFrame;
return true;
}
}
然后,看Render()方法,代码行号776
// Set fill mode
if (renderWireFrame)
m_Device3d.RenderState.FillMode = FillMode.WireFrame;
else
m_Device3d.RenderState.FillMode = FillMode.Solid;
所以看到的是球体框架而不是实心球。压根没有空中网格一说!
这是文章中最后的截图,貌似很像他所说的地形网格,可能有网友会据此驳斥我。首先,在上面我已经从DirectX渲染技术角度上,我已经说明了这不是地形格网。其次,图中能表现出地形的高低起伏,是因为有地表面渲染中有DEM数据的加载和应用(这是关键)。我认为地形网格其实很简单,将地表面的渲染FillMode = FillMode.WireFrame;(注意:不是球面渲染的FillMode)。
我一向主张学习WW要从功能入手,DEM学习也应该从功能入手,现在看看WW中体现DEM功能:(参看http://www.help2go.com/Tutorials/Software_Applications/View_the_world_with_NASA_Worldwind.html
)
Zoom in further, and Worldwind will download higher resolution images, giving you greater and greater detail. Now, hold down the right-mouse button and move your mouse down a bit -- your view will rotate a bit, so rather than looking head-on at the city from above, you'll be looking at it from an angle.
按住鼠标右键,移动鼠标一点,你就可以从一个角度看地貌了,而不是垂直向下看啦。
可能很多网友已经知道如何看到上面的效果啦!可是我之前不知道,所以一直困惑没找到切入点。我的WW学习很强调从功能入手分析代码学习代码。
上面的分析,算是DEM加载和应用入门篇吧!因为我自己就是走过这个阶段的,希望你也有所收获。然后下一篇,我们从代码基本分析DEM数据的加载和使用。
另附:(需要了解的两个知识点)
LOD是Level of Detail的缩写,意为层次细节度,技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
DDS(DirectDraw Surface)文件格式是微软为DirectX开发的一种图片格式, 它是可以使用类似S3TC标准提供的一种压缩纹理格式. DDS文件可以有很多不同的格式, 可以含有 Mipmap 或不保存 Mipmap 信息, 可以使用压缩或非压缩的像素格式, 常见的压缩数据方式有 DXTn(DXT1~DXT5), DDS文件的结构见MSDN: DDS File Reference. 参看:http://www.csinx.org/IBLog/article.asp?id=8
本系列其他部分: