void update( float x, float y, osgViewer::View* view ) { bool yes = false; // look under the mouse: osg::Vec3d world; osgUtil::LineSegmentIntersector::Intersections hits; if ( view->computeIntersections(x, y, hits) ) { world = hits.begin()->getWorldIntersectPoint(); // convert to map coords: GeoPoint mapPoint; mapPoint.fromWorld( s_mapNode->getMapSRS(), world ); // Depending on the level of detail key you request, you will get a mesh that should line up exactly with the highest resolution mesh that the terrain engine will draw. // At level 15 that is a 257x257 heightfield. If you select a higher lod, the mesh will be less dense. TileKey key = s_mapNode->getMap()->getProfile()->createTileKey(mapPoint.x(), mapPoint.y(), 15); OE_NOTICE << "Creating tile " << key.str() << std::endl; osg::ref_ptr<osg::Node> node = s_mapNode->getTerrainEngine()->createTile(key); if (node.valid()) { // Extract the triangles from the node that was created and do our own rendering. Simulates what you would do when passing in the triangles to a physics engine. OE_NOTICE << "Created tile for " << key.str() << std::endl; CollectTrianglesVisitor v; node->accept(v); node = v.buildNode(); if (_node.valid()) { s_root->removeChild( _node.get() ); } osg::Group* group = new osg::Group; // Show the actual mesh. group->addChild( node.get() ); _node = group; // Clamp the marker to the intersection of the triangles created by osgEarth. This should line up with the mesh that is actually rendered. double z = 0.0; s_mapNode->getTerrain()->getHeight( node, s_mapNode->getMapSRS(), mapPoint.x(), mapPoint.y(), &z); GeoTransform* xform = new GeoTransform(); xform->setPosition( osgEarth::GeoPoint(s_mapNode->getMapSRS(),mapPoint.x(), mapPoint.y(), z, ALTMODE_ABSOLUTE) ); xform->addChild( marker.get() ); group->addChild( xform ); s_root->addChild( _node.get() ); } else { OE_NOTICE << "Failed to create tile for " << key.str() << std::endl; } } }
void update( float x, float y, osgViewer::View* view ) { bool yes = false; // look under the mouse: osg::Vec3d world; osgUtil::LineSegmentIntersector::Intersections hits; if ( view->computeIntersections(x, y, hits) ) { world = hits.begin()->getWorldIntersectPoint(); // convert to map coords: GeoPoint mapPoint; mapPoint.fromWorld( s_mapNode->getMapSRS(), world ); TileKey key = s_mapNode->getMap()->getProfile()->createTileKey(mapPoint.x(), mapPoint.y(), 13); OE_NOTICE << "Creating tile " << key.str() << std::endl; osg::ref_ptr<osg::Node> node = s_mapNode->getTerrainEngine()->createTile(key); if (node.valid()) { OE_NOTICE << "Created tile for " << key.str() << std::endl; CollectTrianglesVisitor v; node->accept(v); osg::ref_ptr<osg::Node> output = v.buildNode(); osgDB::writeNodeFile( *output.get(), "createtile.osgt" ); OE_NOTICE << "Wrote tile to createtile.osgt\n"; //osgDB::writeNodeFile(v.buildNode( //s_root->addChild(v.buildNode()); } else { OE_NOTICE << "Failed to create tile for " << key.str() << std::endl; } } }