osg 中处理键盘鼠标外部设备

继承 public::osgGA::GUIEventHandler 实现 handle函数即可

class UseEventHandler :public::osgGA::GUIEventHandler
{
public:
    //handle函数,其中有两个极其重要的参数,  
    //一个是const osgGA::GUIEventAdapter,注意有不少人在写时少写了个const结果就不灵了,  
    //因为是虚函数,参数必须与父类中虚函数相应一致。该参数是用来识别各种事件类型的参数。  
    //第二个参数也很重要:osgGA::GUIActionAdapter,它是控制显示的参数,其实最重要的是它是Viewer的祖父类,由它可以得到viewer,在操作中有体现。  
    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        
        //将aa强制转换为viewer对象  
        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
        if (!viewer)//如果转换失败则直接退出  
        {
            return false;
        }
        switch (ea.getEventType())//获取事件的类型,是键盘上的事件,还是鼠标上的事件以及鼠标单击,右击,双击等等。  
        {
        case osgGA::GUIEventAdapter::KEYDOWN://键盘响应事件  

          
            if (ea.getKey() == 'q' || ea.getKey() == 'Q' || ea.getKey() == osgGA::GUIEventAdapter::KEY_Page_Up)//高度向上
            { 

            }
            if (ea.getKey() == 'e' || ea.getKey() == 'E' || ea.getKey() == osgGA::GUIEventAdapter::KEY_Page_Down)//高度向下
            { 
            }
            if (ea.getKey() == 'w' || ea.getKey() == 'W' || ea.getKey() == osgGA::GUIEventAdapter::KEY_Up)//俯仰俯冲向上
            { 

            }
            if (ea.getKey() == 's' || ea.getKey() == 'S' || ea.getKey() == osgGA::GUIEventAdapter::KEY_Down)//俯仰俯冲向下
            { 
            }
            if (ea.getKey() == 'a' || ea.getKey() == 'A' || ea.getKey() == osgGA::GUIEventAdapter::KEY_Left)//向左横滚
            { 
            }
            if (ea.getKey() == 'd' || ea.getKey() == 'D' || ea.getKey() == osgGA::GUIEventAdapter::KEY_Right)//向右横滚
            { 
            }
            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;
    }
};
posted @ 2022-03-23 14:50  fishpro  阅读(264)  评论(0编辑  收藏  举报