由于数字地球项目需要osgEarth的代码知识,故决定学习osgEarth的示例,示例中有很多可以借鉴的内容。以下是分析目录,完全是随机进行的,并没有什么上下文逻辑。
每一篇代码边学习边分析,如果有错误,请各路大佬斧正!
osgEarth示例分析——osgearth_annotation
osgearth_annotation,示例中采用osgEarth提供的类,绘制标签、线、billboard、遮盖图、墙、圆、实体等标绘内容,其中可编辑点仅涉及到圆形、椭圆形、矩形、遮盖图这4类标绘。推测,可以仿照圆形的编辑点类,编写label等其他的编辑点类。将标绘添加到地球上时,先获取地球mapNode节点,然后调用addChild()方法,将标绘节点加入到地球上,同时需要获取到mapNode的坐标系SRS。
osgEarth示例分析——osgearth_cluster
osgearth_cluster,示例中展示了绘制很多模型且模型密度较大、存在遮挡的问题时,如何合适设置模型合并来减少遮挡的混乱情况。示例绘制10000个飞机和牛的模型,并且为两种模型均添加icon图标。当距离较远时,会显示图标。拉进后,才现实模型。 相同的图标可以合并为1个,并且显示此图标代表的个数。 图标和模型也可以消失,仅呈献像玻璃碎渣似的白色噪声点。
当模型过多时,可以创建 osgEarth::Util::ClusterNode 节点对象,然后创建 osg::NodeList,将需要绘制的节点 node 们,都 push_back 到 osg::NodeList 中,然后将 osg::NodeList 添加 addChild 到 osgEarth::Util::ClusterNode 中,通过控制 osgEarth::Util::ClusterNode 的半径范围,来控制节点node们的显示密集程度。
osgEarth示例分析——osgearth_colorfilter
osgearth_colorfilter颜色过滤器示例。示例中,主要展示了6种颜色过滤器的使用,分别是:HSLColorFilter、RGBColorFilter、CMYKColorFilter、BrightnessContrastColorFilter、GammaColorFilter、ChromaKeyColorFilter。通过颜色过滤器可以设置地球影像的颜色。
osgEarth示例分析——osgearth_controls
osgearth_controls示例,展示了各种控件的添加以及控件的事件相应。包括:图片控件、滑块控件、复选框控件、标签控件、按钮控件(在osgearth_colorfilter示例中)、box控件、grid控件等。
osgEarth示例分析——osgearth_drawables
osgeath_drawables,示例展示了osgearth如何绘制线LineDrawable 、点PointDrawable及其特性的设置,并且设置回调,使得线条像时钟一样运动。可以通过示例进一步理解透视投影和正射投影的关系。学习node节点序列化存储、读取、绘制。
osgEarth示例分析——osgearth_eci
osgearth_eci示例,展示了J2000的天体坐标系和ECEF地固系的转换,为地球绘制坐标轴,读取卫星两行根数并绘制卫星的功能。绘制卫星轨迹时,添加差值效果和未添加差值的效果。获取时间并通过控件展示时间、通过滑块调节时间。轨迹会随着时间的推移,变长。太阳光照、星空背景均有显示。
osgEarth示例分析——osgearth_elevation
osgearth_elevation示例,展示了如何通过点击地球标签获取不同定义下的高程数据。包括:MSL高程、HAE高程、EGM96高程。绘制控制面板,面板上有标签用于显示信息和按钮。双击地形某处,或获取到高程等信息,并展示再ui面板上,同时会添加一个坐标模型。点击按钮,可以移除高程图层。
osgEarth示例分析——osgearth_ephemeris
osgearth_ephemeris示例,展示了深空场景下,控制仿真时间运动和停止功能。左下角应该是sky自带的控制面板,通过滑块,可以调节年、月、日,可以设置环境光亮度。可以获取太阳和月亮的世界坐标,再转化为经纬度坐标,并将其投影到地球上,用PlaceNode实时代表太阳和月亮的位置。
后续可以优化,加上仿真时间反向、仿真时间速率等功能。目前没有找到支持时间反转、时间速率调整的接口方法。也没有找到如何关闭左下角的ui控制面板。
osgEarth示例分析——osgearth_featurefilter
osgearth_featurefilter 特征过滤器示例,在程序中注册自定义属性过滤器,earth文件中,添加对应的属性设置,当加载earth文件后,被设置的特征内容会进行更改。示例中是将所有的城市名称换成同样一串字符。
osgEarth示例分析——osgearth_featurequery
osgearth_featurequery示例,分析了如何拾取地球上的特征,并对特征信息进行提取与显示。创建的地球加载shp文件,绘制了国界线和省界线,当鼠标滑动到某条线时,会在左上角的控制面板上显示该线条的信息。也可以将鼠标滑到事件换为鼠标点击事件。功能类似的示例 osgearth_pick。
osgEarth示例分析——osgearth_features
osgearth_features示例,主要演示如何通过代码方式加载shp文件,并设置其样式。在执行时,通过不同的命令,得到不一样的效果。之前的示例,都是通过earth文件的方式加载shp文件和更改其属性内容。
osgEarth示例分析——osgearth_geodetic_graticule
osgearth_geodetic_graticule示例,是展示三维地球经纬网格控制的案例。通过左上角控制面板上的按钮,可以控制网格的显隐、 控制经纬度文本的显隐及更改颜色、以及当地球占满整个页面时,让经纬度label靠边缘显示、整个网格图层(线和文本)的显隐控制。
osgEarth示例分析——osgearth_graticule
osgearth_graticule,示例展示了绘制网格、网格上的文字显示、拾取地球表面的坐标并展示在左上角的标签上。在地球网格示例中,可以设置4种网格样式和对应格式的坐标值,即使获取的同一地点的坐标,由于网格样式不同,左上角显示的内容也不相同。
osgEarth示例分析——osgearth_horizon
osgearth_horizon示例,在地球上绘制了一大一小两个白色半球。随着转动地球,白球会被遮挡或显示,此时右下角会提示:白色球的可见状态,以及当前地图图层加载到第几层级。
osgEarth示例分析——osgearth_htm
osgearth_htm示例,围绕US绘制线框,且线框组成的三角形内,会放置一个“模型”,当拉进距离时,线框会1分裂4,同时模型也会分裂,如果最外层是个单角,则删去。不太明白htm模式有什么用处。
osgEarth示例分析——osgearth_http
osgearth_http示例,展示 HTTPClient 客户端类 通过url获取HTTP服务的数据并解析。
osgEarth示例分析——osgearth_imageoverlay
imageroverlay示例,在地球上贴图。左下角有控制面板,面板上有mini图标、复选框、标签、滑动条。支持更换图标、拖动图片的编辑点移动位置、通过滑块更改透明度、edit标签控制编辑点的显隐。当编辑点隐藏后,则不可编辑位置。
osgEarth示例分析——osgearth_infinitescroll
osgearth_infinitescroll示例,通过earth文件,加载二维地图,且二维地图无限拖动。在earth文件中,有线条和图片两个标绘特征,添加earth文件时,此标绘会添加到地图上。在示例中,可以控制黄色的线一直显示,两张覆盖图默认显示,但拖动地图的时候,有时候显示有时候不显示。
osgEarth示例分析——osgearth_lights
osgearth_lights示例,模拟仿真了白天黑夜,添加了星空背景(太阳、月亮、其他天体),支持通过左下角控件更改时间进而改变光照,支持随机更新图层颜色。earth文件中,需要添加
osgEarth示例分析——osgearth_los
osgearth_los示例,创建了模型动画路径、透视的用法。透视的顾名思义:两个点连线,从A到B,视线不被遮挡,则绘制绿色,视线被遮挡的部分,则设置为红色;圆形扫描图、圆形移动图。此示例,加载earth文件时,需要加载地形文件。
osgEarth示例分析——osgearth_manip
osgearth_manip示例,讲了事件处理的用法,内容比较多,重点是 回调事件和按键事件。切换操作器的透视矩阵、视角绑定移动的模型并并跟踪或取消跟踪(跟踪有3种状态,参见t)、定位到可以看到一组节点的视点位置、在屏幕上绘制两条交线。
osgEarth示例分析——osgearth_measure
osgearth_measure测量示例,展示了如何测量两点间距离。当点击第一个点后,随着鼠标移动,红线跟着移动,直到点下第二个点,测量结束。测量值会显示在左上角的ui界面上,且可以设置直线测量或大圆弧测量,实时更新鼠标坐标。还可以测量连续直线,双击后结束测量。
osgEarth示例分析——osgearth_minimap
osgearth_minimap示例。在示例中,拖动三维地图,二维地图上的label标签会移动。二维地图支持拖动和缩放。代码的目的是:让标签始终跟随三维视点的坐标进行更新。但是,运行过程中,label标签的位置有时候会不对。例如当三维地球放大到中国地图内时,理论来讲label应该定位在中国区域内,但是并没有。目前还没有梳理清楚坐标转换的关系。此示例代码的借鉴意义即显示小地图。
osgEarth示例分析——osgerth_mrt
osgearth_mrt示例,展示了一个带呼吸灯光环的地球,地球背景图被设置为玫红色,鼠标点击地球,会获取到一些视点信息。此示例暂时并没有分析太清楚,等更深入了解了OPenGL 和 osg的相机部分内容,再来看,应该会容易一些。
osgEarth示例分析——osgearth_noisegen
osgearth_noisegen示例,展示生成噪音图。也就是根据设置生成声音曲线,在绘制到图上。但是写入文件总是报错。此示例并没有学习太明白。
osgEarth示例分析——osgearth_occlusionculling
osgearth_occlusionculling示例,分析了declutter清理器功能。即当有多个同类型的对象同时覆盖在同一个区域时,会隐藏一部分对象。如果想更深入学习declutter功能,推荐 osgearth_cluster 示例。此示例效果一般,就当它只是实现了随机在规定区域生成一些PlaceNode标签。
osgEarth示例分析——osgearth_pick
osgearth_pick示例,展示了鼠标移动(或者鼠标单击)时,触及到的矢量特征、绘制的线、遮盖图等内容,特征线会变为红色,同时将拾取到的特征的信息打印输出到左上角ui控件上。此示例与osgearth_featurequery示例不同之处在于,此示例左下角有小地图,且小地图仅显示特征内容,不显示影像。
osgEarth示例分析——osgearth_scenegraphcallbacks
osgearth_scenegraphcallbacks示例,定义了一个图层的回调方法,继承自 osgEarth::SceneGraphCallback. 获取场景事件通知的回调方法。并打印输出当前所有图层的名称,包括高程图层、影像图层、国界线图层、省界线图层等。并没有看懂此回调方法是如何使用的。
osgEarth示例分析——osgearth_sequencecontrol
osgearth_sequencecontrol示例,应该是会实现每一帧更新一个东西,但是尝试了很多earth文件,都报错:Your earth file does not contain any sequenced layers...bye! 掌握如何获取图层列表,图层的继承关系。
osgEarth示例分析——osgearth_shadercomp
osgearth_shadercomp示例,这是osgEarth着色器合成框架的一组单元测试。主要分析OpenGL着色器语言和方法的使用。是OpenGL与osgearth的结合。通过OpenGL的着色器设置地球的各种颜色状态。一共9个示例:添加雾特效、通过回调方法设置地球放大时一个颜色,缩小时还原颜色、红色的地球、安装卸载着色器程序设置地球的闪烁、两个三角形、左下角4个地图且颜色各异,主视图却没有内容、将绘制的内容写入out.osg文件、读取out.osg文件并显示、红色方块模拟瓦片一级一级的添加。
osgEarth示例分析——osgearth_shadergen
osgearth_shadergen示例,加载一个earth文件,出现一个地球,然后通过StateSetCache::dumpStats() 方法输出一些信息。并不太理解这个例子的目的。
osgEarth示例分析——osgearth_skyview
本示例分析osgearth操作深空场景,或者是银河系场景,可以想象人拿着相机站在地球表面上观看天空/银河系的场景。 需要通过earth文件添加特别的图片。
osgEarth示例分析——osgearth_splat
osgearth_splat示例,展示如何加载图片贴在地球上,且通过分类,贴文理绘制森林、草地等。整个地球的影像,加载的一张贴图。黑白点点,是不同的贴图。当拉进放大后,才可以看清楚加载的是哪张纹理图。代码设置了15级。通过xml文件加载以及通过代码加载。
osgEarth示例分析——osgearth_srstest
osgearth_srstest示例,主要涉及到两个坐标系转换,wgs84→egm96 wgs84→plate-carre。 其中重要的是wgs84到平面坐标系的转换。代码中是采用的极值进行的测试。转换后的结果是XYZ数据而不是经纬度。
osgEarth示例分析——osgearth_terrainprofile
osgearth_terrainprofile示例,涉及到一个新的类 TerrainProfileCalculator(地形轮廓计算器类),用来计算两个点连线之间的地形数据。左下角会根据点击的起点和终点进行计算,并更新显示地形信息。左下角的地形线和高度值会根据点击两点的连线进行调整。
osgEarth示例分析——osgearth_tilesource
osgearth_tilesource示例,展示如何创建自定义瓦片源并添加到图层,可以自行绘制几何图形,呈献不同的形状。此示例对于加载瓦片,并没有提供更明确的指导。比如本机有一些瓦片图,实际应该怎么加载,依然还没有想到方案。
osgEarth示例分析——osgearth_tracks
osgearth_tracks示例,演示了所有图标沿着路径进行移动(路径是不可见的)。左下角有控制面板,复选框和滑块分别控制移动的周期时间、图片变大变小、图片透明度、是否显示图标的文本内容、图片从无到有与从有到无的时间变化等。
osgEarth示例分析——osgearth_transform
osgearth_transform示例,是控制三维坐标轴模型的示例。通过控制面板的滑块,进而控制坐标轴的经度、纬度、高度、俯仰角、偏航角、旋转等操作。
osgEarth示例分析——osgearth_wfs
osgearth_wfs示例,展示的如何创建wfs驱动,通过http服务加载wfs数据。由于本示例中的链接无效,所以并没有执行出应有的效果。
osgEarth示例分析——osgearth_windows
osgearth_windows示例,展示了如何创建多个视景器,在多个窗口或者在同一个窗口。可以实现一个窗口二维图一个窗口三维图,或者一个窗口一边二维图一边三维图。只是没有做操作器同步功能。
osgearth_magnify:漏掉的示例,回头补上。
另外有些示例没有进行分析:
city: 需要http网络数据,但是http链接无效,未通过测试。
computerangecallback:运行后,没啥结果,也没有距离、半径等内容输出。
datetime: 因为没有kml文件,所以运行程序后,并没有看到什么效果。
map: 需要http网络数据,但是http链接无效,未通过测试。
video:需要http网络数据,但是http链接无效,未通过测试。