OSG的消息机制包括好多个头文件预定义及多个类。
首先,消息接收相关的类当属osgGA::GUIEventHandler和osgGA::GUIEventAdapter这两个类了。前者处理OSG程序与用户交互,处理事件,事件全靠handle这个函数。此函数的定义:
重载1: virtual bool handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv);
重载2: virtual bool handle(const GUIEventAdapter& ea,GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*) { return handle(ea,aa); }
重载3: virtual bool handle(const GUIEventAdapter&,GUIActionAdapter&) { return false; }
const GUIEventAdapter&ea用来控制事件类型,GUIActionAdapter用来获得viewer和视口以及上下文,还可以传入一个额外的类object,还可以传入一个Nodevisitor,一般只用前两个参数即可,我们多数情况下运用的也是这两个参数,ea主要用来控制所得到的事件类型,aa用于控制场景viewer以及上下文,窗口等等,可以自定义一些场景变换。
注意,我们大多数情况下用的是重载函数3,股沟进行事件类型及信息获取和控制场景viewer以及上下文,窗口等。
const GUIEventAdapter中有一个重要的枚举类型
enum EventType { NONE = 0, PUSH = 1<<0, RELEASE = 1<<1, DOUBLECLICK = 1<<2, DRAG = 1<<3, MOVE = 1<<4, KEYDOWN = 1<<5, KEYUP = 1<<6, FRAME = 1<<7, RESIZE = 1<<8, SCROLL = 1<<9, PEN_PRESSURE = 1<<10, PEN_ORIENTATION = 1<<11, PEN_PROXIMITY_ENTER = 1<<12, PEN_PROXIMITY_LEAVE = 1<<13, CLOSE_WINDOW = 1<<14, QUIT_APPLICATION = 1<<15, USER = 1<<16 };
具体事件对应为:
OSG中常用的事件类型代码值事件类型NONE0无事件PUSH1鼠标某键按下RELEASE2鼠标某键弹。DOUBLECLICK4鼠标某键双击一般视为1代表左键,2代表中键,4代表右键。枚举类型MouseButtonMaskDRAG8鼠标某键拖动MOVE16鼠标移动KEYDOWN32键盘上某键按下KEYUP64键盘上某键弹起FRAME128图像帧(与时间有关)RESIZE256窗口大小改变时会有的事件SCROLL512鼠标轮滚动PEN_PRESSURE 1024手写板的某事件PEN_PROXIMITY_ENTER2048手写板的某事件PEN_ORIENTATION 4096手写板的某事件PEN_PROXIMITY_LEAVE8192手写板的某事件CLOSE_WINDOWS 16384关闭窗口QUIT_APPLICATION 32768退出程序USER 65536 用户定义
按键值就是对应的ASCLL码。