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()来载入相应的纹理效果文件并返回一个流。

时间: 2024-10-22 20:38:00

WorldWind源码剖析系列:四叉树瓦片类QuadTile的相关文章

WorldWind源码剖析系列:设置类SettingsBase

PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类SettingsBase内嵌了枚举型LocationType,子类WorldSettings的定义文件中附带了定义了测量模式的枚举型. 父类SettingsBase主要是对设置文件相关的设置文件名.版本.路径.载入.保存等于文件处理相关的顶层抽象.主要是以XML文件保存的,采用.NET平台提供的XmlSerial

WorldWind源码剖析系列:挂件类Widgets

WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D进行绘图和处理图标纹理影像等的操作,此处不再对各个类的主要的字段.属性和方法进行描述了.感兴趣的读者可以直接阅读源码.建议阅读源码之前读者应具备一定的DirectX3D开发基础. 挂件PictureBox类被WavingFlags.TimeController等插件引擎子类所引用. 挂件Button

WorldWind源码剖析系列:角度类

PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个Degrees属性,分别用数学引擎类的弧度和角度相互转换函数完成Radians字段值的设置与获取. public double Degrees { get { return MathEngine.RadiansToDegrees(this.Radians);} set { this.Radians =

WorldWind源码剖析系列:日志类Log

Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs : EventArgs//日志事件参数 { public int level; public string category; public string message; public LogEventArgs(int _l, string _c, string _m) { level = _l

WorldWind源码剖析系列:BMNG类构造函数深入分析

BMNG构造函数深入分析 一.主要类图 二.主要功能: 1)        BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括“ \Data\Earth\BmngBathy\”目录下的随源代码发布的12幅图像.从NASA服务器上下载的经过分层分级过的瓦片影像.根节点m_RenderableList主要用来存放下面三个RenderableObjectList类型对象:m_BlueMarbleList.m_ShadedList

WorldWind源码剖析系列:相机类[未完]

PluginSDK中的相机类CameraBase是三维计算机图形学中的概念.观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致.实际上,Direct3D和OpenGL都是先通过对现实世界中的场景先进行世界变换,再通过设置观察矩阵以在场景中安置一个虚拟相机,构建一个视景体来裁剪场景的可见区域,然后在通过投影变换(平行投影或透视投影),获取三维场景的“像”,最后再通过视口变换,将场景的“像”光栅化输出到二维显示屏幕上.如下图所示. 在三维地形系统中,通常定义一个虚拟相机来实现对三维场

WorldWind源码剖析系列:四元数类

PluginSDK中的Quaternion4d类可能是感觉Microsoft.DirectX. Quaternion类不太实用或不够用,自己有重新写的. 四元数是英国数学家哈密顿(W.R.Hamilton)在1843年发现的,由于矩阵论的不断丰富和不断完善,人们更乐意采用矩阵来解决实际工程中的问题,这导致四元数在相当长的时间里没有被人们重视,更没有得到实际的应用.随着计算机图形学的发展,人们发现利用四元数可以很好地处理解决旋转运算等问题,这一理论又开始被人们重视,并在许多领域逐渐得到应用. 四元

WorldWind源码剖析系列:缓冲类Cache

缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫游问题.该类类图如下. 提供的主要参数设置有:缓冲区上限CacheUpperLimit(默认最大为2GB).缓冲区上限CacheUpperLimit(默认最大为2GB).缓冲区下限CacheLowerLimit(默认上限的75%,即1.5GB).缓冲区目录CacheDirectory.缓冲区清理频率

WorldWind源码剖析系列:星球类World

星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染过程请参见文章<WorldWind源码剖析系列:星球经纬度格网的绘制>,是通过Form.OnPaint()函数激活.刷新和绘制的.星球球体的渲染过程请参见文章<WorldWind源码剖析系列:星球球体的加载与渲染>.而星球类World是绘制过程中从XML配置文件中读取参数构造的用来代表

WorldWind源码剖析系列:星球球体的加载与渲染

WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()依次作以下几个事情: 1.  使用System.Version在内部,读取软件版本信息,并格式化输出.我们在外面配置软件版本,“关于”部分中版本自动更改. 获取格式化版本号 // Establish the version number string used for user display, // such as the Splash and