|
本帖最后由 lianghui 于 2010-1-13 21:03 编辑
OSG EARTH的问题求教
1、将一个分层分块的图贴到地球表面。
我的做法:在本机上发布了MyMap目录,里边包含一个tms.xml文件,文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
- <tilemap tilemapservice="" version="">
<title />
<abstract />
<srs>EPSG:41001</srs>
<boundingbox maxx="2558000.00" maxy="752000.00" minx="-2050000.00" miny="-2137000.00" />
<origin x="-2050000.00" y="-2137000.00" />
<tileformat extension="jpg" height="256" mime-type="" width="256" />
- <tilesets profile="local">
<tileset href="" order="0" units-per-pixel="64000" />
</tileset>
<tileset href="" order="1" units-per-pixel="32000" />
</tileset>
<tileset href="" order="2" units-per-pixel="16000" />
</tileset>
< </tilesets>
</tilemap>
同级目录包含文件夹:0,1,2,各文件夹内包含了2^N个文件夹和金字塔分割的4^N张图片。
使用代码
osg::ArgumentParser arguments(&argc,argv);
osgViewer::Viewer viewer(arguments);
osgEarthUtil::EarthManipulator* manip = new osgEarthUtil::EarthManipulator();
viewer.setCameraManipulator( manip );
osgEarth::Map* map = new osgEarth::Map();
osgEarth::Config conf;
conf.add( "url", “http://localhost/MyMap/tms.xml” );
map->addMapLayer( new osgEarth::MapLayer(
"MyMap", osgEarth::MapLayer::TYPE_IMAGE, "tms", conf ) );
osgEarth::MapNode* mapNode = new osgEarth::MapNode( map );
viewer.setSceneData( mapNode );
//viewer.addEventHandler(new osgViewer::StatsHandler());
viewer.addEventHandler(new osgViewer::StatsHandler());
viewer.addEventHandler(new osgViewer::WindowSizeHandler());
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
return viewer.run();
渲染后看不到球体,在对应的位置也看不到我发布的图片。
如果将红色字体部分替换成
conf.add( "url", "http://pelicanmapping.com/downloads/jason/OakRidge_UTM_TMS/tilemapresource.xml" );
还是能浏览到地球的。
2、在浏览地球的时候,相机必须接近一定高度才出现渲染地球图层,在这个高度、视角以上时图层不出现或者只出现地球的一小块。代码是这样的:
m_pViewer = new osgViewer::Viewer();
m_pManip = new osgEarthUtil::EarthManipulator();
m_pRoot = new osg::Switch;
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setProjectionMatrixAsPerspective( 40.0f,(double)m_Traits->width/(double)m_Traits->height, 1.0f, 10000.0f );
// construct the viewer.
m_pViewer->setCameraManipulator( m_pManip );
m_pViewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
m_pViewer->setCamera( camera.get() );
m_pMapNode = new MapNode();
osg::ref_ptr<osg::Node> loadedModel = m_pMapNode;
m_pfadeLayerNode = new osgEarthUtil::FadeLayerNode( m_pMapNode->getMap(), m_pMapNode->getEngine()->getEngineProperties());
m_pfadeLayerNode->addChild(loadedModel.get());
m_pRoot->addChild(m_pfadeLayerNode);
m_pViewer->setSceneData(m_pRoot);
m_pViewer->realize();
等m_pViewer->frame();执行后,再中断,加载如下图层:
conf.add( "url", "http://pelicanmapping.com/downloads/jason/OakRidge_UTM_TMS/tilemapresource.xml“);
MapLayer* layer = new MapLayer((std::string)LayerName, MapLayer::TYPE_IMAGE, (std::string)TypeImage, conf );
m_pMapNode->getMap()->addMapLayer(layer);
光板球消失,但是地球没有渲染出来,需要拉近一定高度才能出现。在出现的临界范围来回转动地球,只能看见其中一块图片。
这两个问题困扰了我很久了……
void setProjectionMatrixAsPerspective( double fovy,
double aspectRatio, double zNear, double zFar );
对应的参数里边第一个参数设成40.0时效果要比10.0时要好,最后一个参数值10000比100的效果要好。
camera->setProjectionMatrixAsPerspective( 40.0f,(double)m_Traits->width/(double)m_Traits->height, 1.0f, 10000.0f ); |
|