WorldWind源码剖析系列:星球类World
星球类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的更多相关文章
- WorldWind源码剖析系列:星球球体的加载与渲染
WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...
- WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer
星球表面渲染类WorldSurfaceRenderer描述如何渲染星球类(如地球)表面影像纹理.该类的类图如下. 星球类World包含的主要的字段.属性和方法如下: public const int ...
- WorldWind源码剖析系列:表面影像类SurfaceImage
表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
- WorldWind源码剖析系列:表面瓦片类SurfaceTile
表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...
- WorldWind源码剖析系列:挂件类Widgets
WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...
- WorldWind源码剖析系列:大气层散射球类AtmosphericScatteringSphere
大气层散射球类AtmosphericScatteringSphere代表地球外面的大气层散射球模型,可以控制开启/关闭渲染该对象.该类的类图如下. 该类所包含的主要字段.属性和方法如下: public ...
- WorldWind源码剖析系列:外包围盒类BoundingBox和外包围球类BoundingSphere
PluginSDK中的外包围盒.外包围球分别用类 BoundingBox和BoundingSphere描述,其类图如下所示. 外包围盒BoundingBox类的corners字段用来存储外包围盒的8个 ...
随机推荐
- 如何解决WEB应用中文乱码问题
最容易出现乱码的场景是浏览器向服务器发送请求的过程,解决的策略就是强制为请求和响应设置编码格式. 一.POST 方式请求乱码 1. 在每个 Controller 中单独处理 request.setCh ...
- oracle逐步学习总结之权限和角色(基础六)
原创作品,转自请注明出处:https://www.cnblogs.com/sunshine5683/p/10236129.html 继续上节的索引,这次主要总结oracle数据库的权限问题!(在总结的 ...
- Python paramiko ssh 在同一个session里run多个命令
import threading, paramiko strdata='' fulldata='' class ssh: shell = None client = None transport = ...
- BZOJ4373: 算术天才⑨与等差数列(线段树 hash?)
题意 题目链接 Sol 正经做法不会,听lxl讲了一种很神奇的方法 我们考虑如果满足条件,那么需要具备什么条件 设mx为询问区间最大值,mn为询问区间最小值 mx - mn = (r - l) * k ...
- HttpClient的用法
客户端模拟http请求工具 Postmen(谷歌插件).RestClient 服务器模拟http请求工具 httpclient.HttpURLConnection httpCient请求代码 /** ...
- Asp.net MVC检测到有潜在危险的 Request.Form 值
解决方法很简单,不像网上说的那么麻烦.只需一步: [ValidateInput(false)] public ActionResult Test(){ }
- CAC的Debian-8-64bit安装BBR正确打开方式
装过三台debian 64 bit, CAC, 2欧, KVM虚拟机 做法都一样---下面说下正确安装方式 0. 有装锐速记得先删除,免得换核心后,锐速在扯后腿. 1.换4.9版kernel ...
- Oracle数据库 插入数据格式,简单查询
操作练习代码,知识点往下翻 TRUNCATE TABLE hehe1111; select * from hehe1111; desc hehe1111; ,'); ,'); ,'); ,'); ,' ...
- 表迁移工具的选型-复制ibd的方法-传输表空间
1.1. 场景 有的时候开放人员自己的库需要帮忙导一些数据,但是表的数据量又很大.虽然说使用mysqldump或mysqlpump也可以导.但是这耗时需要比较久. 记得之前建议开放人员可以直接使用na ...
- 【转】Java学习---算法那些事
[更多参考] LeetCode算法 每日一题 1: Two Sum ----> 更多参考[今日头条--松鼠游学] 史上最全的五大算法总结 Java学习---7大经典的排序算法总结实现 程序员都应 ...