osgViewer应用基础

来源:互联网 发布:百度云 知乎 编辑:程序博客网 时间:2024/06/11 06:38

入门程序

#ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>int main(){    osgViewer::Viewer viewer;    osg::Node * node = new osg::Node;    node = osgDB::readNodeFile("glider.osg");    viewer.setSceneData(node);    return viewer.run();}

1.osgViewer应用基础

1.1添加帮助事件

//添加帮助事件
viewer->addEventHandler(new osgViewer::HelpHandler):点击H键显示信息

#ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#pragma comment(lib, "osgGAd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#pragma comment(lib, "osgGA.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osgGA/GUIEventAdapter>#include <osgViewer/ViewerEventHandlers>int main(){    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;    osg::ref_ptr<osg::Node> node = new osg::Node;    node = osgDB::readNodeFile("glider.osg");    //添加帮助事件    viewer->addEventHandler(new osgViewer::HelpHandler);    viewer->setSceneData(node);    return viewer->run();}

1.1.1 模拟一个事件类,响应单击h

#ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#pragma comment(lib, "osgGAd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#pragma comment(lib, "osgGA.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osgGA/GUIEventAdapter>#include <osgViewer/ViewerEventHandlers>//模拟一个事件类,响应单击hclass PrintName : public osgGA::GUIEventHandler{public:    virtual void getUsage(osg::ApplicationUsage& usage) const    {        usage.addKeyboardMouseBinding("zzx","good");    }};int main(){    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;    osg::ref_ptr<osg::Node> node = new osg::Node;    //读取模型    node = osgDB::readNodeFile("glider.osg");    //添加帮助事件    viewer->addEventHandler(new osgViewer::HelpHandler);    viewer->addEventHandler(new PrintName);    viewer->setSceneData(node);    return viewer->run();}

1.1.2 阻止事件起作用

#ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#pragma comment(lib, "osgGAd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#pragma comment(lib, "osgGA.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osgGA/GUIEventAdapter>#include <osgViewer/ViewerEventHandlers>//模拟一个事件类,响应单击hclass PrintName : public osgGA::GUIEventHandler{public:    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)    {        return true;    }    virtual void getUsage(osg::ApplicationUsage& usage) const    {        usage.addKeyboardMouseBinding("zzx","good");    }};int main(){    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;    osg::ref_ptr<osg::Node> node = new osg::Node;    //读取模型    node = osgDB::readNodeFile("glider.osg");    //添加帮助事件    //这个放viewer->addEventHandler(new PrintName);前面h键可以起作用,鼠标没有用,放后面h键不起作用    viewer->addEventHandler(new osgViewer::HelpHandler);    viewer->addEventHandler(new PrintName);    viewer->setSceneData(node);    return viewer->run();}

1.2 osgViewer的其他操作

  • 按s键显示帧数
    viewer->addEventHandler(new osgViewer::StatsHandler);

  • 按f键切换全屏
    viewer->addEventHandler(new osgViewer::WindowSizeHandler);

  • 按c键截图:在D:\OSG64\osgProject\osg03\osg03 可以找到截图
    viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);

    #ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#pragma comment(lib, "osgGAd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#pragma comment(lib, "osgGA.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osgGA/GUIEventAdapter>#include <osgViewer/ViewerEventHandlers>//模拟一个事件类,响应单击hclass PrintName : public osgGA::GUIEventHandler{public:    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)    {        return false;    }    virtual void getUsage(osg::ApplicationUsage& usage) const    {        usage.addKeyboardMouseBinding("zzx","good");    }};int main(){    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;    osg::ref_ptr<osg::Node> node = new osg::Node;    //读取模型    node = osgDB::readNodeFile("glider.osg");    //添加帮助事件    viewer->addEventHandler(new osgViewer::HelpHandler);    viewer->addEventHandler(new PrintName);    //按s键显示帧数    viewer->addEventHandler(new osgViewer::StatsHandler);    //按f键切换全屏    viewer->addEventHandler(new osgViewer::WindowSizeHandler);    //按c键截图:在D:\OSG64\osgProject\osg03\osg03 可以找到截图    viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);    viewer->setSceneData(node);    return viewer->run();}

1.3 定时器类:osg::Timer

  • 得到一个tick值为多少second
  • 得到某段代码的执行时间

    #ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#pragma comment(lib, "osgGAd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#pragma comment(lib, "osgGA.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osgGA/GUIEventAdapter>#include <osgGA/TrackballManipulator>#include <osgViewer/ViewerEventHandlers>//模拟一个事件类,响应单击hclass PrintName : public osgGA::GUIEventHandler{public:    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)    {        return false;    }    virtual void getUsage(osg::ApplicationUsage& usage) const    {        usage.addKeyboardMouseBinding("zzx","good");    }};int main(){    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;    osg::ref_ptr<osg::Node> node = new osg::Node;    //申请一个定时器类    osg::Timer* timer = new osg::Timer;    osg::Timer_t start_time = 0;    osg::Timer_t end_time = 0;    //得到一个tick值为多少second    std::cout << timer->getSecondsPerTick() << std::endl;    start_time = timer->tick();    //读取模型    node = osgDB::readNodeFile("glider.osg");    std::cout << "读取模型时间为:" << timer->time_s() << std::endl;    end_time = timer->tick();    std::cout << "方法二:读取模型时间为:" << timer->delta_s(start_time, end_time) << std::endl;    //添加帮助事件    viewer->addEventHandler(new osgViewer::HelpHandler);    viewer->addEventHandler(new PrintName);    //按s键显示帧数    viewer->addEventHandler(new osgViewer::StatsHandler);    //按f键切换全屏    viewer->addEventHandler(new osgViewer::WindowSizeHandler);    //按c键截图:在D:\OSG64\osgProject\osg03\osg03 可以找到截图    viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);    viewer->setSceneData(node);    return viewer->run();}

1.3.1 osg中控制帧速实例

#ifdef _DEBUG#pragma comment(lib, "osgd.lib")#pragma comment(lib, "osgDBd.lib")#pragma comment(lib, "osgViewerd.lib")#pragma comment(lib, "OpenThreadsd.lib")#pragma comment(lib, "osgGAd.lib")#else#pragma comment(lib, "osg.lib")#pragma comment(lib, "osgDB.lib")#pragma comment(lib, "osgViewer.lib")#pragma comment(lib, "OpenThreads.lib")#pragma comment(lib, "osgGA.lib")#endif#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osgGA/GUIEventAdapter>#include <osgGA/TrackballManipulator>#include <osgViewer/ViewerEventHandlers>//模拟一个事件类,响应单击hclass PrintName : public osgGA::GUIEventHandler{public:    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)    {        return false;    }    virtual void getUsage(osg::ApplicationUsage& usage) const    {        usage.addKeyboardMouseBinding("zzx","good");    }};int main(){osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;osg::ref_ptr<osg::Node> node = new osg::Node;//申请一个定时器类osg::Timer* timer = new osg::Timer;osg::Timer_t start_time = 0;osg::Timer_t end_time = 0;osg::Timer_t start_frame_timer=0,end_frame_timer=0; //控制帧速使用睡眠时间  double sleep_time=0.0;  double last_sleep=0.0001;  //每帧的实际使用时间  double current_time=0.0;  //每帧控制法  double per_str_time=0.0;  double per_end_time=0.0; //得到一个tick值为多少secondstd::cout << timer->getSecondsPerTick() << std::endl;start_time = timer->tick();//读取模型node = osgDB::readNodeFile("glider.osg");std::cout << "读取模型时间为:" << timer->time_s() << std::endl;end_time = timer->tick();std::cout << "方法二:读取模型时间为:" << timer->delta_s(start_time, end_time) << std::endl;//添加帮助事件viewer->addEventHandler(new osgViewer::HelpHandler);viewer->addEventHandler(new PrintName);//按s键显示帧数viewer->addEventHandler(new osgViewer::StatsHandler);//按f键切换全屏viewer->addEventHandler(new osgViewer::WindowSizeHandler);//按c键截图:在D:\OSG64\osgProject\osg03\osg03 可以找到截图viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);//记录当前的路径事件viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);  viewer->setSceneData(node);//加操作器viewer->setCameraManipulator(new osgGA::TrackballManipulator());int counts=0;//计算帧速  while(!viewer->done())//此循环默认情况下一般每秒钟执行60次  {      per_str_time=timer->tick();      if (counts==0)      {          start_frame_timer=timer->tick();      }      counts++;      viewer->frame();      //方法二      per_end_time=timer->tick();      //0.1表示10帧每秒钟      //sleep_time=0.1-timer->delta_s(per_str_time,per_end_time);      /*控制帧速的公式为:每帧睡眠的时间=期望每帧绘制的时间-实际绘制的时间     假如:帧速为x,那么每帧绘制的时间为:1.0/x(秒),实际绘制的的时间为:t     那么需要睡眠的时间=1.0/x-t     */      //delta_s是计算per_str_time,per_end_time之间的差值,就是per_end_time-per_str_time      sleep_time=1.0/35.0-timer->delta_s(per_str_time,per_end_time);      //sleep_time是得到每帧      //如果sleep_time的值小于0,则说明实际绘制的时间大于期望的时间      //因此此时就不需要再睡眠了,如果在继续睡眠,则效率会更差      if (sleep_time<0)      {          sleep_time=0.0;      }      OpenThreads::Thread::microSleep(sleep_time*1000000);      if (counts==3)      {          //限制帧速为10,每帧为0.1秒,那么10帧就为1秒          end_frame_timer=timer->tick();          std::cout<<"当前帧速为:"<<counts/timer->delta_s(start_frame_timer,end_frame_timer)<<std::endl;          counts=0;          //得到当前每帧绘制所用时间          //sleep_time=0.1-(timer->delta_s(start_frame_timer,end_frame_timer))/3;//方法一          //if (sleep_time<0)//如果小于0,则表示实际绘制的时间,比期望的时间要大          //{          //  //比如期望的帧数为10,但实际绘制的为8帧,因此8-10会小于0          //  sleep_time=last_sleep*0.8;          //  last_sleep=sleep_time;          //}      }  }  return 0;  }
原创粉丝点击