OpenSceneGraph中的osgGA.GUIEventHandler是GUI事件处理程序的基类,它负责处理窗口事件,比如鼠标按键操作、键盘操作、鼠标移动等等。OpenGL的应用通常需要响应用户的交互行为,GUIEventHandler提供了一种处理用户交互事件的机制。
osgGA.GUIEventHandler继承自osgGA.GUIActionAdapter类。
osgGA.GUIEventHandler是一个抽象类,不能直接使用它。相应用户事件的代码应该继承osgGA.GUIEventHandler并实现自己的事件处理方法。
class MyEventHandler : public osgGA::GUIEventHandler
{
public:
MyEventHandler() {}
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN)
{
// 处理键盘按键事件
return true; // 告诉GUIActionAdapter已经处理了该事件
}
return false; // 没有处理该事件
}
};
在osgViewer::Viewer类中设置GUIEventHandler:
viewer->addEventHandler(new MyEventHandler);
除了OpenSceneGraph自带的事件类型之外,用户还可以定义自己的事件类型并处理。
#include <osgGA/GUIEventAdapter>
#include <osgManipulator/Dragger>
const unsigned int MY_CUSTOM_EVENT_TYPE = osgGA::GUIEventAdapter::USER;
class MyCustomEventHandler : public osgGA::GUIEventHandler
{
public:
MyCustomEventHandler(MyCustomDragger* dragger) : _dragger(dragger) {}
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
if (ea.getEventType() == MY_CUSTOM_EVENT_TYPE)
{
_dragger->handle(ea, aa);
return true;
}
else
{
return false;
}
}
private:
MyCustomDragger* _dragger;
};
在GUIEventAdapter中设置自定义事件:
osg::ref_ptr<osgGA::GUIEventAdapter> ea = new osgGA::GUIEventAdapter;
ea->setEventType(MY_CUSTOM_EVENT_TYPE);
viewer->getEventQueue()->newEvent(ea);
osgGA.GUIEventHandler提供了事件处理的方式,它们被定义为GUIEventAdapter中的事件类型:
osgGA.GUIEventHandler API Documentation. https://www.openscenegraph.org/documentation/OpenSceneGraphReferenceDocs/a00108.html。