// Add an elevationlayer (SRTM from a local GeoTiff file) { GDALOptions gdal; gdal.url() = "c:/data/srtm.tif"; ElevationLayer* layer = new ElevationLayer( "SRTM", gdal ); map->addElevationLayer( layer ); }
Other point is that, as you can see in the image below, the whole flat world is white, and Brazil is where it's supposed to be (southern and western hemispheres). But I'd like to have the world transparent instead of white, so only Brazil (or any selected country) would be visible.
[img]https://imgur.com/UVEGwuj[/img]
Here's my source code:
Code:
#include <iostream> // cout
#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgText/Font>
#include <osgText/Text>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>
#include <osgEarth/ImageLayer>
#include <osgEarth/Map>
#include <osgEarth/MapNode>
#include <osgEarthDrivers/gdal/GDALOptions>
using namespace std;
using namespace osg;
using namespace osgEarth;
using namespace osgEarth::Drivers;
osg::ref_ptr<osgText::Font> g_font = osgText::readFontFile("fonts/arial.ttf");
osg::Camera* createHUDCamera( double left, double right, double bottom, double top ) {
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
camera->setClearMask( GL_DEPTH_BUFFER_BIT );
camera->setRenderOrder( osg::Camera::POST_RENDER );
camera->setAllowEventFocus( false );
camera->setProjectionMatrix( osg::Matrix::ortho2D(left, right, bottom, top) );
return camera.release();
}
osgText::Text* createText( const osg::Vec3& pos, const std::string& content, float size ) {
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( g_font.get() );
text->setCharacterSize( size );
text->setAxisAlignment( osgText::TextBase::XY_PLANE );
text->setPosition( pos );
text->setText( content, osgText::String::ENCODING_UTF8 );
return text.release();
}
Vec3d getHPRfromQuat(osg::Quat quat) {
double qx = quat.x();
double qy = quat.y();
double qz = quat.z();
double qw = quat.w();
double sqx = qx * qx;
double sqy = qy * qy;
double sqz = qz * qz;
double sqw = qw * qw;
double term1 = 2*(qx*qy+qw*qz);
double term2 = sqw+sqx-sqy-sqz;
double term3 = -2*(qx*qz-qw*qy);
double term4 = 2*(qw*qx+qy*qz);
double term5 = sqw - sqx - sqy + sqz;
double heading = atan2(term1, term2);
double pitch = atan2(term4, term5);
double roll = asin(term3);
return Vec3d( heading, pitch, roll );
}
int main (int argc, char** argv) {
// Cria o texto do HUD
osg::ref_ptr<osgText::Text> text1 = createText(osg::Vec3(10, 748, 0),"Heading",10.0f);
osg::ref_ptr<osgText::Text> text2 = createText(osg::Vec3(10, 728, 0),"Pitch",10.0f);
osg::ref_ptr<osgText::Text> text3 = createText(osg::Vec3(10, 708, 0),"Roll",10.0f);
text1->setDataVariance(osg::Object::DYNAMIC); // pra poder mudar o texto depois
text2->setDataVariance(osg::Object::DYNAMIC); // pra poder mudar o texto depois
text3->setDataVariance(osg::Object::DYNAMIC); // pra poder mudar o texto depois
osg::ref_ptr<osg::Geode> textGeode = new osg::Geode;
textGeode->addDrawable( text1 );
textGeode->addDrawable( text2 );
textGeode->addDrawable( text3 );
osg::Camera* camera = createHUDCamera(0, 1024, 0, 768);
camera->addChild( textGeode.get() );
camera->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
// Cria um Mapa na opção "projetado" para mostrar num plano (ao invés de num globo)
MapOptions mapOpt;
mapOpt.coordSysType() = MapOptions::CSTYPE_PROJECTED;
mapOpt.profile() = ProfileOptions("plate-carre");
osg::ref_ptr<Map> map = new Map(mapOpt);
// Adiciona uma camada de imagem/textura (vegetação do Brasil num GeoTiff)
{
GDALOptions gdal;
gdal.url() = "br_modified.tif";
//XMIN XMAX YMIN YMAX
//-74 -34.79 -33.84 5.37
osg::ref_ptr<ImageLayer> layer = new ImageLayer( "BR", gdal );
//layer->setOpacity(0.5);
printf("\nOpacity: %.2f\n",layer->getOpacity());
map->addLayer( layer );
}
// Adiciona uma camada de elevação (SRTM de um arquivo GeoTiff)
{
GDALOptions gdal;
gdal.url() = "BRalt.tif";
osg::ref_ptr<ElevationLayer> layer = new ElevationLayer( "SRTM", gdal );
map->addLayer( layer );
}
// Cria um MapNode para renderizar este mapa
osg::ref_ptr<MapNode> mapNode = new MapNode( map );
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild( mapNode.get() );
root->addChild( camera );
osgViewer::Viewer viewer;
viewer.setSceneData( root.get() );
viewer.setCameraManipulator( new osgGA::TrackballManipulator );
Vec3d v;
while ( !viewer.done() ) {
v = getHPRfromQuat( viewer.getCamera()->getProjectionMatrix().getRotate() );
text1->setText((L"Heading: " + to_wstring(v.x())).c_str());
text2->setText((L"Pitch: " + to_wstring(v.y())).c_str());
text3->setText((L"Roll: " + to_wstring(v.z())).c_str());
viewer.frame();
}
return 0;
}
// g++ main.cpp -losg -losgDB -losgViewer -losgEarth -losgText -losgGA -o main
Thank you!
Cheers,
Rodrigo
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75432#75432