网友投稿 | 设为首页 | 加入收藏
1/1页1 跳转到查看:7565
回复该主题 发新话题
键盘左右键可以进行前后翻页操作
帮助

[原创]WW学习总结二

[原创]WW学习总结二

主要是关于World Wind的纹理,高程信息下载,渲染调度策略,缓冲机制的实现的一些简短总结,



也算是对WW通信的一个初步了解吧



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





老毛病,发个链接先(一些简单图可以看到,下次找个小工具画画流程图,想图比我打字管用多了吧

http://blog.csdn.net/paul_xj/archive/2007/08/31/1767012.aspx



一、             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.cs的CreateDownloadRectangle函数,以



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



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



l         CalculateScore()函数的说明:



是抽像类DowndloadRqeuest的纯虚函数,具体实现在ImageTileRequest.cs和BoundingBox.cs中,传入当前camera,和当前tile矩形的四个顶点,返回矩形对角线长度的float形数,为简化算法,将返回值(sqrt(tri1SqArea)+sqrt(tri2SqArea))/2用tri1SqArea + 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=7(URL)



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



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


 



二、             WW数据缓冲机制



l         纹理



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



QuadTileSet.ImageStores.LoadFile(this),ImageStore.cs的LoadFile(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的超文本协议

TOP

 

re:写得很好,看后能对world wind的...

写得很好,看后能对world wind的一些机制有一点的了解,学习



楼主辛苦了

TOP

 

re:好深……

好深……

TOP

 

re:楼主辛苦了

楼主辛苦了

TOP

 

re:辛苦了

辛苦了

TOP

 

顶一下吧,就是纹理和高层的实现还是不太清楚

TOP

 
1/1页1 跳转到
回复该主题 发表新主题
  <<上一主题 | 下一主题>>