目录
1. 前言
2. osgViewer::ScreenCaptureHandler
3. osgViewer::LODScaleHandler
4. osgViewer::HelpHandler
5. osgViewer::ThreadingHandler
1. 前言
osg为视景器的使用和调试提供了丰富的辅助组件,它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::ScreenCaptureHandler、osgViewer::LODScaleHandler、osgViewer::HelpHandler 、osgViewer::ThreadingHandler类就是其中的4个经常用到的辅助组件。其它组件参见如下博文:
- 浅谈osgViewer::StatsHandler、osg::Stats类的用法。
- osgViewer中的WindowSizeHandler和osgGA中的StateSetManipulator事件处理器用法。
2. osgViewer::ScreenCaptureHandler
该事件处理提供对屏幕三维场景画面捕获功能。说明如下:
- 默认情况下,按下键盘c键(小写),则捕获当前帧画面并以文件名screen_shot.jpg保存到程序所在目录。
- 默认情况下,按下键盘C键(大写),则持续捕获所有帧画面并以文件名screen_shot_N_M.jpg保存到程序所在目录,其中N >=0, M >=0,且N,M都是整数,以1递增。
osgViewer::ScreenCaptureHandler类提供了如下函数设置捕获当前帧或所有帧的键盘按键:
void setKeyEventTakeScreenShot(int key); // 设置捕获当前帧的键的虚拟键码
void setKeyEventToggleContinuousCapture(int key) // 设置捕获所有帧的键的虚拟键码
这样就可以将默认的c或C键更改为你自己想要的键。如下代码为将捕获当前帧画面、捕获所有帧画面的键改为数字0键,数字1键:
osgViewer::ScreenCaptureHandler sch;
sch.setKeyEventTakeScreenShot(osgGA::GUIEventAdapter::KEY_0);
sch.setKeyEventTakeScreenShot(osgGA::GUIEventAdapter::KEY_1);
如下代码为视景器对象添加屏幕画面捕获事件处理器:
osgViewer::Viewer viewer;
viewer.addEventHandler(new osgViewer::ScreenCaptureHandler);
3. osgViewer::LODScaleHandler
该事件处理器为细分节点缩放处理器,实现相机对osg::LOD节点和裁剪访问器的支持。功能说明如下:
- 默认情况下,按下键盘*键,则在上一次细分节点缩放比上扩大1.1倍。
- 默认情况下,按下键盘/键,则在上一次细分节点缩放比上缩小1.1倍。
osgViewer::LODScaleHandler类提供了如下函数设置增加或减小缩放比按键设置:
void setKeyEventIncreaseLODScale(int key);
void setKeyEventDecreaseLODScale(int key);
这样就可以将默认的*、/ 键更改为你自己想要的键。如下代码为设置增加或减小缩放比按键改为数字2键,数字3键:
osgViewer::LODScaleHandler lsh;
lsh.setKeyEventIncreaseLODScale(osgGA::GUIEventAdapter::KEY_2);
lsh.setKeyEventDecreaseLODScale(osgGA::GUIEventAdapter::KEY_3);
如下代码为视景器对象添加细分节点缩放处理器:
osgViewer viewer;
viewer.addEventHandler(new osgViewer::LODScaleHandler);
4. osgViewer::HelpHandler
该事件处理器为帮助处理器,实现帮助提示说明。功能说明如下:
- 默认情况下,按下小写h键,则弹出帮助提示;再按一次小写h键,关闭帮助提示,如此反复。
如下为弹出帮助提示界面:
osgViewer::HelpHandler类提供了如下函数设置帮助弹出按键设置:
void setKeyEventTogglesOnScreenHelp(int key)
如下代码为设置帮助弹出为数字5键:
osgViewer::HelpHandler hh;
hh.setKeyEventTogglesOnScreenHelp(osgGA::GUIEventAdapter::KEY_5);
如下代码为视景器对象添加帮助事件处理器:
osgViewer viewer;
auto pHH = new osgViewer::HelpHandler();
viewer.addEventHandler(pHH);
5. osgViewer::ThreadingHandler
该处理器为线程处理器,说明如下:
- 默认情况下,反复按下键盘小写m键且两次之间按键相隔1秒以上时,则三维渲染线程模式在如下线程模式枚举之间切换:
enum ThreadingModel
{
SingleThreaded,
CullDrawThreadPerContext,
ThreadPerContext = CullDrawThreadPerContext,
DrawThreadPerContext,
CullThreadPerCameraDrawThreadPerContext,
ThreadPerCamera = CullThreadPerCameraDrawThreadPerContext,
AutomaticSelection
};
- 默认按下e键,则选择结束时是在交换Buffer之前还是在交换Buffer之后之间切换。
可以通过如下代码来改变按键设置:
void setKeyEventChangeThreadingModel(int key);
void setChangeThreadingModel(bool flag);
如下代码为视景器设置线程事件处理器:
osgViewer viewer;
auto pTH = new osgViewer::ThreadingHandler();
viewer.addEventHandler(pTH);