码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2015-06-17 19:53:36      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

星球类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

标签:

原文地址:http://www.cnblogs.com/rainbow70626/p/4584194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!