大气层散射球类AtmosphericScatteringSphere代表地球外面的大气层散射球模型,可以控制开启/关闭渲染该对象。该类的类图如下。

该类所包含的主要字段、属性和方法如下:

public float m_radius;//大气层散射球半径,默认为地球赤道半径的1.025倍

protected int m_numberSlices; //大气层散射球切片数目,默认为75

protected int m_numberSections; //大气层散射球半径分割段数,默认为75

public static float m_fInnerRadius = 0; //大气层散射球内半径

public static float m_fOuterRadius = 0; //大气层散射球外半径

public static int TilesHigh = 4; //大气层散射球瓦片高度

public static int TilesWide = 8; //大气层散射球瓦片宽度

System.Collections.Generic.List<MeshSubset> m_meshList = new System.Collections.Generic.List<MeshSubset>();//存储大气层散射球剖分的格网子集

Vector3 m_lastSunPosition = Vector3.Empty;//太阳位置

System.Threading.Thread m_backgroundThread = null;//渲染大气层散射球的后台线程

bool active = false;//是否激活大气层散射球

System.DateTime m_lastOpticalUpdate = System.DateTime.MinValue; //大气层散射球最后的不透明度更新时间

bool m_canDoShaders = false;//是否能够执行着色器

short[] m_indices = null;//剖分散射球时的顶点索引,用来构造索引缓冲区

short[] m_indicesHighResolution = null;//精细的顶点索引,实际是通过指定精细的格网顶点密度是前者的2倍来重新计算实现的,75/4=18.75,取整为18,则精细的格网顶点密度为36

float[] fCameraDepth = new float[4] { 0, 0, 0, 0 };//相机深度

float[] fLightDepth = new float[4];//光照深度

float[] fSampleDepth = new float[4];//采样深度

float[] fRayleighSum = new float[] { 0, 0, 0 };//瑞利散射和

float[] fMieSum = new float[] { 0, 0, 0 };//米尔散射和

Vector3 vPos = new Vector3();//光照位置

float[] fAttenuation = new float[3];//环境光

Vector3 vCamera = new Vector3();相机位置

public void Init(float radius, int slices, int sections)方法用来初始化大气层散射球,内部调用SunCalculator类、TimeKeeper类和BoundingBox类的静态函数,这两个类在本篇结束时附后讲解。将散射球切分成4行×8列=32块,每一步内部又按照指定的格网子集密度(如纵、横密度均为18)进一步剖分计算需要绘制的格网顶点。默认经度和纬度的分割间隔均为45度。内部又调用CustomVertex.PositionColored[] CreateMesh(double minLat, double maxLat, double minLon, double maxLon, int meshPointCount)函数根据输入的经纬度范围创建格网子集。

public void Update(DrawArgs drawArgs)方法用来更新大气散射球的光照、模型等渲染元素,内部实际上是发起后台线程backgroundThread来实现的,线程绑定的处理函数为private void Updater()。而Update函数是在World类的public override void Update(DrawArgs drawArgs)中被调用的。

CustomVertex.PositionColored[] CreateMesh(double minLat, double maxLat, double minLon, double maxLon, int meshPointCount) 函数根据输入的经、纬度范围和格网子集密度来创建格网子集的顶点数组。

short[] computeIndices(int meshPointCount)方法根据指定的格网子集密度来计算每个格网顶点的索引,以便渲染时索引缓冲区使用。其中,索引总数=纵向点数×横向点数×2×3。在数组中索引范围为[0,索引总数-1]。

void Interpolate(ref float[] p, float x, float y)被SetColor函数调用。

public void SetColor(ref CustomVertex.PositionColored pVertex, DrawArgs drawArgs)被UpdateColor和getAtmosphereColor函数调用。

int getAtmosphereColor(DrawArgs drawArgs,CustomVertex.PositionColored pVertex)被ColoredSpherePartial函数调用。

private void UpdateColor(DrawArgs drawArgs, MeshSubset meshSubset, bool doHighResolution)函数暂时未被调用,所以处理颜色函数可以暂时不用分析。

private Mesh ColoredSpherePartial(DrawArgs drawArgs, float radius, double startLat, double endLat, int slices, int stacks, double lonSpan, double heading) 被UpdateSkyMesh函数调用。

void UpdateLightVector(),根据太阳位置更新光照位置和方向,被Render()和Updater()函数调用。

private void UpdateSkyMesh(DrawArgs drawArgs, double horizonSpan)被Render()函数调用。

public void Render(DrawArgs drawArgs) 方法在World类的public override void Render(DrawArgs drawArgs)中被调用的。

void MakeOpticalDepthBuffer(float fInnerRadius, float fOuterRadius, float fRayleighScaleHeight, float fMieScaleHeight) 被Updater()函数调用。

  实际上,大气散射球类只需要重点关注Update(DrawArgs drawArgs)和Render(DrawArgs drawArgs)两个方法,其余方法均直接或间接的被这两个方法调用。而这两个方法又分别被World类的Update(DrawArgs drawArgs)和Render(DrawArgs drawArgs)函数调用。

WorldWind源码剖析系列:大气层散射球类AtmosphericScatteringSphere的更多相关文章

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

    星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. retrofit2 不创建对象直接返回字符串

    retrofit请求直接返回string 有个需求是直接用retrofit去get网页得到html,不创建对象. 用上面文章讲的方法,直接返回ResponseBody ICollection: pub ...

  2. RocketMQ 概述

    Rocket 火箭 MQ的作用:同步转异步(异步解耦). 难点:如何确保消息一定被消费,而且仅消费一次. 1.消息架构:生产者.服务器.消费者.路由发现. 2.消息顺序:严格按照消息到达服务器的顺序进 ...

  3. nodejs 知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.添加模块:保存到package.json文件中; # npm install vue --save    注意 ...

  4. 手动创建script解决跨域问题(jsonp从入门到放弃)

    vue项目一般用axios代替jQuery发送ajax请求,但是不支持jsonp格式,需要安装jsonp的依赖包,这就很不爽了,能自己轻易实现的,为什么要引乱七八糟的插件.jsonp其实就是利用< ...

  5. Django中Ajax提交数据的CSRF问题

    错误信息: Forbidden (CSRF token missing or incorrect.): 什么是CSRF: django为用户实现防止跨站请求伪造的功能,通过中间件 django.mid ...

  6. React之小知识点总结

    总结react中常常被忽略的小知识点 1)即使state里设置成和之前的值一样,render也会重新渲染 2)父组件传给子组件的属性(props是只读的,在子组件中已在this.state里将属性赋值 ...

  7. HttpWatch HttpWatch时间表(HttpWatch Time Charts)

    HttpWatch时间表(HttpWatch Time Charts) by:授客 QQ:1033553122 截图 说明 页面事件线(Page Event Lines)

  8. 使用Tomcat部署应用

    概述 一个简单的web项目下载地址:https://files.cnblogs.com/files/Mike_Chang/hello.rar Tomcat部署应用三种方法. 方法一 将一个WAR文件或 ...

  9. shell脚本常用技巧

    shell脚本常用技巧 1.获取随机字符串或数字 ~]#echo $RANDOM | md5sum | cut -c 1-6 ~]#openssl rand -base64 4 | cut -c 1- ...

  10. SQLServer分页查询笔记

    学习SqlServer到现在快两年了吧,分页查询总是忘了看笔记,看了又忘.之前用的分页都是row_number函数的方式,背不住...直到今天,看到别人写的另一种分页写法,看似比row_number简 ...