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;
}
};
禁止转载