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中常用的事件类型
代码 值 事件类型
NONE 0 无事件
PUSH 1 鼠标某键按下
RELEASE 2 鼠标某键弹。
DOUBLECLICK 4 鼠标某键双击
一般视为1代表左键,2代表中键,4代表右键。枚举类型MouseButtonMask
DRAG 8 鼠标某键拖动
MOVE 16 鼠标移动
KEYDOWN 32 键盘上某键按下
KEYUP 64 键盘上某键弹起
FRAME 128 图像帧(与时间有关)
RESIZE 256 窗口大小改变时会有的事件
SCROLL 512 鼠标轮滚动
PEN_PRESSURE 1024 手写板的某事件
PEN_PROXIMITY_ENTER 2048 手写板的某事件
PEN_ORIENTATION 4096 手写板的某事件
PEN_PROXIMITY_LEAVE 8192 手写板的某事件
CLOSE_WINDOWS 16384 关闭窗口
QUIT_APPLICATION 32768 退出程序
USER 65536 用户定义
按键值就是对应的ASCLL码。