#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <osgEarth/Map>
#include <osgEarth/MapNode>
#include <osgEarthDrivers/tms/TMSOptions>
#include <osgEarthDrivers/model_feature_geom/FeatureGeomModelOptions>
#include <osgEarthDrivers/feature_ogr/OGRFeatureOptions>
#include <osgEarthDrivers/cache_filesystem/FileSystemCache>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/GeodeticGraticule>
#include <osgEarthUtil/LatLongFormatter>
#include <osgEarthUtil/Controls>
#include <osgEarthUtil/MouseCoordsTool>
#include <osgEarthUtil/AutoClipPlaneHandler>
#include <osg/PositionAttitudeTransform>
#include <osg/Group>
#include <osg/Node>
#include <osgDB/ReadFile>
//初始化影像、地形
void initImageAndElevation(osgEarth::Map* map)
{
 //影像
 osgEarth::Drivers::TMSOptions imgOption;
 imgOption.url()="D:/CacheData/OUTDATA/JiLinImage/tms.xml";
 //imgOption.url()="http://readymap.org/readymap/tiles/1.0.0/7/";
 map->addImageLayer( new osgEarth::ImageLayer( "image", imgOption ) );
 //高程
 osgEarth::Drivers::TMSOptions elvOption;
 elvOption.url()="D:/CacheData/OUTDATA/JiLinElevation/tms.xml";
 //elvOption.url()="http://readymap.org/readymap/tiles/1.0.0/9/";
 map->addElevationLayer( new osgEarth::ElevationLayer( "elevation", elvOption ) );
}
//初始化省界国界
void initBoundaries(osgEarth::Map* map)
{
 osgEarth::Drivers::FeatureGeomModelOptions worldBoundaries;
 osgEarth::Drivers::OGRFeatureOptions ogrOptions;
 ogrOptions.url()="world.shp";
 worldBoundaries.compilerOptions()=ogrOptions;
 //worldBoundaries.styles().
 map->addModelLayer(new osgEarth::ModelLayer("world", worldBoundaries));
}
//初始化事件处理器
void initEventHandler(osgViewer::Viewer* viewer,osgEarth::MapNode* mapNode)
{
 //鼠标位置信息显示
 osgEarth::Util::Formatter* formatter = new osgEarth::Util::LatLongFormatter();
 osgEarth::Util::LabelControl* readout = new osgEarth::Util::LabelControl();
 osgEarth::Util::ControlCanvas::get( viewer, true )->addControl( readout );
 osgEarth::Util::MouseCoordsTool* tool = new osgEarth::Util::MouseCoordsTool( mapNode );
 tool->addCallback( new osgEarth::Util::MouseCoordsLabelCallback(readout, formatter) );
 viewer->addEventHandler( tool );
 // add the state manipulator
    viewer->addEventHandler( new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()) );
 // add the thread model handler
    viewer->addEventHandler(new osgViewer::ThreadingHandler);
 // add the window size toggle handler
    viewer->addEventHandler(new osgViewer::WindowSizeHandler);
 // add the stats handler
    viewer->addEventHandler(new osgViewer::StatsHandler);
 // add the record camera path handler
    viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);
 // add the LOD Scale handler
    viewer->addEventHandler(new osgViewer::LODScaleHandler);
 // add the screen capture handler
    viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
}
//初始化操纵器
void initManipulator(osgViewer::Viewer* viewer,osgEarth::Map* map)
{
 //操纵器
    osgEarth::Util::EarthManipulator* em=new osgEarth::Util::EarthManipulator();
    //赤道半径
    double equatorRadius=map->getSRS()->getEllipsoid()->getRadiusEquator();//6378137.0
 //初始视点正对中国北京
    em->setHomeViewpoint(osgEarth::Util::Viewpoint(116.3,39.9,0,0,-90,equatorRadius*4));
    viewer->setCameraManipulator(em);
 //定位吉林
    em->setViewpoint(osgEarth::Util::Viewpoint(126,43,0,0,-90,5e4), 5);//5s
}
//初始化其他杂项
void initOther(osgViewer::Viewer* viewer,osgEarth::MapNode* mapNode)
{
 //反锯齿
 osg::DisplaySettings::instance()->setNumMultiSamples( 4 );
 //设置最大PagedLOD节点数目
 //viewer->getDatabasePager()->setTargetMaximumNumberOfPageLOD(10);
    //近地面自动裁剪AutoClipPlaneCullCallback
    viewer->getCamera()->addCullCallback( new osgEarth::Util::AutoClipPlaneCullCallback(mapNode) );
 //绘制经纬度网格
 //osgEarth::Util::GeodeticGraticule* gr = new osgEarth::Util::GeodeticGraticule( mapNode );
 //root->addChild(gr);
}

void main(){
 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
 //osgViewer::Viewer* viewer = new osgViewer::Viewer;
 osg::Group* root = new osg::Group();
 osg::Node* tankNode = NULL;
 osg::Vec3 tankPosit;
 osg::PositionAttitudeTransform* tankXform;
 //缓存
 osgEarth::Drivers::FileSystemCacheOptions cacheOptions;
 cacheOptions.rootPath() = "./cache";
 osgEarth::MapOptions mapOptions;
 mapOptions.cache() = cacheOptions;
 //osgEarth::Map* map = new osgEarth::Map(mapOptions);
 //osgEarth::MapNode* mapNode = new osgEarth::MapNode( map );
 osg::Node* configEarth = osgDB::readNodeFile("config.earth");
 osgEarth::MapNode* mapNode = osgEarth::MapNode::findMapNode( configEarth );
 osgEarth::Map* map = mapNode->getMap();
 //关闭光照
    mapNode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
 viewer->setSceneData( root );
 root->addChild(mapNode);
 //读取模型
 tankNode = osgDB::readNodeFile("Models/t72-tank/t72-tank_des.flt");
 tankXform = new osg::PositionAttitudeTransform();
 root->addChild(tankXform);
 tankXform->addChild(tankNode);
 tankPosit.set(5,0,0);
 tankXform->setPosition( tankPosit );
 viewer->setCameraManipulator(new osgGA::TrackballManipulator());

//地形影像
 //initImageAndElevation(map);

//矢量
 //initBoundaries(map);

//操纵器
 initManipulator(viewer, map);

//事件处理(键盘鼠标)
 initEventHandler(viewer, mapNode);

//其他
    initOther(viewer, mapNode);

viewer->realize();

while( !viewer->done() )
 {
  viewer->frame();
 }
}

osgEarth例子的更多相关文章

  1. [OSG][osgEarth]osgEarth例子程序简介

    1.osgearth_graticule:生成经纬线. 2.osgearth_annotation:各类标注(点.线.面.模型.文本等). 3.osgearth_city:加载一个城市三维模型,可以浏 ...

  2. [原][OSG][osgEarth]osgEarth例子程序简介

    1.osgearth_graticule:生成经纬线. 2.osgearth_annotation:各类标注(点.线.面.模型.文本等). 3.osgearth_city:加载一个城市三维模型,可以浏 ...

  3. osgearth各个例子功能概述

    osgearth各个例子功能概述 转自:http://blog.csdn.net/wl198302/article/details/21177309 最近在学习osgearth,对其还不是很理解,有些 ...

  4. osgEarth的agglite插件使用例子feature_rasterize.earth

    <!-- osgEarth Sample Demonstrates use of the "agglite" feature rasterization driver. -- ...

  5. osgearth_city例子总结

    osgearth_city例子总结 转自:http://blog.csdn.net/taor1/article/details/8242480 int main(int argc, char** ar ...

  6. osgEarth基础入门

    osgEarth基础入门 2015年3月21日 16:19 osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件 ...

  7. OSGEARTH三维地形开源项目

    第一章   OSGEarth介绍 第二章   OSGEarth编译环境配置 OSGEarth的编译环境配置随着版本的不同.运行平台的不同,也有很大的差异.本章主要以Windows XP SP3(x86 ...

  8. osgEarth基础入门(转载)

    osgEarth基础入门 osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,T ...

  9. OSG和osgearth显示中文(转载)

    osgEarth支持中文过程详解 OSG和osgearth显示中文 一.知识储备   要想很好的理解和解决这个问题,首先要了解什么是多字节和宽字节.说实话我之前也知道这两个字节到底有什么区别,只是简单 ...

随机推荐

  1. codevs4927 线段树练习5

    题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的所有数都增加c set a b c:把区间[a,b]内的所有数都设为c sum a b:查询区间[a,b] ...

  2. cogs896 圈奶牛

    描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. PROGRAM NAM ...

  3. (原)java中对象复制、==、equals

    对于基本数据类型而言,即如下八种基本数据类型,int,boolean,char,byte,short,float,double,long. public class test { public sta ...

  4. Android消息通知(notification)和PendingIntent传值

    通知栏的自定义布局:转:http://blog.csdn.net/vipzjyno1/article/details/25248021 拓展 实现自定义的通知栏效果: 这里要用到RemoteViews ...

  5. 使用Android Studio搭建Android集成开发环境

    有很长一段时间没有更新博客了,最近实在是太忙了,没有时间去总结,现在终于可以有时间去总结一些Android上面的东西了,很久以前写过这篇关于使用Android Studio搭建Android集成开发环 ...

  6. linux磁盘空间清理

    由于当初安装系统设计不合理,有些分区的过小,以及网络通讯故障等造成日志文件速度增长等其他原因都可以表现为磁盘空间满,造成无法读写磁盘,应用程序无法执行等.下面就给你支几招(以/home空间满为例): ...

  7. tuning-primer.sh mysql 报表

    [root@server-mysql mytop-1.6]# wget http://www.day32.com/MySQL/tuning-primer.sh --2016-07-03 19:42:3 ...

  8. 查看域名对应的ip地址

    nslookup   www.google.com.hk

  9. seajs+spm之再研究

    好久没有用seajs了,之前对spm也只是一知半解,这些天再次拿起来研究.谈谈我的认识与理解. 声明:本文不适合对seajs完全不了解的同学阅读.对于想知道seajs来龙去脉以及spm相关的同学&qu ...

  10. [WPF学习笔记]动态加载XAML

    好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代 ...