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 ...
随机推荐
- Django-url反向解析和命名空间
一.urls硬编码 在反向解析和命名空间之前我们先来说说URLS硬编码,用django 开发应用的时候,可以完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRed ...
- lamp配置多个虚拟站点
在同一ip下添加多个域名站点! 1.查看ip 命令:ifconfig 2.添加域名 命令:vi /etc/hosts 输入域名:如 192.168.160.127 www.test.com 192 ...
- 从0x7fffffff+1开始的数学期望
-2147483648 Impel Down 蒙奇·D·路飞来到海底监狱Impel Down营救他的哥哥波特卡斯·D·艾斯 n+1层的海底监狱有n个电梯,每个电梯连接着上下两层 不幸的是,这些电梯是& ...
- 常用,好用的js代码
记录看到或者用到的js代码,长期更新! 判断是否是正整数 (number-0)|0 !== number-0 解析: number-0 转换成数字,再通过位移运算(|)判断是否跟原数字相等 安全检查j ...
- git 常见命令,规范 整理
move commit to stage area(把本地的1个commit还原到 暂存区) git reset --soft HEAD~1 把其他的commit的合并到现在到分支:git cherr ...
- cmd--命令短集
查看ip地址:ipconfig 查看ip地址:ipconfig/all 进入c盘program files目录下:cd %Program Files%,”x:“, 进入x盘根目录.cd “ ”进入某文 ...
- eclipse以O开头的版本安装tomcat插件
最近闲着无聊想着捣鼓下java web ,轻车熟路的在eclipse下载好IDE,有强迫症的我下载了最新版本的(2017-10),然而下载过来的IDE真的是纯净版的,连java web 的new pr ...
- jQuery获取json数据
出自---小瓶子编辑 $.each()方法接受两个参数,第一个是需要遍历的对象集合(JSON对象集合),第二个是用来遍历的方法,这个方法又接受两个参数,第一个是遍历的index,第二个是当前遍历的值. ...
- GridLayout和GridView的区别
GridView是一种适配器布局,它的继承关系是ViewGroup-->AdapterView-->AbsListView-->GridView,他是从一个adapter中取出内容填 ...
- 绝版Node--Sequlize搭建服务(Node全栈之路 二)
在Node全栈之路(一),也就是上篇文章中,我们讲到了sequlize的基本增删该查,这篇文章,我们在上篇文章的基础上继续探讨,讲一下关于sequlize创建的表之间的对应关系 参考资料:https: ...