目录
1. 前言
2. osgViewer::ScreenCaptureHandler
3. osgViewer::LODScaleHandler
4. osgViewer::HelpHandler
5. osgViewer::ThreadingHandler
osg为视景器的使用和调试提供了丰富的辅助组件,它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::ScreenCaptureHandler、osgViewer::LODScaleHandler、osgViewer::HelpHandler 、osgViewer::ThreadingHandler类就是其中的4个经常用到的辅助组件。其它组件参见如下博文:
该事件处理提供对屏幕三维场景画面捕获功能。说明如下:
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);
该事件处理器为细分节点缩放处理器,实现相机对osg::LOD节点和裁剪访问器的支持。功能说明如下:
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);
该事件处理器为帮助处理器,实现帮助提示说明。功能说明如下:
如下为弹出帮助提示界面:
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);
该处理器为线程处理器,说明如下:
enum ThreadingModel
{
SingleThreaded,
CullDrawThreadPerContext,
ThreadPerContext = CullDrawThreadPerContext,
DrawThreadPerContext,
CullThreadPerCameraDrawThreadPerContext,
ThreadPerCamera = CullThreadPerCameraDrawThreadPerContext,
AutomaticSelection
};
可以通过如下代码来改变按键设置:
void setKeyEventChangeThreadingModel(int key);
void setChangeThreadingModel(bool flag);
如下代码为视景器设置线程事件处理器:
osgViewer viewer;
auto pTH = new osgViewer::ThreadingHandler();
viewer.addEventHandler(pTH);