World Wind 1.4.1学习总结二

这两次写的都很粗糙个人感觉,希望下次找个工具可以把流程图,UML图画下来也好一目了然

 

一、             WW下载文件调度策略

这里只讨论纹理和高程信息的下载调度,当需要渲染区域的四叉树网络生成以后,就可以确定需要渲案区域信息(先从本地缓存中提取文件,若存在就直接渲染,跳过下后的步骤,这个在WW数据缓冲机制中讲,现在先略过),然后根据:tile等级,Row, Col生成纹理和高程信息对应的URL值,传入WebDownLoad类的构造函数,加入下载队列。

1. 纹理图片,渲染策略

http://worldwind25.arc.nasa.gov/tile/tile.aspx?T=bmng.topo.bathy.200408&L=2&X=31&Y=13

如上就截取的一个纹理的URL值,返回的为JPG的图片,文件名为tile.jpg.512*512像素,下载的临时文件以name.jpg.tmp存放在L=2的文件夹,下载完毕,调用ConvertToDxt3转化为DXT3格式的DDS文件,存有十层的MipMap信息

l         类结构图

DownloadRequest

WebDownloadRequest

GeoSpatialDownloadRequestt

DownloadQueuet

WebDownload

l         下载调度策略

同时进行的下载进程为2,下载队列的长度为200,新增的下载队列大于200时,将循环调用CalculateScore()函数,删取返回值最小的下载队列,当一个下载完成,也通过此函数激活返回值最大的队开始下载

l          渲染策略

当前纹理正在下载时,会通过QuadTileset.csCreateDownloadRectangle函数,以

DownloadProgressColorDownloadQueuedColorDownloadTerrainRectangleColor三个颜色显示矩形框标识正在下载的区域,以RenderDownloadProgress函数绘制出来。当下载完成后,直接调用Render渲染该区域。

当进行场影漫游的时候,会调用RemoveInvisibleTiles(CameraBase camera)函数删除掉不在视域FOV内的tile

l         CalculateScore()函数的说明:

是抽像类DowndloadRqeuest的纯虚函数,具体实现在ImageTileRequest.csBoundingBox.cs中,传入当前camera,和当前tile矩形的四个顶点,返回矩形对角线长度的float形数,为简化算法,将返回值(sqrt(tri1SqArea)+sqrt(tri2SqArea))/2tri1SqArea + tri2SqArea代替

2. 高程信息

GeoSpatialDownloadRequest

TerrainDownloadRequest

下载的URL的生成由TerrainDownloadRequest(TerrainTile tile, TerrainTileService owner, int row, int col, int targetLevel)生成,示例如下(生成结果):

       http://worldwind25.arc.nasa.gov/wwelevation/wwelevation.aspx?T=srtm30pluszip&L=0&X=16&Y=7URL

compressedPath "H://ww//trunk//WorldWind//bin//Debug//Cache//Earth//SRTM//0//0007//0007_0016.bil.tmp.zip

download.SavedFilePath "H://ww//trunk//WorldWind//bin//Debug//Cache//Earth//SRTM//0//0007//0007_0016.bil.tmp

tempFullPath   "H://ww//trunk//WorldWind//bin//Debug//Cache//Earth//SRTM//0//0007//633241183598281250//0007_0016.bil

高程数据的下载和纹理原理一样,只是增加了对数据的压缩,解压,所以类又往下继承了一层,压缩格式使用zip7z两种格式,ContentTypeZipContentType7z,也许在别的地方使用了更多的压缩格式,下次对总体的压缩解压做个全面总结再写个文档吧

 

二、             WW数据缓冲机制

l         纹理

当划分完层次的网格,填充完网格的坐标信息后,将先调用LoadFile()函数,若返回NULL,则先下载后渲染,非NULL则以返回的TexTure直接进行渲染,具体如下:

QuadTileSet.ImageStores[i].LoadFile(this)ImageStore.csLoadFile(QuadTile qt)先通过string filePath = GetLocalPath(qt)得到本地该纹理应该保存的路径,找到该路径和文件就加载。

l         高程信息

 

和纹理数绘类似,也是先判断所需要的高程信息文件是否存在,高程信息存储在类TerrainTile类中,TerrainTileFilePath是当前高程文件路径,

if(!File.Exists(TerrainTileFilePath))就会构造一个下载的TerrainDownloadRequest类:

TerrainDownloadRequest(this, m_owner, Row, Col, TargetLevel)加入下载队列,下载高度信息文件bil的压缩包,并解压到分配的目录,然后可以通过函数GetElevationAt(double latitude, double longitude)返回float的高度信息。

三、             数据压缩与解压

ICSharpCode.SharpZipLib.dll

WW的压缩解压算法是使用的一个C#写的开源的项目,可以在:

http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx上查到它的资料,SF上的网址为:http://sourceforge.net/projects/sharpdevelop/可以看到最新源码,支持多种平台,支持加密,两万多行代码,本想在今天总结下WW使用的压缩解压机制,发现无法全面,决定再用一天的时间看下这个项目,好做个全面点的总结,再以另外一个文档中写出来。

四、             数据传输协议

HTTP的超文本协议

 

也想罗索两句现在对WW的体会,代码中还有“not entirely sure if this is a good idea...”类的注释,在看喜马拉雅山那一块高度信息时,FPS一般只有10,有时候还不到7,看来对3D实时渲染这一块还有很长的路要走,LOD的算法也改了一次,但效率却并没有提高,只是算法能更容易让人理解,tile的划分也很简单,确实很简单,一目了解
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值