WorldWind源码剖析系列:经纬度格网类LatLongGrid
经纬度格网类LatLongGrid继承自可渲染对象类RenderableObject,是WorldWind中用来在星球外表绘制经纬度格网的封装类。其类图如下所示。
绘制经纬网格的主体函数为Render(),其内部主要调用以下函数完成绘制:
ComputeGridValues()//计算格网值 RenderTropicLine()//绘制回归线
计算格网值ComputeGridValues()内部通过相机的真实视场角drawArgs.WorldCamera.TrueViewRange.Radians来指定经纬网格的纬度分割间隔为1、2、5、10四类,然后指定经度分割间隔等于纬度间隔。接下来,判断当前相机的视景体是否包含南北极点,如果包含,则将指定经度分割间隔等于10度,从而使极点部分的经纬网格分割间隔比较大,而不用绘制的非常密集。接着,计算相机可视场景的最大/小可见经度值,最大/小可见纬度值,均取整型。且当经度分割间隔等于10度时,最小可见经度等于-180度,最大可见经度等于180度。接着,计算沿经度方向分割时每一行分割点数,沿纬度方向分割时每一列分割点数,均比分割出来的单元格行数、列数大1,这和我先前一篇博客文章《基于DirectX的半球形天空类的C++和C#实现》中的做法是一样的,这样做都是为了使球体首尾互相衔接。然后求出经度点数(行向)和纬度点数(列向)之间的较大值,然后利用该值来申请星球体划分时所需要的存储的三维坐标点空间:
if (lineVertices == null || vertexPointCount > lineVertices.Length) lineVertices = new CustomVertex.PositionColored[Math.Max(LatitudePointCount, LongitudePointCount)];
接着,设置星球的经纬网格所在的球体半径为为构造该类对象时传入的星球对象World所携带的半径值。 接下来要判断当前相机的高度是否小于0.1*WorldRadius;如果是则不开启Zbuffer深度测试。如果否则开启Zbuffer深度测试,且设置1.01* WorldRadius和(WorldRadius + 0.015f * drawArgs.WorldCamera.Altitude)两个值之间的较大者,最终为星球的经纬网格所在的球体半径。
接下来,就按照DirectX 3D的固定图形渲染管线设置是否开启Zbuffer深度测试、设置纹理阶段颜色操作ColorOperation、设置顶点格式VertexFormat、设置世界变换矩阵drawArgs.device.Transform.World、设置关闭渲染状态光照效果drawArgs.device.RenderState.Lighting。经纬网格每一个交点都是通过将格网点的球面坐标转换为笛卡尔控件直角坐标得到的,通过下面的公式将网格定点的球面坐标转换为空间直角坐标来获得逼近的半球面格网剖分模型。
其中,其中B和L分别为球体的经度和纬度,取值范围为:-PI/2≤B≤PI/2,-PI≤L≤PI,R为设定的球体半径。可以使用、、、坐标来生成所需要的球面格网。根据不同的精度要求,可对纬向和经向剖分间隔设置不同的值。
纹理坐标可以首先根据纬向和经向剖分间隔分别计算出纬向和经向剖分网格点数,然后根据当前球面坐标计算出格网点所在的纬向和经向网格行列号,最后根据下面公式计算出云彩贴图的纹理坐标。其中,先将当前行号和列号强制取浮点型是为了保证除法运算按浮点型运算,使最终结果落在[0.0,1.0]之间。详细代码请参照我先前的一篇博客文章《基于DirectX的半球形天空类的C++和C#实现》。
最后,通过两个双重循环依次绘制经度格网线、经度值标签、纬度格网线、纬度值标签。绘制经纬格网时指定的图元类型为线条带PrimitiveType.LineStrip,分别是沿经线方向和纬线方向绘制。详细实现代码请参见PluginSDK工程下面的LatLongGrid.cs文件。
注意:(1)经度是由经度线和经度标签构成。(2)纬度是由纬度线和纬度标签构成。
WorldWind源码剖析系列:经纬度格网类LatLongGrid的更多相关文章
- WorldWind源码剖析系列:表面影像类SurfaceImage
表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath ...
- WorldWind源码剖析系列:影像图层类ImageLayer
影像图层类ImageLayer 影像图层类ImageLayer将单张影像作为纹理映射到星球表面上去.源影像必须是平面笛卡尔坐标系.该类的类图如下. 影像图层类ImageLayer提供的主要字段.属性和 ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
- WorldWind源码剖析系列:数学引擎类MathEngine
PluginSDK中的MathEngine类是密封类.不可继承,主要完成通用的数学计算功能.由于按平面展开层层划分,所以在WW里用到一个row,col的概念,类MathEngine封装了从行/列到经/ ...
- WorldWind源码剖析系列:表面瓦片类SurfaceTile
表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...
- WorldWind源码剖析系列:四叉树瓦片类QuadTile
四叉树瓦片类QuadTile提供了对影像和地形数据的四叉树访问模型.该类的类图如下. 四叉树瓦片类QuadTile提供的主要字段.属性和方法简要描述如下: public QuadTileSet Qua ...
- WorldWind源码剖析系列:下载请求类DownloadRequest
下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadReques ...
- WorldWind源码剖析系列:绘制参数类DrawArgs
绘制参数类DrawArgs主要对绘制时需要的对象如:设备对象Microsoft.DirectX.Direct3D.Device.Microsoft.DirectX.Direct3D.Font字体对象. ...
- WorldWind源码剖析系列:代理助手类ProxyHelper
代理助手类ProxyHelper通过平台调用的互操作技术封送了若干Win32结构体和函数.该类类图如下. 提供的主要处理方法基本上都是静态函数,简要描述如下: 内嵌类型WINHTTP_AUTOPROX ...
- WorldWind源码剖析系列:网络下载类WebDownload
网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...
随机推荐
- SourceTree这是一个无效的源路径
工具->选项:修改一般下面的SSH客户端为OpenSSH
- EF CodeFirst(三) 并发处理
并发分为两种,一种叫做悲观并发,一种叫乐观并发. 名字挺文艺 悲观并发 悲观并发是什么呢? 就拿我们常用的代码版本控制来说. 有一个文档,A和B都要 获取这个文档并进行修改, 如果当A在读取这个文档数 ...
- Spring Data Solr —— 快速入门
Solr是基于Lucene(全文检索引擎)开发,它是一个独立系统,运行在Tomcat或Jetty(solr6以上集成了jetty,无需再部署到servlet容器上),但其原生中文的分词词功能不行,需要 ...
- POJ2478(SummerTrainingDay04-E 欧拉函数)
Farey Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16927 Accepted: 6764 D ...
- Flask中request参数
首先要明确一件事,Request这是个对象,不管使用PHP还是python还是什么java语言,虽然request这个对象可能叫的名字不一样,(在其他语言中可能叫什么HttpRequest),但是原理 ...
- 通过ssh实现远程登陆服务器!
通过ssh实现远程登陆前提是服务器已经开启ssh服务,至于怎么开启,可以参看上一篇“Linux服务器开启ssh服务,实现ssh远程登陆!”! 使用ssh登陆时,输入主机(linux的ip地址),账号, ...
- 借助form表单向web服务器发送消息
form表单是常用的,在网页浏览器中 用户点击的请求经htto协议发送回web容器,请求处理 建立用户的页面 <!DOCTYPE html> <html> <head&g ...
- GDAL打开HDF格式时遇到的中文路径问题(未解决)
众所周知,中文环境下(VS2010 C++工程编码为多字节编码),在使用1.8.0版本以后的GDAL打开中文路径下的影像文件(如GeoTiff文件)时, 需对中文文件路径做特殊处理,有2种方法:(我使 ...
- Android手机上,利用bat脚本模拟用户操作
………… 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行 ...
- LeetCode题解之N-ary Tree Postorder Traversal
1.题目描述 2.问题分析 递归. 3.代码 vector<int> postorder(Node* root) { vector<int> v; postNorder(roo ...