[osg-users] Upon Clicking the mouse left button the model should appear there

Robert Osfield robert.osfield at gmail.com
Mon Dec 5 00:37:50 PST 2016


Hi Rambabu,

Rather than tell you the exact problem I think it would be more useful
help you debug things yourself.

The first thing I'd suggest is have a look at the
osgGA::GUIEventAdapter header, have a look at the type returned from
the getType() method, then look at the associated enum.

Another route is to look at existing examples that use mouse buttons,
using grep or other search tools can help in this.

Robert.


On 5 December 2016 at 07:35, Rambabu Repaka <ramboram488 at gmail.com> wrote:
> Hi,
> float CenLat = 12.0, CenLon = 77.0;
> float MinLat, MaxLat,MinLon,MaxLon;
> float Width = 1280, Height = 1024;
> float DifLat, DifLon,scale;
> float x,y,PrevX,PrevY;
> class ModelController : public osgGA::GUIEventHandler
> {
> public:
>         ModelController(osg::MatrixTransform* node) : _model(node) {}
>         virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
> protected:
>         osg::ref_ptr<osg::MatrixTransform> _model;
>
> };
>
> bool ModelController::handle( const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa )
> {
>         if ( !_model ) return false;
>         float msePreLon = MinLon + ((ea.getX())/scale);
>         float msePresLt = MinLat + ((ea.getY())/ scale);
>         if (msePreLon > 180)    {
>                 msePreLon = 180;
>         }
>         else if (msePreLon < -180)      {
>                 msePreLon = -180.0;
>         }
>         if (msePresLt > 90)     {
>                 msePresLt = 90;
>         }
>         else if (msePresLt < -90)       {
>                 msePresLt = -90;
>         }
>         osg::Matrix matrix   =  _model->getMatrix();
>         switch ( ea.getEventType() )
>         {
>         case osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON:
>         {
>                 CenLon = msePreLon;
>                 CenLat = msePresLt ;
>                 if ((CenLon - (DifLon / 2.0)) < -180)       { CenLon = -180 + (DifLon / 2.0); }
>                 else if ((CenLon + (DifLon / 2.0)) > 180)   { CenLon =  180 - (DifLon / 2.0); }
>                 if ((CenLat - (DifLat / 2.0)) < -90)        { CenLat =  -90 + (DifLat / 2.0); }
>                 else if ((CenLat + (DifLat / 2.0)) > 90)    { CenLat =   90 - (DifLat / 2.0); }
>                 MinLon = CenLon - (DifLon / 2.0);
>                 MinLat = CenLat - (DifLat / 2.0);
>                 MaxLon = CenLon + (DifLon / 2.0);
>                 MaxLat = CenLat + (DifLat / 2.0);
>                 //matrix *= osg::Matrix::scale(scale,scale,0.0);
>                 matrix *= osg::Matrix::translate(CenLon, 0.0, CenLat);
>         }
>         _model->setMatrix( matrix );
>
>         }
>         return false;
> }
> int main(int argc, char **argv)
> {
>         osg::DisplaySettings::instance()->setNumMultiSamples(4);
>         scale = Width;
>         osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("D:/RamFolder/OSG/OSG_Binary/OpenSceneGraph-3.0.1-VS9.0.30729-x86-debug-12741/data/cessna.osg");
>         osg::ref_ptr<osg::MatrixTransform > mt = new osg::MatrixTransform;
>         mt->addChild(model.get());
>         osg::ref_ptr<osg::Projection> projection = new osg::Projection;
>         projection->setMatrix(osg::Matrix::ortho2D(-Width/2, Width / 2, -Height/2, Height / 2));
>         projection->addChild(mt.get());
>         if (scale < Width / 2)  {
>                 scale = Width / 2;
>         }
>         if (scale > Width * 100)        {
>                 scale = Width * 100;
>         }
>         DifLat = Width / scale;
>         DifLon = Height / scale;
>
>         if ((CenLon - (DifLon / 2.0)) < -180)       { CenLon = -180 + (DifLon / 2.0); }
>         else if ((CenLon + (DifLon / 2.0)) > 180)   { CenLon = 180 - (DifLon / 2.0); }
>         if ((CenLat - (DifLat / 2.0)) < -90)        { CenLat = -90 + (DifLat / 2.0); }
>         else if ((CenLat + (DifLat / 2.0)) > 90)    { CenLat = 90 - (DifLat / 2.0); }
>         MinLon = CenLon - (DifLon / 2.0);
>         MinLat = CenLat - (DifLat / 2.0);
>         MaxLon = CenLon + (DifLon / 2.0);
>         MaxLat = CenLat + (DifLat / 2.0);
>
>         osg::ref_ptr<ModelController> ctrler = new ModelController(mt.get());
>
>         osgViewer::Viewer viewer;
>         viewer.setSceneData(projection.get());
>         viewer.addEventHandler(ctrler.get());
>         viewer.setUpViewInWindow(500, 500, 500, 500);
>         return viewer.run();
> }
>
> Upon clicking the mouse left button the model should appear there.But it is not happening.can anyone help me in finding the solution?
>
> ...
>
> Thank you!
>
> Cheers,
> Rambabu
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=69593#69593
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



More information about the osg-users mailing list