第7课时《osg交互》
2016-05-31 16:48
507 查看
1.交互
所谓交互,一般指的的我们的键盘、鼠标等响应。OSG针对场景的操作封装了一系列的用于交互的事件处理器。
在osgViewer中存在,addEventHandler方法,用于接收和处理事件。
viewer->addEventHandler(new osgViewer::StatsHandler);//添加事件的实例,用于显示帧率等状态信息。
2.自定义事件
如果想要自己定义处理器,需要了解处理器的格式,一般处理器继承类osgGA::GUIEventHandler.
class A :public osgGA::GUIEventHandler,并重写相关的方法。
viewer->addEventHandler(new A);来使用自定的事件处理类。
整个过程如下图:
实例:改写HelpHandler处理类。
参照OSG中osgViewer中的HelpHandler的源文件,我们自己定义重写帮助处理类:PintInfo。
class PrintInfo : public osgGA::GUIEvemtHandler //模拟一个事件类,响应h
{
public:
bool HelpHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa){
return false;
}
void HelpHandler::getUsage(osg::ApplicationUsage& usage) const
{
usage.addKeyboardMouseBinding(‘h’,"Onscreen help.");
}
};
响应键盘鼠标,改实例功能是鼠标右键单击时牛和飞机隐藏,鼠标左键双击是牛和飞机都显示,按住键盘上的LEFT键,显示牛,按RIGHT键显示飞机。
详细代码如下:
class UseEventHandler : public osgGA::GUIEventHandler
{
public:
///
/// \brief 事件处理的关键函数
/// \param ea 用于识别事件类型
/// \param aa 控制显示
/// \return bool
///
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
//获取要响应的view
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
if (!viewer) return false;
//开始判断事件类型
switch(ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
{
if (ea.getKey()== 0xFF51)
{
viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
}
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;
}
};
void main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root = new osg::Group() ;
root ->addChild(osgDB::readNodeFile("cow.osg")) ;
root ->addChild(osgDB::readNodeFile("glider.osg"));
viewer.setSceneData(root.get ());
viewer.addEventHandler(new UseEventHandler) ;
viewer.realize();
viewer.run();
}
所谓交互,一般指的的我们的键盘、鼠标等响应。OSG针对场景的操作封装了一系列的用于交互的事件处理器。
在osgViewer中存在,addEventHandler方法,用于接收和处理事件。
viewer->addEventHandler(new osgViewer::StatsHandler);//添加事件的实例,用于显示帧率等状态信息。
2.自定义事件
如果想要自己定义处理器,需要了解处理器的格式,一般处理器继承类osgGA::GUIEventHandler.
class A :public osgGA::GUIEventHandler,并重写相关的方法。
viewer->addEventHandler(new A);来使用自定的事件处理类。
整个过程如下图:
实例:改写HelpHandler处理类。
参照OSG中osgViewer中的HelpHandler的源文件,我们自己定义重写帮助处理类:PintInfo。
class PrintInfo : public osgGA::GUIEvemtHandler //模拟一个事件类,响应h
{
public:
bool HelpHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa){
return false;
}
void HelpHandler::getUsage(osg::ApplicationUsage& usage) const
{
usage.addKeyboardMouseBinding(‘h’,"Onscreen help.");
}
};
viewer->addEventHandlers(new PrintInfo); //应用事件处理类3. 经典实例
响应键盘鼠标,改实例功能是鼠标右键单击时牛和飞机隐藏,鼠标左键双击是牛和飞机都显示,按住键盘上的LEFT键,显示牛,按RIGHT键显示飞机。
详细代码如下:
class UseEventHandler : public osgGA::GUIEventHandler
{
public:
///
/// \brief 事件处理的关键函数
/// \param ea 用于识别事件类型
/// \param aa 控制显示
/// \return bool
///
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
//获取要响应的view
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
if (!viewer) return false;
//开始判断事件类型
switch(ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
{
if (ea.getKey()== 0xFF51)
{
viewer ->getSceneData() ->asGroup() ->getChild(1) ->setNodeMask(0) ;
viewer ->getSceneData() ->asGroup() ->getChild(0) ->setNodeMask(1) ;
}
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;
}
};
void main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root = new osg::Group() ;
root ->addChild(osgDB::readNodeFile("cow.osg")) ;
root ->addChild(osgDB::readNodeFile("glider.osg"));
viewer.setSceneData(root.get ());
viewer.addEventHandler(new UseEventHandler) ;
viewer.realize();
viewer.run();
}
相关文章推荐
- C# readnodefile()不能读取带有文件名为汉字的osg文件解决方法
- qt osg 多点触摸
- 关于 OGRE 与 OSG 的简略比较(转自www.MyException.Cn )
- 基于Windows8.1(64)和vs2013安装OSG的总结
- Qt中GraphicsView/GraphicsScene加载osg时场景瞬移。。。
- osg如何画网格
- OSG学习——配置问题
- OSG嵌入到MFC中报内存泄露
- osgViewer销毁bug
- iOS 下编译 OSG 引擎
- [osg]源码分析:OSG中的智能指针osg::ref_ptr
- OSG中的相关词汇表
- 简单OSG小程序,实现在cmd下osgviewer <filename>小功能
- OSG 添加操作器及功能列表
- OSG 模型添加(含自己画的模型,已有模型),对添加的模型做平移 缩放等。
- error C2039: 'addCameraManipulator' : is not a member of 'osgGA
- 第6课时《自定义智能指针》
- 第3课时《osg模型控制》
- 第5课时《osg矩阵变换(下)》
- 第4课时《osg矩阵变换(上)》