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()可获取的类型包括以下内容:

OSG中常用的事件类型
代码 事件类型
NONE 0 无事件。
PUSH 1 鼠标某键按下
RELEASE 2 鼠标某键弹起。
DOUBLECLICK 4 鼠标某键双击。
DRAG 8 鼠标某键拖动。
MOVE 16 鼠标移动。
KEYDOWN 32 键盘上某键按下。
KEYUP 64 键盘上某键弹起。
FRAME 128 应该是鼠标每帧。没用过。
RESIZE 256 窗口大小改变时会有的事件。
SCROLL 512 鼠标轮滚动。
PEN_PRESSURE 1024 手写板的某事件?
PEN_PROXIMITY_ENTER 2048 手写板的某事件?
PEN_PROXIMITY_LEAVE 4096 手写板的某事件?
CLOSE_WINDOWS 8192 关闭窗口。
QUIT_APPLICATION 16384 退出程序。
USER 32768 用户定义。

5、osg中支持的键盘编码值列表如下:

OSG中支持的键盘码值
KEY_Space 0x20 KEY_KP_Tab 0xFF89                        
KEY_BackSpace 0xFF08 KEY_KP_Enter 0xFF8D
KEY_Tab 0xFF09 KEY_KP_F1 0xFF91
KEY_Linefeed 0xFF0A KEY_KP_F2 0xFF92
KEY_Clear 0xFF0B KEY_KP_F3 0xFF93
KEY_Return 0xFF0D KEY_KP_F4 0xFF94
KEY_Pause 0xFF13 KEY_KP_Home 0xFF95
KEY_Scroll_Lock 0xFF14 KEY_KP_Left 0xFF96
KEY_Sys_Req 0xFF15 KEY_KP_Up 0xFF97
KEY_Escape 0xFF1B KEY_KP_Right 0xFF98
KEY_Delete 0xFFFF KEY_KP_Down 0xFF99
KEY_Home 0xFF50 KEY_KP_Prior 0xFF9A
KEY_Left 0xFF51 KEY_KP_Page_Up 0xFF9A
KEY_Up 0xFF52 KEY_KP_Next 0xFF9B
KEY_Right 0xFF53 KEY_KP_Page_Down 0xFF9B
KEY_Down 0xFF54 KEY_KP_End 0xFF9C
KEY_Prior 0xFF55 KEY_KP_Begin 0xFF9D
KEY_Page_Up 0xFF55 KEY_KP_Insert 0xFF9E
KEY_Next 0xFF56 KEY_KP_Delete 0xFF9F
KEY_Page_Down 0xFF56 KEY_KP_Equal 0xFFBD
KEY_End 0xFF57 KEY_KP_Multiply 0xFFAA
KEY_Begin 0xFF58 KEY_KP_Add 0xFFAB
KEY_Select 0xFF60 KEY_KP_Separator 0xFFAC
KEY_Print 0xFF61 KEY_KP_Subtract 0xFFAD
KEY_Execute 0xFF62 KEY_KP_Decimal 0xFFAE
KEY_Insert 0xFF63 KEY_KP_Divide 0xFFAF
KEY_Undo 0xFF65    
KEY_Redo 0xFF66 KEY_KP_0 0xFFB0
KEY_Menu 0xFF67 KEY_KP_1 0xFFB1
KEY_Find 0xFF68 KEY_KP_2 0xFFB2
KEY_Cancel 0xFF69 KEY_KP_3 0xFFB3
KEY_Help 0xFF6A KEY_KP_4 0xFFB4
KEY_Break 0xFF6B KEY_KP_5 0xFFB5
KEY_Mode_switch 0xFF7E KEY_KP_6 0xFFB6
KEY_Script_switch 0xFF7E KEY_KP_7 0xFFB7
KEY_Num_Lock 0xFF7F KEY_KP_8 0xFFB8
KEY_KP_Space 0xFF80 KEY_KP_9 0xFFB9
KEY_F1 0xFFBE KEY_F24 0xFFD5
KEY_F2 0xFFBF KEY_F25 0xFFD6
KEY_F3 0xFFC0 KEY_F26 0xFFD7
KEY_F4 0xFFC1 KEY_F27 0xFFD8
KEY_F5 0xFFC2 KEY_F28 0xFFD9
KEY_F6 0xFFC3 KEY_F29 0xFFDA
KEY_F7 0xFFC4 KEY_F30 0xFFDB
KEY_F8 0xFFC5 KEY_F31 0xFFDC
KEY_F9 0xFFC6 KEY_F32 0xFFDD
KEY_F10 0xFFC7 KEY_F33 0xFFDE
KEY_F11 0xFFC8 KEY_F34 0xFFDF
KEY_F12 0xFFC9 KEY_F35 0xFFE0
KEY_F13 0xFFCA KEY_Shift_L 0xFFE1
KEY_F14 0xFFCB KEY_Shift_R 0xFFE2
KEY_F15 0xFFCC KEY_Control_L 0xFFE3
KEY_F16 0xFFCD KEY_Control_R 0xFFE4
KEY_F17 0xFFCE KEY_Caps_Lock 0xFFE5
KEY_F18 0xFFCF KEY_Shift_Lock 0xFFE6
KEY_F19 0xFFD0    
KEY_F20 0xFFD1 KEY_Meta_L 0xFFE7
KEY_F21 0xFFD2 KEY_Meta_R 0xFFE8
KEY_F22 0xFFD3 KEY_Alt_L 0xFFE9
KEY_F23 0xFFD4 KEY_Alt_R 0xFFEA
KEY_Super_L 0xFFEB KEY_Hyper_L 0xFFED
KEY_Super_R 0xFFEC KEY_Hyper_R 0xFFEE
 

7、osg中响应键盘鼠标事件以及鼠标和键盘编码表相关推荐

  1. OSG中响应键盘事件

    OSG中键盘的映射在中文下,小写存在问题,大写是正常的,下面以大写为例: 1 继承GUIEventAdapter类: 2 实现handle接口: 如上图所示,在handle中 判断事件,如果是keyd ...

  2. WPF经典教程--键盘输入事件, 鼠标输入事件, 焦点处理

    一.键盘和键盘事件 WPF提供了一个基本的键盘类(System.Input.Keyboard类),该类提供键盘相关的事件,方法和属性,以提供有关键盘状态的信息.键盘事件也由诸如UIElement XA ...

  3. 浏览器滑块、鼠标事件、鼠标滑轮、键盘事件详细说明

    鼠标滑轮 必须是在 mousewheel 事件中 注册事件   window.addEventListener("mousewheel ",function(){}); event ...

  4. html中的鼠标事件怎么写,html5中的鼠标事件以及鼠标事件属性

    鼠标事件 先列出html5中鼠标常见的一系列事件: 事件名称 描述 onclick 当单击鼠标时运行脚本 ondblclick 当双击鼠标时运行脚本 ondrag 当拖动元素时运行脚本 ondrage ...

  5. JavaScript学习(十八)--鼠标事件(鼠标点击松开移动效果)

    目录 鼠标的单击事件 鼠标的松开或按下事件 鼠标的移入/移出事件 鼠标移动事件 鼠标单击事件和鼠标双击事件 鼠标拖拽事件 鼠标和键盘事件是在页面操作中使用最频繁的操作,可以利用鼠标事件在页面中实现鼠标 ...

  6. PySide2从零开始的python界面设计5---搞定鼠标事件与鼠标样式!

    捕获鼠标事件 所有widget类都含有四个鼠标事件,分别代表着双击,移动,单击,释放: def mouseDoubleClickEvent(self,event): # mouseMoveEvent ...

  7. WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件

    在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件. 例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开. 在这个过程中 ...

  8. 鼠标事件(鼠标的各种处理事件)

    QMouseEvent 类用来表示一个鼠标事件,在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件.利用 QMouseEvent 类可以获知鼠标是那个按键按下了,鼠标指针的当前位置等信息.通常重 ...

  9. Qt:鼠标事件(鼠标移动事件、鼠标按下事件、鼠标释放事件、进入窗口区域、离开窗口区域)

    鼠标事件,本质是重写重写QWidgt中虚函数. 以下程序是获取鼠标坐标: mylabel.h #ifndef MYLABEL_H #define MYLABEL_H #include <QLab ...

最新文章

  1. Android -- 利用Broadcast开启Service
  2. MDK5.29,5.30,5.31,5.32,5.33和各种pack软件包镜像下载
  3. 全球及中国梦幻体育软件和平台行业十四五规模展望及应用价值分析报告2021-2027年
  4. java计算面积的方法_JAVA多态计算面积main函数调用方法
  5. 2_RabbitMQ工作模式_Work queues_Publish/Subscribe_Routing_Topics_HeaderRpc
  6. sass穿透 scoped 的情况下 去修改ui组件的样式
  7. Windows2008管理---第12章 终端服务器
  8. python3: failed with error code 1 in /tmp/pip-build-qp5puacl/Pillow/
  9. Atitit common codec algo 常见编码算法 目录 1. 分类 1 2. BinaryEncoders 2 2.1. Base64 bin2hex etc 2 2.2. bin2h
  10. Arduino米思齐Mixly---人体声控灯
  11. 分享一个在线Word编辑的jQuery插件
  12. php上传文件时报错:only variables should be passed by reference
  13. 计算机无法调节亮度,win10屏幕亮度没反应如何处理_win10电脑屏幕亮度调不了怎么办...
  14. NiFi 的使用心得
  15. ubuntu16.04不能访问新加卷
  16. 勉强算是面经——3.中软国际
  17. LattePanda 安装ubuntu 20.04 和 openvino
  18. 折叠屏手机会取代平板么
  19. Unity官方手册加载太慢
  20. 计算机二级ppt云计算,2021年全国计算机等级考试二级officeppt演示文稿题目.docx

热门文章

  1. html自动轮播计时器不准,自己做的jQuery轮播图,大家帮忙看一下,能自动轮播,定时器,点击按钮不起用...
  2. SAP PP CO02 生产工单修改日志增强
  3. MySQL高可用架构MHA
  4. 怎么把线稿提取出来_PS怎么扣抠线稿?Adobe Photoshop CS6如何提取清晰的线稿
  5. xmind 文件 打开后会在当前目录生成 configuration,p2和workspace目录,artifacts.xml文件 解决
  6. 三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)
  7. ISIS-P2P网络的LSDB更新
  8. 【Maven】maven下载网址进不去处理方法
  9. 抖音落地页一键复制微信号跳转微信的方法
  10. Linux:查看主机显卡