会飞的鸵鸟

只要你有梦想,距离就不远。

第7课时《osg交互》

  1.交互

     所谓交互,一般指的的我们的键盘、鼠标等响应。OSG针对场景的操作封装了一系列的用于交互的事件处理器。

     在osgViewer中存在,addEventHandler方法,用于接收和处理事件。

      viewer->addEventHandler(new osgViewer::StatsHandler);//添加事件的实例,用于显示帧率等状态信息。

    2.自定义事件

      如果想要自己定义处理器,需要了解处理器的格式,一般处理器继承类osgGA::GUIEventHandler.

      class  A :public osgGA::GUIEventHandler,并重写相关的方法。

      viewer->addEventHandler(new A);来使用自定的事件处理类。

     整个过程如下图:

     

   

     实例:改写HelpHandler处理类。

     参照OSG中osgViewer中的HelpHandler的源文件,我们自己定义重写帮助处理类:PintInfo。

  class PrintInfo : public osgGA::GUIEvemtHandler //模拟一个事件类,响应h
    {
     public:
      bool HelpHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa){
            return false;
      }
      void HelpHandler::getUsage(osg::ApplicationUsage& usage) const
        {
              usage.addKeyboardMouseBinding(‘h’,"Onscreen help.");
       }
     };
     viewer->addEventHandlers(new PrintInfo); //应用事件处理类
       3. 经典实例

        响应键盘鼠标,改实例功能是鼠标右键单击时牛和飞机隐藏,鼠标左键双击是牛和飞机都显示,按住键盘上的LEFT键,显示牛,按RIGHT键显示飞机。

        详细代码如下:

        

class UseEventHandler : public osgGA::GUIEventHandler
{
public:
    ///
    /// \brief 事件处理的关键函数
    /// \param ea 用于识别事件类型
    /// \param aa 控制显示
    /// \return bool
    ///
    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        //获取要响应的view
        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
        if (!viewer) return false;
        //开始判断事件类型
        switch(ea.getEventType())
        {
        case osgGA::GUIEventAdapter::KEYDOWN:
        {
            if (ea.getKey()== 0xFF51)
            {
                viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
                viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
            }
            if (ea.getKey()== 0xFF53)
            {
                viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(0) ;
                viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(1) ;
            }
        }
            break;
        case osgGA::GUIEventAdapter ::PUSH:
            if(ea.getButton () == 4)
            {
                viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(0) ;
                viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
            }
            break;
        case osgGA::GUIEventAdapter::DOUBLECLICK:
            if(ea.getButton() == 1)
            {
                viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
                viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(1) ;
            }
            break;
        default:
            break;
        }
        return false;
    }
    
};

void main()
{
    osgViewer::Viewer viewer;
    osg::ref_ptr<osg::Group> root = new osg::Group() ;
    root ->addChild(osgDB::readNodeFile("cow.osg")) ;
    root ->addChild(osgDB::readNodeFile("glider.osg"));
    viewer.setSceneData(root.get ());
    viewer.addEventHandler(new UseEventHandler) ;
    viewer.realize();
    viewer.run();
}

        


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013207966/article/details/51547124
文章标签: osg Qt 编程 osg
个人分类: QT osg
上一篇第6课时《自定义智能指针》
下一篇QGraphicItem实现中心旋转
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭