第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人机交互

OSG人机交互

初识osg

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

OSG简介与最简单的实例

 OSG简介OpenSceneGraph(简称OSG)使用OpenGL技术开发,是一套基于C++平台的应用程序接口(API)。OpenGL技术为图形元素(多边形、线、点等)和状态(光照、材质、阴影等)...

3.osg中的CallBack回调、NodeVisitor与鼠标键盘的交互

一、CallBack回调: 规定在某事件发生时启动一个函数,这个函数能够执行相应的操作。一般使用的回调为更新回调,需创建osg::MatrixTransform类对象,调用它的setUpdateCa...

osgViewer::Viewer详解

osgViewer::Viewer详解 l         构造函数Viewer::Viewer(osg::ArgumentParser& arguments)可以做一些初始化工作,比如当读取参数--...

OSG中读取osg文件到geode中

通常读取OSG文件的都是靠readNodeFile()函数,这将返回一个ref_ptr类型的指针。但是我想使用geode类型的getDrawable()函数获取节点中的集合体三角面顶点数据,需要将re...

nvidia显卡设置导致osg显示模糊不全问题

osg3.2.1正常编译,其中freetype也正常编译通过,但是加载模型,按S键,显示状态时,却发现了问题,一是帧率等内容显示不全,另一是字体模糊。如图所示。...

添加自定义事件以及对osg事件队列的简单理解

首先osg在其内部通过osgGA::EventQueue类维护了一个事件队列,队列中的每一个事件都是一个osgGA::GUIEventAdapter对象(这个对象是用来存放所系统捕捉到的事件),在仿真...

OSG获取鼠标点选事件的位置

OSG点选操作的思路是从osgGA::GUIEventHandler继承,并重新实现虚函数virtual bool handle(const osgGA::GUIEventAdapter& ea, o...
  • chlk118
  • chlk118
  • 2015年07月08日 22:13
  • 4461

第4课时《osg矩阵变换(上)》

1.osg空间方向           OSG坐标轴如上图图所示,x轴表示屏幕水平方向,y轴表示和屏幕垂直方向即屏幕里面方向,z轴表示屏幕垂直方向,每个箭头指向表示正方向 。而OpenGL的坐...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第7课时《osg交互》
举报原因:
原因补充:

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