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());

}

原文地址:https://www.cnblogs.com/easyfrog/p/2763889.html