OSG 学习随笔(一) : osgViewer::Viewer 的事件处理
搞 OSG 搞VR 搞虚拟仿真, 不是看影片呀. 是需要交互的.怎么交互?? 就是让 osgViewer::Viewer 响应下鼠标与键盘的事件嘛.. 比如:按下了鼠标的左键呀.. 按下了键盘上的 WSAD呀.. 什么什么的..
好的. 那么怎么让 Viewer 知道你做的事件呢?? 怎么办呢?? 可喜的是. Viewer 有一个叫 addEventHandler(osgGA::GUIEventHandler handle)的方法.. 看字面的意思.就知道他是为 Viewer 来增加事件处理方法的.
BUT!! 这个方法虽好, 但您还不能直接拿来使用..... Becuse .你需要告诉他. 你要把一个怎么样的"事件处理类" 加给Viewer呢?? 这里需要一个 osgGA::GUIEventHandler 类的子类. 因为这个家伙是个纯虚类.不能实例话. 所以你要自己写一个继承于它的子类. 并重写 他的 void handle(osgGA::GUIEventAdapter ea ,osgGA::GUIActionAdapter aa) . 方法. 把你具体的操作 写在里面. 第一个参数里面包括了你当时的事件类型, 比如是 KEYDOWN 呀?? 还是鼠标按下呀PUSH.. 并包括了你按下的是哪个键.等等 非常有用.
第二个参数是,事件处理结果的接收者. 一般就是 Viewer ,你需要这样得到这个Viewer :
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
当然 你也可以把Viewer 直接做为你写的这个了类的构造函数的参数传进来. 这样更加直观.
例 你自己写的事件处理类,它必须继承自 osgGA::GUIEventHandler
class MyHandle : public osgGA::GUIEventHandler
{
public:
void handle(osgGA::GUIEventAdapter ea,osgGA::GUIActionAdapter aa )
{
switch(ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN :
if(ea.getKey() == osgGA::GUIEventAdapter::KEY_W){
// Do something
}
break;
case osgGA::GUIEventAdapter::PUSH:
break;
}
}
};
int main()
{
ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
// add eventHandler
viewer.addEventHandler(new MyHandler());
}