3

I have loaded 3D Model in my scene and i want to walk through in the world. i achieved forward,backward,left,right,up and down but i need to rotate my camera at that camera location about x,y,z but i aam not able to get please help me??

#include <osgViewer/ViewerEventHandlers>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

#include <osg/Camera>



#include <math.h>



osg::Matrixd md ;
osg::Matrixd originalmd ;
osg::Quat qua;
float angle=0;

   osgViewer::Viewer viewer;
   osg::Vec3f eye=osg::Vec3f(1.0,-200.0,2.0);
   osg::Vec3f centre=osg::Vec3f(0.0,0.0,0.0);
   osg::Vec3f up=osg::Vec3f(0.0,0.0,1.0);

   osg::Vec3f originaleye=osg::Vec3f(0.0,-200.0,0.0);
   osg::Vec3f originalcentre=osg::Vec3f(0.0,0.0,0.0);
   osg::Vec3f originalup=osg::Vec3f(0.0,0.0,1.0);

   int ConstantVariation=5;


class PickHandler : public osgGA::GUIEventHandler 
{
public: 

PickHandler() {}

~PickHandler() {}

bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);


protected:

};

bool PickHandler::handle(const osgGA::GUIEventAdapter&          ea,osgGA::GUIActionAdapter& aa)
{
switch(ea.getEventType())
{
    case(osgGA::GUIEventAdapter::PUSH):
    {
        osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
        //if (view) pick(view,ea);
        return false;
    }    
    case(osgGA::GUIEventAdapter::KEYDOWN):
    {
        if (ea.getKey()=='c')
        {    
            osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
            osg::ref_ptr<osgGA::GUIEventAdapter> event = new osgGA::GUIEventAdapter(ea);
            event->setX((ea.getXmin()+ea.getXmax())*0.5);
            event->setY((ea.getYmin()+ea.getYmax())*0.5);
           // if (view) pick(view,*event);
        }
        if (ea.getKey()== osgGA::GUIEventAdapter::KEY_Up)
        {   
            std::cout<<"Forward"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans=md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            md.getLookAt(eye,centre,up);

            trans.z()=trans.z()+5;

            md.setTrans(trans);
        }
    if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down)
        { 
            std::cout<<"BackWard"<<std::endl;  


            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans=md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            md.getLookAt(eye,centre,up);
            trans.z()=trans.z()-5;

            md.setTrans(trans);

        }
        if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Left)
        {        

            std::cout<<"LEFT Side"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans=md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            md.getLookAt(eye,centre,up);

            trans.x()=trans.x()+5;

            md.setTrans(trans);
        }

        if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Right)
        {        

            std::cout<<"Right Side"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans = md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            trans.x()=trans.x()-5;
            md.setTrans(trans);


        }
        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Page_Up)
        {
            std::cout<<"UP"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans = md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            trans.y()=trans.y()-5;
            md.setTrans(trans);


        }

        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Page_Down)
        {
            std::cout<<"Down"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans = md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            trans.y()=trans.y()+5;
            md.setTrans(trans);


        }

        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_8)
        {
            std::cout<<"Rotation"<<std::endl;
            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans=md.getTrans();
            double a=trans.x();
            double b=trans.y();
            double c=trans.z();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;
            md.setTrans(osg::Vec3d(0,0,0));
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            angle=0.077;
            //osg::Quat qa(angle,osg::Vec3d(0.0,0.0,1.0));

            md.getLookAt(eye,centre,up);
            osg::Quat qa(angle,up);
            md.setRotate(qa);
            up=md.getRotate()*trans;

            md.setRotate(qa);
            trans.x()=a;
            trans.y()=b;
            trans.z()=c;
            md.setTrans(trans);

            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;
            std::cout<<" End Rotation"<<std::endl;
        }           


        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Space)
        {
            md=originalmd;

        }
        return false;
    }    
    default:
        return false;
 }
}



int main( int argc, char **argv )
{



osg::ref_ptr<osg::Group> scene = new  osg::Group;

scene->addChild(osgDB::readNodeFile("cessna.osg"));

viewer.addEventHandler(new osgViewer::WindowSizeHandler);
viewer.addEventHandler(new PickHandler());

viewer.setSceneData(scene.get());

const osg::BoundingSphere& bs = scene->getBound();


viewer.getCamera()->setViewMatrixAsLookAt(bs.center()+osg::Vec3(0.0f, -(3*bs.radius()),0.0f), bs.center(), osg::Z_AXIS) ;

md=viewer.getCamera()->getViewMatrix();
originalmd=md;



viewer.realize();

while(!viewer.done())
{
    viewer.getCamera()->setViewMatrix(md);
    viewer.frame();
 }


}

Edited:- I am having doubt that whether am performing task in proper way i.e i need to move camera but above code translate and rotate object to feel that camera is rotated...many websites says that in opengl there is no camera link(https://www.opengl.org/archives/resources/faq/technical/viewing.htm).

  • Have you looked through the different manipulators that come with osg? (They're found in the osgManipulator module.) Sometimes there's no point recoding the wheel. – Vaillancourt Jan 26 '15 at 13:00
  • ya i tried all manipulators in osg but the default values of camera motion are not adjustable for my model..so i am trying to write walk through so that it would be generic for all models by changing offset values in x,y,z directions –  Jan 31 '15 at 09:01
  • can you please help me to install OpensceneGraph on Ubuntu.. i am struggling, don't know where to start and where it will end – Irfan Ghaffar7 Mar 02 '15 at 14:35
  • http://trac.openscenegraph.org/projects/osg//wiki/Support/GettingStarted @ Irfan Ghaffar7 –  Mar 05 '15 at 10:43

2 Answers2

0

Just like for translation you are getting the existing translation using getTrans() and adding an increment or decrement to it, similarly for rotation also get the existing rotation using getRotate() and then add a small increment or decrement to it, don't directly set it to the same value every time.

sn710
  • 581
  • 5
  • 20
  • after geting rotation value i tried to set rotation by using function setrotate(osg::quat) but it takes quaternion as argument.i donot have idea how to set exact quaternion to set... –  Jan 31 '15 at 09:08
0

performing as i needed but can i do much better than this..

#include <osgViewer/ViewerEventHandlers>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

#include <osg/Camera>



 #include <math.h>




// class to handle events with a pick


osg::Matrixd md ;
osg::Matrixd originalmd ;
osg::Quat qua;
float angle=0;

   osgViewer::Viewer viewer;
   osg::Vec3f eye=osg::Vec3f(0.0,-200.0,0.0);
   osg::Vec3f centre=osg::Vec3f(0.0,0.0,0.0);
   osg::Vec3f up=osg::Vec3f(0.0,0.0,1.0);

   osg::Vec3f originaleye=osg::Vec3f(0.0,-200.0,0.0);
   osg::Vec3f originalcentre=osg::Vec3f(0.0,0.0,0.0);
   osg::Vec3f originalup=osg::Vec3f(0.0,0.0,1.0);

   int ConstantVariation=5;


  class PickHandler : public osgGA::GUIEventHandler {
  public: 

  PickHandler() {}

  ~PickHandler() {}

  bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);


protected:

 };

bool PickHandler::handle(const osgGA::GUIEventAdapter&   ea,osgGA::GUIActionAdapter& aa)
{
   switch(ea.getEventType())
   {
       case(osgGA::GUIEventAdapter::PUSH):
      {
         osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
         //if (view) pick(view,ea);
         return false;
     }    
    case(osgGA::GUIEventAdapter::KEYDOWN):
    {
        if (ea.getKey()=='c')
        {    
            osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
            osg::ref_ptr<osgGA::GUIEventAdapter> event = new osgGA::GUIEventAdapter(ea);
            event->setX((ea.getXmin()+ea.getXmax())*0.5);
            event->setY((ea.getYmin()+ea.getYmax())*0.5);
           // if (view) pick(view,*event);
        }
        if (ea.getKey()== osgGA::GUIEventAdapter::KEY_Up)
        {   
            std::cout<<"Forward"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            md.getLookAt(eye,centre,up);

            osg::Vec3f actuallook=centre-eye;

            actuallook=actuallook/(actuallook.length());


            eye=eye+((actuallook)*10);
            centre=centre+((actuallook)*10);

            viewer.getCamera()->setViewMatrixAsLookAt(eye, centre, osg::Z_AXIS) ;
        }
    if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down)
        { 
            std::cout<<"BackWard"<<std::endl;  


            md=viewer.getCamera()->getViewMatrix();
            md.getLookAt(eye,centre,up);

            osg::Vec3f actuallook=centre-eye;

            actuallook=actuallook/(actuallook.length());


            eye=eye-((actuallook)*10);

            viewer.getCamera()->setViewMatrixAsLookAt(eye, centre, osg::Vec3d(up.x(),up.y(),up.z())) ;

        }
        if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Left)
        {        

            std::cout<<"LEFT Side"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans=md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            md.getLookAt(eye,centre,up);

            trans.x()=trans.x()+10;

            md.setTrans(trans);

            viewer.getCamera()->setViewMatrix(md);
        }

        if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Right)
        {        

            std::cout<<"Right Side"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans = md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            trans.x()=trans.x()-10;
            md.setTrans(trans);

            viewer.getCamera()->setViewMatrix(md);


        }
        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Page_Up)
        {
            std::cout<<"UP"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans = md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            trans.y()=trans.y()-10;
            md.setTrans(trans);

            viewer.getCamera()->setViewMatrix(md);


        }

        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Page_Down)
        {
            std::cout<<"Down"<<std::endl;

            md=viewer.getCamera()->getViewMatrix();
            osg::Vec3d trans = md.getTrans();
            std::cout<<"translation="<<trans.x()<<","<<trans.y()<<","<<trans.z()<<std::endl;

            trans.y()=trans.y()+10;
            md.setTrans(trans);

            viewer.getCamera()->setViewMatrix(md);


        }
        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_7)
        {
            std::cout<<"Rotation"<<std::endl;
            md=viewer.getCamera()->getViewMatrix();


            angle=(3.142/180)*2;

            md.getLookAt(eye,centre,up);
            std::cout<<"up="<<up.x()<<up.y()<<up.z()<<std::endl;

            osg::Vec3f actuallook=centre-eye;
            actuallook=actuallook/(actuallook.length());

            osg::Quat qa(-angle,osg::Vec3f(up.x(),up.y(),up.z()));

            osg::Vec3f look= (qa * actuallook);
            look=look/(look.length());
            centre = eye+(look*actuallook.length());

            viewer.getCamera()->setViewMatrixAsLookAt(eye, centre, osg::Vec3d(up.x(),up.y(),up.z())) ;
            std::cout<<"up="<<up.x()<<up.y()<<up.z()<<std::endl;

            std::cout<<" End Rotation"<<std::endl;
        }

        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_8)
        {
            std::cout<<"Rotation"<<std::endl;
            md=viewer.getCamera()->getViewMatrix();


            angle=(3.142/180)*2;

            md.getLookAt(eye,centre,up);
            std::cout<<"up="<<up.x()<<up.y()<<up.z()<<std::endl;

            osg::Vec3f actuallook=centre-eye;
            actuallook=actuallook/(actuallook.length());

            osg::Quat qa(angle,osg::Vec3f(up.x(),up.y(),up.z()));

            osg::Vec3f look= (qa * actuallook);
            look=look/(look.length());
            centre = eye+(look*actuallook.length());

            viewer.getCamera()->setViewMatrixAsLookAt(eye, centre, osg::Vec3d(up.x(),up.y(),up.z())) ;
            std::cout<<"up="<<up.x()<<up.y()<<up.z()<<std::endl;

            std::cout<<" End Rotation"<<std::endl;
        }           


        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Space)
        {
            md=originalmd;
            viewer.getCamera()->setViewMatrix(originalmd);

        }
        return false;
    }    
    default:
        return false;
}
}



int main( int argc, char **argv )
 {



osg::ref_ptr<osg::Group> scene = new  osg::Group;

//scene->addChild(osgDB::readNodeFile("F:\\Fantasy Mall\\Fantasy Mall\\Fantasy_Mall.obj"));

scene->addChild(osgDB::readNodeFile("cessna.osg"));

viewer.addEventHandler(new osgViewer::WindowSizeHandler);
viewer.addEventHandler(new PickHandler());

viewer.setSceneData(scene.get());

const osg::BoundingSphere& bs = scene->getBound();


viewer.getCamera()->setViewMatrixAsLookAt(bs.center()+osg::Vec3(0.0f, -(3*bs.radius()),0.0f), bs.center(), osg::Z_AXIS) ;

md=viewer.getCamera()->getViewMatrix();
originalmd=md;



viewer.realize();

while(!viewer.done())
{

    //viewer.getCamera()->setViewMatrix(md);
    viewer.frame();
}


}