星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球、火星等。该类的类图如下。

需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的。经纬网格的渲染过程请参见文章《WorldWind源码剖析系列:星球经纬度格网的绘制》,是通过Form.OnPaint()函数激活、刷新和绘制的。星球球体的渲染过程请参见文章《WorldWind源码剖析系列:星球球体的加载与渲染》。而星球类World是绘制过程中从XML配置文件中读取参数构造的用来代表星球的类。

星球类World包含的主要的字段、属性和方法如下:

public static WorldSettings Settings = new WorldSettings();//星球的设置参数

double equatorialRadius; //星球的赤道半径

const double flattening = 6378.135; //星球的赤道半径,单位:千米

const double SemiMajorAxis = 6378137.0; //星球的短半轴长度,单位:米

const double SemiMinorAxis = 6356752.31425; //星球的长半轴长度,单位:米

TerrainAccessor _terrainAccessor; //星球的地形访问器

RenderableObjectList _renderableObjects; //星球的可渲染对象列表

private System.Collections.IList onScreenMessages; //星球的消息列表

private DateTime lastElevationUpdate = System.DateTime.Now; //高程最后更新时间

WorldSurfaceRenderer m_WorldSurfaceRenderer = null; //星球的表面渲染器

public bool IsEarth//该属性用来判断当前渲染的星球是否是地球

ProjectedVectorRenderer m_projectedVectorRenderer = null; //星球投影后的向量渲染器

public AtmosphericScatteringSphere m_outerSphere = null;//星球外面的大气层散射球类

Sprite m_sprite = null;//Direct3D的精灵类

Texture m_sunTexture = null; //Direct3D的纹理类

SurfaceDescription m_sunSurfaceDescription; //Direct3D的表面描述类

int m_sunWidth = 72;

int m_sunHeight = 72;

静态构造函数static World()目前未实现任何功能。非静态构造函数public World(string name, Vector3 position, Quaternion orientation, double equatorialRadius,string cacheDirectory,TerrainAccessor terrainAccessor)用指定的星球名称、中心位置、方向四元数,赤道半径、缓冲区目录和相应的地形访问器来实例化一个星球对象。该构造函数被配置载入器类的静态函数Load()调用,从而用来构造并返回一个星球对象,如下面代码所示:

WorldWind.ConfigurationLoader.Load(worldXmlDescriptorFile.FullName, worldWindow.Cache);

public void SetLayerOpacity(string category, string name, float opacity)和private void setLayerOpacity(RenderableObject ro, string category, string name, float opacity) 方法用来设置图层的不透明度。

private static string getRenderablePathString(RenderableObject renderable)方法用来获取可渲染的路径字符串,内部递归地调用自身。

public static void LoadSettings()方法用来从默认的路径位置反序列化生成星球设置类WorldSettings对象。public static void LoadSettings(string directory) 方法用来从指定的路径位置反序列化生成星球设置类WorldSettings对象。

public override void Initialize(DrawArgs drawArgs) 方法用指定的绘制参数对象drawArgs来初始化星球对象及其所关联的可渲染子对象列表。

private void DrawAxis(DrawArgs drawArgs) 方法用来绘制地轴

public override void Update(DrawArgs drawArgs) 方法用来更新当前场景

public override bool PerformSelectionAction(DrawArgs drawArgs)方法是重载父类的同名函数,内部调用的是可渲染对象列表类RenderableObjectList的同名重载函数,该函数内部又通过调用可渲染对象类RenderableObject的同名重载函数。由于根类的RenderableObject函数时抽象函数,所以最终调用的是从可渲染对象类RenderableObject派生出来的各个可渲染子类,最终实现“执行选取操作”的功能。

private void RenderSun(DrawArgs drawArgs) 方法用指定的绘制参数对象drawArgs来绘制太阳。

public override void Render(DrawArgs drawArgs)方法重载父类的同名函数。通过调用各个绘制某一类元素的函数来实现绘制星球对象及其所关联的可渲染子对象列表。

private void RenderStars(DrawArgs drawArgs,RenderableObject renderable) 方法用指定的绘制参数对象drawArgs来绘制星星。

private void Render(WorldWind.Renderable.RenderableObject renderable, WorldWind.Renderable.RenderPriority priority, DrawArgs drawArgs) 方法用来绘制继承自可渲染对象类RenderableObject的子类对象。

private void saveRenderableState(RenderableObject ro)方法用来保存单个可渲染对象的状态。

private void saveRenderableStates(RenderableObjectList rol) 方法用来保存可渲染对象列表中所包含的多个对象的状态。

public static Angle ApproxAngularDistance(Angle latA, Angle lonA, Angle latB, Angle lonB)计算两个点对之间的大圆距离。

public double ApproxDistance(Angle latA, Angle lonA, Angle latB, Angle lonB) 计算两个点对之间的以米为单位的距离,调用上面的函数

public static void IntermediateGCPoint(float f, Angle lat1, Angle lon1, Angle lat2, Angle lon2, Angle d,out Angle lat, out Angle lon)和public Vector3 IntermediateGCPoint(float f, Angle lat1, Angle lon1, Angle lat2, Angle lon2, Angle d)方法用来计算球面大圆弧上两个点的中间点坐标,区别为返回方式不一样,前者以输出参数的形式返回,后者以向量的形式返回。

WorldWind源码剖析系列:星球类World的更多相关文章

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

    WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...

  2. WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer

    星球表面渲染类WorldSurfaceRenderer描述如何渲染星球类(如地球)表面影像纹理.该类的类图如下. 星球类World包含的主要的字段.属性和方法如下: public const int ...

  3. WorldWind源码剖析系列:表面影像类SurfaceImage

    表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath ...

  4. WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore

    影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...

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

    PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...

  6. WorldWind源码剖析系列:表面瓦片类SurfaceTile

    表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...

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

    WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...

  8. WorldWind源码剖析系列:大气层散射球类AtmosphericScatteringSphere

    大气层散射球类AtmosphericScatteringSphere代表地球外面的大气层散射球模型,可以控制开启/关闭渲染该对象.该类的类图如下. 该类所包含的主要字段.属性和方法如下: public ...

  9. WorldWind源码剖析系列:外包围盒类BoundingBox和外包围球类BoundingSphere

    PluginSDK中的外包围盒.外包围球分别用类 BoundingBox和BoundingSphere描述,其类图如下所示. 外包围盒BoundingBox类的corners字段用来存储外包围盒的8个 ...

随机推荐

  1. 积分之迷-2015决赛C语言B组第一题

    标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 ...

  2. 求解方程A5+B5+C5+D5+E5=F5

    方程A5+B5+C5+D5+E5=F5刚好有一个满足0<A≤B≤C≤D≤E≤F≤75的整数解.请编写一个求出该解的程序: using System; namespace ReverseTheEx ...

  3. volatile关键值

    happens-before原则 我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens- ...

  4. 服务注册中心Eureka vs Zookeeper vs Consul

    前言 在现在云计算和大数据快速发展的今天,业务快速发展和变化.我们以前的单一应用难以应对这种快速的变化, 因此我们需要将以前单一的大应用不断进行差分,分成若干微小的应用或者服务,这就是微服务的思想.但 ...

  5. python学习之老男孩python全栈第九期_day005作业

    1,有如下变量(tu是个元组),请实现要求的功能. tu = ("alex", [11, 22, {"k1": 'v1', "k2": [& ...

  6. Angular echarts图表自适应屏幕指令

    关于echarts图表自适应问题 一.引入js文件 1. 在html页面引入angular.min.js文件 2. 在html页面引入echarts.min.js文件 3. 在html页面引入app. ...

  7. AJAX通过HTML请求C#一般处理程序

    AJAX通过HTML请求C#一般处理程序 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"&g ...

  8. onkeydown小练习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. C# dynamic类型报错:“object”不包含“xxx”的定义

    一.起因: 最近在做的一个项目,因为很多地方要用到同一套流程.为了后期维护,要求将共用流程进行抽离,创建为一个公用的类库.在抽离之前程序运行是没有问题的,然而在抽离之后就得到了如题错误: object ...

  10. SD从零开始59-61,跨公司的库存转移,Interface 修改,可用性检查和需求传递

    [原创]SD从零开始59 跨公司的库存转移处理流程 库存转移流程Stock Transfer Procedure 2个工厂间的库存转移能够使用不同的流程来执行: 只执行一个库存转移记账的流程使用MM库 ...