初识osg

OSG的诞生

在 1997 年时,Don Burns 由于喜欢滑翔机运动且对计算机图形学非常熟悉,在 LINUX 上写了一个控制滑翔
机的小引擎,这便是 OSG 的最初雏形。
后来在 1998 年,Don Burns 在滑翔机爱好者邮件列表中遇到了 Robert Osfield,对 OSG 的命运起到了决定性
的改变。我们现在在邮件列表中也会经常看到 Robert 的名字,从 98 年至今,Robert 一直担当 OSG 开发组
长,权衡 OSG 的各种利弊。

OSG的编译与安装

在Linux下,可直接去osg官方网站http://www.openscenegraph.org/下载压缩源码包编译安装,osg相关包如下:

osg-OpenSceneGraph-3.5.1.tar.gz, osg安装包,通过cmake编译,安装步骤参考目录下README.txt;

OpenSceneGraph-Data-3.0.0.tar.gz, 里面包含很多例子,例如著名的cow.osg;

如果应用需要使用地球或者数字城市,则可去http://osgearth.org/下载 osgearth,里面包含源码和例子.

osg基础

示例一:HelloWorld

 #include <osgDB/ReadFile>
 #include <osgViewer/Viewer>
 int main()
 {
 <span style="white-space:pre">    </span>osgViewer::Viewer viewer;
 <span style="white-space:pre">    </span>viewer.setSceneData(osgDB::readNodeFile("glider.osg"));
 <span style="white-space:pre">    </span>viewer.realize();
 <span style="white-space:pre">    </span>return viewer.run();
 }

编译命令如下:g++ -o main main.cpp -losgDB -losg -losgViewer

下面我们对程序逐行解释:

第 1~2 行:头文件包含,这里osgDB用于读取模型文件,osgViewer用于在代码中使用osgViewer类,在编译时添加-losgViewer -losgDB也是同样的道理。
第 4~5 行:申请一个 viewer,可以理解为申请一个观察器,该观察可以查看模型。
第 6 行:设置观察器 Viewer 中的数据,换句话说,有了观察器, 就需要查看模型,模型可以绝对路径形式存在,比如 viewer.setSceneData(osgDB::readNodeFile("/home/lzn/osg_model/glider.osg"))。

OpenSceneGraph-Data-3.0.0.tar.gz中有提供glider.osg.
第 7 行:可以理解为这是在渲染前的最后一步,会检查和设置图形上下文,屏幕等,使 Viewer 的设置都生效。
第 8 行:渲染,可以用如下代码代替:while(!viewer.done()){viewer.frame();}.意思也就是说,只要 viewer 没有结束,那么就绘制它的每一个帧。
如果需要在运行时查看程序状态,则可修改为:

 #include <osgDB/ReadFile>
 #include <osgViewer/Viewer>
 #include <osgViewer/ViewerEventHandlers>
 #include <osgGA/StateSetManipulator>
 int main()
 {
         osgViewer::Viewer viewer;
         viewer.setSceneData(osgDB::readNodeFile("glider.osg"));
         //添加状态事件
 :        viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
         //窗口大小变化事件
 :        viewer.addEventHandler(new osgViewer::WindowSizeHandler);
 <span style="white-space:pre">    </span>//添加一些常用状态设置
 :        viewer.addEventHandler(new osgViewer::StatsHandler);
         viewer.realize();
         return viewer.run();
 }

编译命令如下:

g++ -o main2 main2.cpp -losg -losgDB -losgViewer -losgGA

第 1 行:添加一个事件句柄,可以理解为添加一个响应,鼠标或是键盘的,这个响应可以看做响应键盘或是鼠标事件,故函数名字叫:addEventHandler[添加事件句柄]
。这个事件是库中自己写好的,叫做状态设置(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())),其中我们点击 L 键时有操作器
的味道,所以叫状态设置操作器。众所周知,灯光是状态控制的,所以这句话可以控制 L 键开启与关闭灯光,至于为什么定位在 L 键上,怎么搞的,可以查看 StateSetManipulator 源码,我们以后也会写自己的操作器。发现默认的灯光比加强的 L 灯光好看一些,这是这个模型,大多数情况下都不是这样的。
第 2 行:添加的是窗口大小改变的句柄,这里响应的是 F 键,与上面的原理是差不多。在早期版本中,他们是在一起的,至 1.20 以后就把他们分开了。
第 3 行:添加常用的状态操作,这里会响应 S 键,W 键等等,原理与上述两个是一样的。

官方的四个osg程序

osgViewer:这四个程序当中用的最多的 OSG 程序,用于查看模型;

osgVersion:查看osg库版本;

osgArchive:类似于zip,可将多个.osg模型打包成一个.osga的模型压缩包;

osgConv:模型格式转换与压缩,将模型转换成二进制格式IVE,可防止别人查看和修改模型数据;

参考资料<openscenegraph程序设计>

介绍

osgEarth为开发osg应用提供了一个地理空间SDK和地形引擎.

osgEarth的目标:

l 提供基于osg开发3D地理空间应用的支持;

l 直接从数据源可视化地形模型和影像变得更加简单;

l 提供对开放式绘图标准,技术和数据的交互操作;

在很多情形下,osgEarth可以替代离线地形数据库创建工具,你可以通过osgEarth完成如下工作:

获取地形基础地图并快速而流畅的运行

访问开放式标准的地图数据服务,例如WMS和TMS

将基于web服务的影像数据和本地存储的数据整合

在运行时嵌入新的地理空间数据层

超时处理可能改变的数据

集成商业数据源

社区资源

osgEarth是一个自由开源的SDK,任何人斗可以获取源码,同时欢迎和鼓励参与社区的测试,新功能研发和bug修复.

工具

osgEarth自带很多协助处理earth文件和地理空间数据的工具.
osgearth_viewer
从命令行加载并显示一个地图.osgEarth提供的地球操纵器用于控制相机,对地理空间数据的浏览进行了优化.

osgearth_version

显示osgEarth的当前版本号.

osgearth_cache

管理osgEarth的缓存.osgearth_cache较常用的用法:通过非交互方式--seed参数生成缓存信息.

osgearth_cache --seed file.earth

osgearth_package

从earth文件创建一个基于TMS格式,可重复发布的包。

osgearth_package --tms file.earth --out package

osgearth_conv

将瓦片源中到内容拷贝到另一个文件。所有参数以键值对方式出现,需要为每个驱动选项查找头文件。当然,输出驱动必须支持写(通过实现ReadWriteTileSource接口)。"in"属性来自于GDALOptions getConfig方法。"out"属性来自于MBTilesOptions getConfig方法。

osgearth_conv --in driver gdal --in url world.tif --out driver mbtiles --out filename world.db

osgearth_tfs

从特征源(例如shapefile)产生一个TFS数据集。通过将源预处理成网格结构(TFS),可极大提升大数据集的性能。同时,产生的TFS包可由web服务器提供服务。

osgearth_tfs filename

osgearth_backfill

用于后期处理TMS数据集的特殊工具。一些web地图服务在不同缩放比例下会使用完全不同的数据集。例如,当缩放比例达到4级时,可能使用NASA 的BlueMarble,然后陡然切换到地球资源卫星数据。在2D场景下,对于较光滑的地图有效,但是在3D场景下,整张图看起来会很不均匀,因为在不同的LODs下,相邻的瓦片看起来会完全不同。

Osgearth_backfill产生一个TMS数据集(使用osgearth_package或其他工具),然后从指定的查看高度填充较低缩放级别的细节。例如,你可以指定最大缩放级别10,0-9的lods就可以从10级的数据重新生成。

osgearth_boundarygen

产生边界地理信息,可使用osgEarth<mask> 将外部模型数据嵌入地形信息中。

osgearth_boundarygen model_file [options]

osgearth_overlayviewer

调试叠加功能。运行时显示两个窗口,一个显示普通的地图视图,一个显示包含边界的视锥体视图(用于叠加计算)。

osgearth_graticule

加载经纬线

地图

Osgearth提供了大量的地图文件,每个文件都对应某类功能,可通过osgearth_viewer查看运行效果。

Feature_drapped_lines.earth: 显示国界线

Feature_clip_plane.earth: 显示透明地球+国界线

Feature_custom_filters.earth: 根据缩放级别动态显示国名

Feature_drapped_polygons.earth: 相邻国家使用不同颜色显示

Feature_models.earth: 紧贴地表绘制的三维图形

Graticule.earth: 显示经纬线及经纬线位置(包含较清晰高层数据,未穿越云层)

Ldb.earth: 在地球某一高度显示一只静态的飞机

实例

以下地图文件基于osgearth提供的数据,包含一个地球、经纬线、国界线、各国名字。

<!--
osgEarth Sample

Demonstrates feature draping using projective texturing,
i.e. "altitude-clamping: terrain-drape".
-->

<map name="Geometry Rasterizer Demo" type="round" version="2">

    <options>
        <lighting>false</lighting>
        <terrain min_lod="16"/>
    </options>

    <image name="world" driver="gdal">
        <url>../data/world.tif</url>
        <cache_policy usage="no_cache"/>
    </image>

   <model name="world_boundaries" driver="feature_geom">

        <features name="earth" driver="ogr">
            <url>../data/world.shp</url>
            <build_spatial_index>true</build_spatial_index>
        </features>

        <styles>
            <style type="text/css">
                world {
                   stroke:             #ffff00;
                   stroke-width:       5px;
                   altitude-clamping:  terrain-drape;
                }
            </style>
        </styles>

    </model>

    <extensions>
        <graticule>
            <!-- The approximate number of grid lines that you would like to see in your view extent.
                 This number, along with the resolutions list, will be used to select a resolution on each view.
             -->
            <grid_lines>10</grid_lines>

            <!-- The grid resolutions, in degrees that you want to see, all separated by a space and sorted from lowest resolution to highest -->
            <!--
            <resolutions>10 5 2.5 1.25</resolutions>
             -->

            <!-- The grid line color -->
            <color>#f7a73f70</color>

            <!-- The label color -->
            <label_color>#ffff00ff</label_color>

            <!-- Specify the line width -->
            <line_width>2</line_width>
        </graticule>
    </extensions>

    <model name="cities" driver="feature_geom">

        <features name="cities" driver="ogr">
            <url>../data/world.shp</url>

                        <!--Define a ChangeAttributeFilter, which is defined in the osgearth_featurefilter example.  This will change the cntry_name of all countries to osgEarthLand.-->
                        <change_attribute key="cntry_name" value="osgEarthLand"/>
        </features>

        <styles>
            <style type="text/css">
                cities {
                   text-provider:  annotation;
                   text-content:   [cntry_name];
                   text-priority:  [pop_cntry];
                   text-halo:      #3f3f7f;
                   text-align:     center_center;
                   text-declutter: true;
                }
            </style>
        </styles>

    </model>

</map>

第15行加载地球模型,第20行加载国界,第39行加载经纬线,第62行加载国名。

feature_labels.earth

<!--
osgEarth Sample
This shows how to label point features with an attribute.
-->

<map name="Feature Geometry Demo" type="geocentric" version="2">

    <image name="world" driver="gdal">
        <url>../data/world.tif</url>
    </image>

    <model name="cities" driver="feature_geom">

        <features name="cities" driver="ogr">
            <url>../data/world.shp</url>
        </features>

        <styles>
            <style type="text/css">
                cities {
                   text-provider: annotation;
                   text-content:  [cntry_name];
                   text-priority: [pop_cntry];
                   text-halo:     #3f3f7f;
                   text-align:    center_center;
                }
            </style>
        </styles>

    </model>

    <options lighting="false"/>

    <external>
        <decluttering>
            <out_animation_time>  0.0  </out_animation_time>
            <in_animation_time>   0.25 </in_animation_time>
            <min_animation_scale> 0.45 </min_animation_scale>
            <min_animation_alpha> 0.35 </min_animation_alpha>
            <sort_by_priority>    true </sort_by_priority>
        </decluttering>
    </external>

</map>

osgearth介绍(转载)-feature_labels.earth的更多相关文章

  1. VPN理论简单介绍(转载)

    标签:VPN理论简单介绍 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lvnian.blog.51cto.com/715528 ...

  2. osgearth介绍

    osgEarth为开发osg应用提供了一个地理空间SDK和地形引擎. osgEarth的目标: l 提供基于osg开发3D地理空间应用的支持; l 直接从数据源可视化地形模型和影像变得更加简单: l  ...

  3. Linux各目录及每个目录的详细介绍(转载)

    [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录,是用户主目录的基点 ...

  4. python正则表达式re模块详细介绍--转载

    本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆( ...

  5. [原][osgearth]API加载earth文件的解析

    参考:http://blog.csdn.net/cccstudyer/article/details/17691893 通过\src\osgEarthDrivers\earth\ReaderWrite ...

  6. linux下各文件夹的结构说明及用途介绍(转载)

    详细介绍文档 转载文章路径 /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录的基点,比如用户 ...

  7. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...

  8. Kubernetes1-K8s的简单介绍(转载)

    一.简介 1.什么是Kubernetes 简称K8s,用8代替8个字符"ubernerte"而成的速写,K8s是一个开源的容器编排平台,它是一个跨主机集群的开源容器调度平台,用于管 ...

  9. VMware vCenter 6.0 安装及群集配置介绍(转载)

    转载自http://blog.51cto.com/wzlinux/2094598 一.介绍 VMware vCenter Server 提供了一个可伸缩.可扩展的平台,为虚拟化管理奠定了基础.可集中管 ...

随机推荐

  1. 标准与扩展ACL实验

    一标准访问控制列表实验: 实验拓扑: 实验目的:掌握标准与扩展ACL的配置 实验要求:拒绝R1到R3的所有流量 实验步骤: 步骤1 按如上拓扑做好底层配置,并检测相邻设备之间的连通性 步骤2起静态路由 ...

  2. css link import

    link和@import的区别   页面中使用CSS的方式主要有3种:行内添加定义style属性值,页面头部内嵌调用和外面链接调用,其中外面引用有两种:link和@import.外部引用CSS两种方式 ...

  3. MOSFET与MOSFET驱动电路原理及应用(转)

    源:http://www.micro-bridge.com/news/news.asp?id=258 在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最 ...

  4. html-关于IE浏览器兼容性的问题,还有浏览器一直加载的问题。

    今天9月11日,所谓兼容性问题就是,标签 写的不规范导致的,因为高版本的IE会自动补上没写的标签 document.write('<object classid="clsid:d27c ...

  5. CentOS 6.3下NTP服务安装和配置

    测试环境: NTPserver 192.168.1.252 NTPclient 192.168.1.251 准备工作: 关闭selinux: vi /etc/selinux/config SELINU ...

  6. 继续几道经典的js题(局部和全局变量,对象等)

    1. //现有代码如下:var foo = 1;function main(){alert(foo);var foo = 2;alert(this.foo)this.foo = 3;}//1.请给出以 ...

  7. springmvc配置首页的方式

    <mvc:view-controller path="/" view-name="redirect:/user/loginUI" />

  8. 使用PHPmailer 发送邮件,使用QQ smtp服务器

    <meta charset="utf-8"> <?php include("class.phpmailer.php"); include(&q ...

  9. 2014专业知识学习---be strong

    一 公司工作 完成好自动化营销系统构建,并以此为契机掌握推荐,数据分析,可视化等知识 1 完成统计和可视化.具体参考 cookie mapping项目规划 2 以广告投放为契机,学习数据分析,推荐系统 ...

  10. POJ 1015 Jury Compromise

    感觉此题略难...... 背包问题.据说有一种二维DP的写法是错的.亲测,背包做法无误. dp[i][j][k]表示前i个物品,选择j个,差值为k的情况下获得的最大总和 dp[i][j][k]=max ...