WorldWind源码剖析系列:四叉树瓦片类QuadTile
四叉树瓦片类QuadTile提供了对影像和地形数据的四叉树访问模型。该类的类图如下。

四叉树瓦片类QuadTile提供的主要字段、属性和方法简要描述如下:
public QuadTileSet QuadTileSet;//四叉树瓦片集合类
public double West;//瓦片的西边界,角度为单位
public double East;//瓦片的东边界
public double North;//瓦片的北边界
public double South;//瓦片的南边界
public Angle CenterLatitude;//瓦片中心纬度,弧度为单位
public Angle CenterLongitude;//瓦片中心经度
public double LatitudeSpan;//瓦片纬度范围,角度为单位
public double LongitudeSpan;//瓦片经度范围
public int Level; //瓦片所属层级
public int Row; //瓦片所属行号
public int Col; //瓦片所属列号
public bool isInitialized;//瓦片是否被初始化
public BoundingBox BoundingBox; //瓦片的包围盒
public GeoSpatialDownloadRequest DownloadRequest; //瓦片的下载请求
protected Texture[] textures; //瓦片的纹理数组
protected static int vertexCount = 40;//子平面格网中的点数
protected static int vertexCountElevated = 40; //子地形格网中的点数
protected QuadTile northWestChild;//西北角子瓦片
protected QuadTile southWestChild; //西南角子瓦片
protected QuadTile northEastChild; //东的北角子瓦片
protected QuadTile southEastChild; //东南角子瓦片
protected CustomVertex.PositionNormalTextured[] northWestVertices;
protected CustomVertex.PositionNormalTextured[] southWestVertices;
protected CustomVertex.PositionNormalTextured[] northEastVertices;
protected CustomVertex.PositionNormalTextured[] southEastVertices;
protected short[] vertexIndexes;//顶点索引数组
protected Point3d localOrigin;//Add this offset to get world coordinates
protected bool m_isResetingCache;//是否重置缓冲区
protected float verticalExaggeration;//竖直放大倍数
protected bool isDownloadingTerrain;//是否正在下载地形数据
public bool WaitingForDownload = false;//是否等待下载
public bool IsDownloadingImage = false;//是否正在下载影像数据
double meshBaseRadius = 0;.//格网基本半径大小
protected byte m_CurrentOpacity = 255;//当前的不透明度
public string ImageFilePath = null;//影像纹理的路径
protected CustomVertex.PositionColored[] downloadRectangle = new CustomVertex.PositionColored[5];//下载的影像或地形区域的矩形标记区
static Effect grayscaleEffect = null;//DirectX 3D的效果变量
构造函数public QuadTile(double south, double north, double west, double east, int level, QuadTileSet quadTileSet)用东、西、南、北四个边界,瓦片层级以及所包含的四叉树瓦片集合来实例化一个瓦片对象。其中,需要调用double radCosLat = radius * Math.Cos(latRadians);计算出纬度值为latRadians处的纬度圈的半径,调用MathEngine.GetRowFromLatitude(South, North - South);根据瓦片的起始边界和瓦片尺寸大小计算出瓦片所在的行号和列号。
public virtual void ResetCache()虚函数用来重置缓冲区。
private QuadTile ComputeChild(double childSouth, double childNorth, double childWest, double childEast)方法根据指定的位置计算子四叉树瓦片,内部实际是直接调用构造函数QuadTile实例化一个四叉树瓦片对象并返回。
public virtual void ComputeChildren(DrawArgs drawArgs)方法根据具体的绘制参数计算子四叉树瓦片。内部调用了ComputeChild()函数来完成具体功能。
public virtual void Update(DrawArgs drawArgs) 方法根据具体的绘制参数更新渲染场景的地形和影像瓦片数据,内部递归地调用自身。
public virtual void CreateTileMesh()方法为当前格网构建平面格网和地形格网。内部实际上是用过调CreateElevatedMesh()和CreateFlatMesh()方法实现。
protected virtual void CreateFlatMesh()用来构建没有地形起伏的平面格网。
protected virtual void CreateElevatedMesh()用来构建具有地形起伏的地形格网。内部实际通过调用protected void CreateElevatedMesh(ChildLocation corner, CustomVertex.PositionNormalTextured[] vertices,double meshBaseRadius, float[,] heightData)函数实现具体功能。
private void calculate_normals(ref CustomVertex.PositionNormalTextured[] vertices, short[] indices)计算格网顶点的法线,以便启用光照。
private Point3d ProjectOnMeshBase(Point3d p)私用方法用来将点p投影到各瓦网基准平面。
public virtual bool Render(DrawArgs drawArgs)方法根据具体的绘制参数完成场景的渲染和绘制功能。
public void RenderDownloadRectangle(DrawArgs drawArgs, int color, Vector3 referenceCenter)用一个带有颜色的矩形区域标记下载的影像或地形区域。
void Render(Device device, CustomVertex.PositionNormalTextured[] verts, QuadTile child)方法利用可选择的下载索引器来渲染四叉树瓦片的某一个子瓦片,被函数bool Render(DrawArgs drawArgs)调用。
void device_DeviceReset(object sender, EventArgs e)方法实现DirectX 3D渲染是的图形绘制设备重置。内部要调用Assembly类的虚函数GetManifestResourceStream()来载入相应的纹理效果文件并返回一个流。
WorldWind源码剖析系列:四叉树瓦片类QuadTile的更多相关文章
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
- WorldWind源码剖析系列:挂件类Widgets
WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...
- WorldWind源码剖析系列:BMNG类构造函数深入分析
BMNG构造函数深入分析 一.主要类图 二.主要功能: 1) BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括 ...
- WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler
插件类Plugin是所有由插件编译器加载的插件子类的抽象父类,提供对插件的轻量级的访问控制功能. 插件信息类PluginInfo用来存储关于某个插件的信息的类,可以理解为对插件类Plugin类的进一步 ...
- WorldWind源码剖析系列:日志类Log
Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs ...
- WorldWind源码剖析系列:相机类CameraBase
相机基类CameraBase PluginSDK中的相机类CameraBase是三维计算机图形学中的概念.观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致.实际上,Direct3D和 ...
- WorldWind源码剖析系列:角度类Angle
PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个D ...
- WorldWind源码剖析系列:缓冲类Cache
缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫 ...
- WorldWind源码剖析系列:四元数类Quaternion
PluginSDK中的Quaternion4d类可能是感觉Microsoft.DirectX. Quaternion类不太实用或不够用,自己有重新写的. 四元数是英国数学家哈密顿(W.R.Hamilt ...
- WorldWind源码剖析系列:星球类World
星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染 ...
随机推荐
- Mybatis一对一,一对多
一对一 假如有student表(学生表)和student_card表(学生证表). student表中有一个字段self_card用来查student_card,student_card表中有一个st ...
- HDU4417(SummerTrainingDay08-N 主席树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 5月9日——vue渲染过程中{{xxx}}显示
异常显示的原因: 这是由于浏览器的渲染机制导致的,浏览器是从头到尾 如果你的js引用在底部,那么浏览器会先加载dom此时,你用于渲染的{{}}识别符,因为还没读到该识别符对应的js文件,所以会被解析 ...
- layui的checkbox示例
1.html页面: var isSkipcheckbox = ''; if (appOptions.isSkip != "0") { isSkipcheckbox = 'check ...
- AJAX删除事件与加载数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Jaguar_websocket结合Flutter搭建简单聊天室
1.定义消息 在开始建立webSocket之前,我们需要定义消息,如:发送人,发送时间,发送人id等.. import 'dart:convert'; class ChatMessageData { ...
- JSTL核心标签库——错误处理标签
<c:catch>标签 Demo: 错误发生时,不转发至其他网页来显示错误信息,而在当前网页捕捉异常,并显示相关信息. <%@page contentType="text/ ...
- rdlc里面的textbox怎么赋值
通过传递参数来实现 当前在rdlc页面,ctrl+alt+d,打开report data侧边栏 点击report data的Parameters文件夹,右键,添加新的参数,命名.定义类型,譬如命名为R ...
- python基础一数据类型之字符串
摘要: python基础一中有字符串,所以这篇主要讲字符串. 一,字符串的注释 二,字符串的索引与切片 三,字符串的方法 一,字符串的注释 单引号 双引号 三引号都可以用户定义字符串.三引号不仅可以定 ...
- SQL Server 当表分区遇上唯一约束(转载)
一.前言 我已经在高兴对服务器创建了表分区并且获得良好性能和自动化管理分区切换的时候,某一天,开发人员告诉我,某表的两个字段的数据不唯一,需要为这两个字段创建唯一索引的时候,这一切就变得不完美了.列的 ...