7、osg中响应键盘鼠标事件以及鼠标和键盘编码表
来源:互联网 发布:steam数据扫号 编辑:程序博客网 时间:2024/05/20 05:25
1、首先定义一个类,该类继承与osgGA::GUIEventHandler,在此类中存在一个handle函数,所有的事件都在此函数中进行处理,如下类的代码:
//声明类UseEventHandler,由于它是从osgGA::GUIEventHandler派生而来,所以它拥有处理事件的能力,其中这种能力体现在一个虚函数handle上。//一切的处理都在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()==0xFF51){//首先获得场景中的数据,然后在获得Group,然后在获得Group的子节点,最后设置显示模式viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(1);//按向左的方向键viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(0);}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;}};2、写完了类,然后就是在场景中通过viewer.addEventHandler(new UseEventHandler());为场景添加定义好的事件类,如下代码所示:
//将UseEventHandler加入到viewer事件中,在UseEventHandler会有一个handle函数,此函数有两个参数,第一个参数是捕捉事件的,比如鼠标单击,双击,键盘事件等等//第二个参数则是viewer的祖父GUIActionAdapter,可以通过强制转换来获得viewer对象,这样就可以在事件中控制场景中的物体模型了viewer.addEventHandler(new UseEventHandler());
3、完整的代码如下:
#include "stdafx.h"#include <osgDB/ReadFile>#include <osgViewer/Viewer>#include <osg/Node>//声明类UseEventHandler,由于它是从osgGA::GUIEventHandler派生而来,所以它拥有处理事件的能力,其中这种能力体现在一个虚函数handle上。//一切的处理都在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()==0xFF51){//首先获得场景中的数据,然后在获得Group,然后在获得Group的子节点,最后设置显示模式viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(1);//按向左的方向键viewer->getSceneData()->asGroup()->getChild(1)->setNodeMask(0);}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;}};int _tmain(int argc, _TCHAR* argv[]){osgViewer::Viewer viewer;osg::ref_ptr<osg::Group> root=new osg::Group();root->addChild(osgDB::readNodeFile("avatar.osg"));root->addChild(osgDB::readNodeFile("glider.osg"));viewer.setSceneData(root.get());//将UseEventHandler加入到viewer事件中,在UseEventHandler会有一个handle函数,此函数有两个参数,第一个参数是捕捉事件的,比如鼠标单击,双击,键盘事件等等//第二个参数则是viewer的祖父GUIActionAdapter,可以通过强制转换来获得viewer对象,这样就可以在事件中控制场景中的物体模型了viewer.addEventHandler(new UseEventHandler());viewer.realize();return viewer.run();}
4、ea.getEventType()可获取的类型包括以下内容:
5、osg中支持的键盘编码值列表如下:
0 0
- 7、osg中响应键盘鼠标事件以及鼠标和键盘编码表
- javascript 中响应鼠标和键盘事件
- vc中响应键盘和鼠标事件 .
- FLEX actionscript响应鼠标和键盘事件
- vc++如何响应键盘和鼠标事件
- vc中如何响应键盘和鼠标事件
- vc中如何响应键盘和鼠标事件
- vc中如何响应键盘和鼠标事件
- vc中如何响应键盘和鼠标事件
- vc中如何响应键盘和鼠标事件
- vc中如何响应键盘和鼠标事件
- OSG学习:响应键盘鼠标示例
- 【mfc】鼠标、键盘响应事件
- 键盘和鼠标事件
- 键盘事件和鼠标事件
- java中鼠标和键盘事件
- Selenium WebDriver 中鼠标和键盘事件
- 自学QT之QML实现响应鼠标和键盘事件
- 每日一篇:关于斐波拉契数列的应用
- mfc完整的自动填表实例
- Hadoop 编程初步认识
- ios第一课 关于类的声明和实现
- postgresQL备份数据库shell
- 7、osg中响应键盘鼠标事件以及鼠标和键盘编码表
- Flume日志采集系统的安装和部署
- poj1611 The Suspects
- C++Primer学习:模板特例化
- 【docker】 windows 7 dockertoolbox 1.9 安装
- 无缝滚动原理与具体实现
- ostringstream的用法
- 查找最大元素
- mfc 直接操作ie浏览器自动填写表单实例