So, I learned how to put HUD text, and I'm trying to understand the movement of 
the camera sending the camera's coordinates to this text. However, the three 
coordinates (heading, pitch and roll) are always 0 or pi, which seems more a 
rounding error than anything else. It seems the world is moving, instead of the 
camera, which I guess is the way that TrackballManipulator works. I want to 
move the camera around, using WASD keys and mouse movement, but still couldn't 
get it from the examples (like FirstPersonManipulator). I couldn't even manage 
to put the camera in a proper initial position! (Here's what I've tried so far: 
http://forum.openscenegraph.org/viewtopic.php?t=17623)

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





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to