zoukankan      html  css  js  c++  java
  • 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)方法用来计算球面大圆弧上两个点的中间点坐标,区别为返回方式不一样,前者以输出参数的形式返回,后者以向量的形式返回。

  • 相关阅读:
    程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)
    最坏的不是面试被拒,而是没面试机会,以面试官视角分析哪些简历至少能有面试机会
    最近面了不少java开发,据此来说下我的感受:哪怕事先只准备1小时,成功概率也能大大提升
    Ribbon整合Eureka组件,以实现负载均衡
    时间对于程序员的价值,以及如何高效地利用时间,同时划分下勤奋度的等级
    面试过程中,可以通过提问环节的发挥,提升面试的成功率
    以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
    和小鲜肉相比,老程序员该由哪些优势?同时说下我看到的老程序员的三窟
    通过软引用和弱引用提升JVM内存使用性能的方法(面试时找机会说出,一定能提升成功率)
    Spring Clould负载均衡重要组件:Ribbon中重要类的用法
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/4584194.html
Copyright © 2011-2022 走看看