星球类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. POJ1661(KB12-M DP)

    Help Jimmy Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无 ...

  2. Software-Defined Networking之搬砖的故事

    在很久很久以前,有一个村子. 村里的每一户,都有一个男人和一个女人. 每一户,都以搬砖为生. 从不同的地方,搬到不同的地方. 男人负责搬砖,女人负责告诉男人往哪搬. 每个家庭,都服从村委会的指挥. 村 ...

  3. JPA命名规则

    jpa中方法的命名规则必须按照严格的要求来写.不能随便的命名方法名字,具体的方法操作如下. 参照方法地址:https://blog.csdn.net/csdnchen666666/article/de ...

  4. Struts 2(二)

    一,框架的扩展名问题: ,struts2框架的默认扩展名:.action和空字符串.在框架的属性文件default.properties中进行默认配置:struts.action.extension= ...

  5. Vue + Spring Boot从零开始搭建个人网站(一) 之 项目前端Vue.js环境搭建

    前言: 最近在考虑搭建个人网站,想了想决定采用前后端分离模式 前端使用Vue,负责接收数据 后端使用Spring Boot,负责提供前端需要的API 就这样开启了我边学习边实践之旅 Vue环境搭建步骤 ...

  6. 常用的第三方模块 chardet url

    chardet 字符串编码一直是令人非常头疼的问题,尤其是我们在处理一些不规范的第三方网页的时候.虽然Python提供了Unicode表示的str和bytes两种数据类型,并且可以通过encode() ...

  7. Java实现后缀表达式建立表达式树

    概述 表达式树的特点:叶节点是操作数,其他节点为操作符.由于一般的操作符都是二元的,所以表达式树一般都是二叉树. 根据后缀表达式"ab+cde+**"建立一颗树 文字描述: 如同后 ...

  8. Sql server中的 nvarchar(max) 到底有多大?(转载)

    问题: SQL server中的nvarchar(max)最大的长度是4000个字吗? 如果字段的内容超过4000个字时用什么类型呢?text 还是binary?他们的最大长度是多少?比如字段放的是长 ...

  9. 【gp数据库】你一定会用到的运维语句宝典

    -- 查询未空闲的进程信息 select * from pg_stat_activity where current_query<>'<IDLE>'; 结果可查看数据库名,进程 ...

  10. Oracle中,时间的相关操作方法

    无论是DATE还是timestamp都可以进行加减操作.可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 加 ...