转载 worldwind学习笔记之二
2012-04-02 23:01
197 查看
worldwind学习笔记之二
转载自:/article/9891454.html
这两次写的都很粗糙个人感觉,希望下次找个工具可以把流程图,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 类结构图
![](http://p.blog.csdn.net/images/p_blog_csdn_net/paul_xj/001.JPG)
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.
高程信息
![](http://p.blog.csdn.net/images/p_blog_csdn_net/paul_xj/002.JPG)
下载的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[i].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的超文本协议
也想罗索两句现在对WW的体会,代码中还有“not entirely sure if this is a good idea...”类的注释,在看喜马拉雅山那一块高度信息时,FPS一般只有10,有时候还不到7,看来对3D实时渲染这一块还有很长的路要走,LOD的算法也改了一次,但效率却并没有提高,只是算法能更容易让人理解,tile的划分也很简单,确实很简单,一目了解
转载自:/article/9891454.html
这两次写的都很粗糙个人感觉,希望下次找个工具可以把流程图,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 |
同时进行的下载进程为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 |
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[i].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的超文本协议
也想罗索两句现在对WW的体会,代码中还有“not entirely sure if this is a good idea...”类的注释,在看喜马拉雅山那一块高度信息时,FPS一般只有10,有时候还不到7,看来对3D实时渲染这一块还有很长的路要走,LOD的算法也改了一次,但效率却并没有提高,只是算法能更容易让人理解,tile的划分也很简单,确实很简单,一目了解
相关文章推荐
- 博科SAN交换机学习笔记之二:配置文件备份与固件升级 作者 LiaoJL | 转载时请务必以超链接形式标明文章原文链接和作者信息及本版权声明。 原文链接:http://www.liaojl.co
- 转载 worldwind 学习笔记之一
- [MDX学习笔记之二]在MDX中处理边界情况
- 委托学习笔记一(调用委托) (转载)
- 软件测试自动化学习笔记之二
- 【转载】WPF 学习笔记Binding连载
- 转载一个不错的Scrapy学习博客笔记
- 【转载】MongoDB学习笔记(查询)
- [转载]AngularJs学习笔记--directive
- 从零开始系列-R语言基础学习笔记之二 数据结构(一)
- (转载)Deep Learning(深度学习)学习笔记整理系列之(八)
- 正则表达式学习笔记 (转载)
- [ASP.NET学习笔记之二]数据集和数据库的同步-DataAdapter的使用
- python 3.0学习笔记之二------python基础小知识
- wcf 学习笔记一 服务寄存到iis(个人写,非转载)
- 接口学习笔记一(转载)
- 关于Golang中database/sql包的学习笔记(转载)
- PHP面向对象学习笔记之二:生成对象的设计模式
- html5学习笔记7-第二章上机(之二)
- 水晶报表的一些学习笔记(使用特殊字体实现特殊报表效果【转载】)