//处理键盘事件 #include"stdafx.h" #include<osg/Switch> #include<osgDB/ReadFile> #include<osgGA/GUIEventHandler> #include<osgViewer/Viewer> class KeyboardHandler :public osgGA::GUIEventHandler//人机交互事件处理器 { public: //重构父类GUIEventHandler.handle,事件处理函数,自定义交互操作, //参数1:当前传入此处理器的事件,只可以被获取,不能被修改 //参数2:反馈动作,动作适配器,可以获取也可以修改的参数,大部分时候这个传入值表示当前所用的视图对象View,可以用它来获取 // 或控制视景器的状态变化。如:osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa); //参数3:对象指针obj,保存该处理器的对象,可能是当前事件回调所在的Node节点指针,也可能是Drawable指针 //参数4:传递该事件的访问器(EventVisitor),nv通常为当前时间访问器指针。 virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv) { osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa); if (!viewer)return false; switch (ea.getEventType())//判断事件,做出响应 { case osgGA::GUIEventAdapter::KEYDOWN://ea.getEventType()获取到的如果是键盘事件 if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Space)//空格,控制鼠标到屏幕中间 { int width = ea.getWindowWidth(); int heigth = ea.getWindowHeight(); viewer->requestWarpPointer(width*0.5, heigth*0.5); } else { osg::Switch* root = dynamic_cast<osg::Switch*>(viewer->getSceneData()); if (!root) return false; //按下1为第一个不着火的飞机,2,着火飞机,3,牛 if (ea.getKey() == '1') { root->setValue(0, true); root->setValue(1, false); root->setValue(2, false); } else if (ea.getKey() == '2') { root->setValue(0, false); root->setValue(1, true); root->setValue(2, false); } else if (ea.getKey() == '3') { root->setValue(0, false); root->setValue(1, false); root->setValue(2, true); } return true; } break; default:break; } return false; } }; int main(int argc, char** argv) { osg::ref_ptr<osg::Switch> root = new osg::Switch; root->addChild(osgDB::readNodeFile("cessna.osg"), true);//为开关节点添加3个子节点。第一个设置为可见,true。 root->addChild(osgDB::readNodeFile("cessnafire.osg"), false); root->addChild(osgDB::readNodeFile("cow.osg"), false); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); viewer.addEventHandler(new KeyboardHandler);//追加用户自定义的交互事件处理器,这里是键盘响应事件。这时就开始接受事件了。 return viewer.run(); }
代码思路如下图:主函数中建立一个root根节点,该节点是开关节点,具有开关属性,设置了三个子节点,给viewer添加了键盘事件处理器,可以对键盘事件进行响应。
键盘人机交互事件处理器,获取键盘事件,并对需要被操作的,视图对象,root开关节点对象做出响应。
b
时间: 2024-10-07 08:43:43