第7课时《osg交互》

原创 2016年05月31日 16:48:15

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

        


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

OSG 自带事件响应

osgGA::StateSetManipulator:该事件响应类的功能是对渲染状态进行控制,openGL的渲染管线使用了状态机的机制,此事件响应类对状态进行控制体现在当用户按w键时,可在体线点三种模...

OSG控制帧率的方法

osg::ref_ptr viewer = new osgViewer::Viewer;  osg::ref_ptr node;      //申请一个定时器  osg::Timer* tim...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

osg_beginer_guider_Chapter 5: Managing Scene Graph

Chapter 5: Managing Scene Graph 场景图是表示图形与状态对象的空间布局的节点的层次图结构图。他封装了最底层的图像基元与状态组合,可以通过底层的图像API创建可视化事...

初识osg

OSG的诞生 在 1997 年时,Don Burns 由于喜欢滑翔机运动且对计算机图形学非常熟悉,在 LINUX 上写了一个控制滑翔 机的小引擎,这便是 OSG 的最初雏形。 后来在 1998 年,D...

Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示

细心的朋友肯定已经发现Kinect上长了三只眼睛,其中一个是彩色摄像头,另外两个深度摄像头,一个负责发射红外光,一个负责接收,这样,我们便能通过Kinect得到一幅彩色图像和一幅深度图像。如果大家对K...

Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取

Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取 zouxy09@qq.com http://blog.csdn.net/zouxy09   我的Kinect开发平台是: Wi...

Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示

Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示 zouxy09@qq.com http://blog.csdn.net/zouxy09   我的Kinect开发平台是: W...

生成模型与判别模型

生成模型与判别模型 zouxy09@qq.com http://blog.csdn.net/zouxy09        一直在看论文的过程中遇到这个问题,折腾了不少时间,然后是下面的一点理解,...

Kinect开发学习笔记之(八)彩色、深度、骨骼和用户抠图结合

Kinect开发学习笔记之(八)彩色、深度、骨骼和用户抠图结合 zouxy09@qq.com http://blog.csdn.net/zouxy09   我的Kinect开发平台是: Wi...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)