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; }
阅读全文
0 0
- osgViewer应用基础
- osg之osgViewer基础应用
- osgViewer应用基础之添加键盘事件
- osgViewer::Viewer
- osgViewer::ViewerBase
- osgViewer::Viewer详解
- osgViewer销毁bug
- OSG 第三讲,OSGviewer加入键盘响应
- 1、osgViewer::Viewer,osgViewer::ViewerBase,osgGA::KeySwitchMatrixManipulator,osg::ArgumentParser的说明
- 第一日学习(一)osgViewer/ViewerBase.cpp
- 用一张图片来修改osgViewer的背景
- OSG学习:osgViewer命令行参数和常用操作
- JSP基础:JavaBean基础应用
- 多媒体技术基础及应用
- J2ME应用基础
- 数据库应用基础系列
- AJAX基础应用专题
- C#多线程应用基础
- CodeForces 4 A.Watermelon(水~)
- Go语言学习笔记 --- 入门介绍
- Spring boot 整合mybtais和druid
- JDBC技术
- spring boot 使用hibernate-validation
- osgViewer应用基础
- NVcaffe源码阅读——Blob的重新构建
- 排序算法
- NOIP2016Day1T1玩具谜题解题报告
- spring boot 多数据源动态切换
- Ubuntu14.04安装最新版Docker
- Hadoop小兵笔记【五】hadoop2.2.0伪分布式环境搭建疑难-第一个用例wordcount失败
- 一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高
- 多人聊天室(基于Linux的SOCKET UDP编程)