查看: 1133|回复: 5

关于交互事件响应的问题

[复制链接]

该用户从未签到

发表于 2010-6-29 14:20:23 | 显示全部楼层 |阅读模式
  1. class KeyboardHandler : public osgGA::GUIEventHandler
  2. {
  3. public:

  4.         KeyboardHandler() : _x(0.0),_y(0.0),_z(0.0) {}
  5.         ~KeyboardHandler() {}

  6.        

  7.         virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*)
  8.         {
  9.                 osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

  10.                 if (!viewer)
  11.                 {
  12.                         return false;
  13.                 }               

  14.                 switch(ea.getEventType())
  15.                 {
  16.                 case osgGA::GUIEventAdapter::KEYDOWN:

  17.                         if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Space)
  18.                         {
  19.                                 int width = ea.getWindowWidth();
  20.                                 int height = ea.getWindowHeight();
  21.                                 viewer->requestWarpPointer(width*0.5,height*0.5);
  22.                                 std::cout<<"Space Down"<<std::endl;
  23.                         }
  24.                         else
  25.                         {
  26.                                 osg::PositionAttitudeTransform* pat = dynamic_cast<osg::PositionAttitudeTransform*>(viewer->getSceneData());
  27.                                 if (!pat)
  28.                                 {
  29.                                         return false;
  30.                                 }
  31.                                
  32.                                 _x += 0.7;
  33.                                 _z += 0.7;
  34.                                
  35.                                 osg::Vec3d trans(0.0,0.0,0.0);
  36.                                
  37.                                 if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Up )
  38.                                 {                       
  39.                                         trans.set(trans.x(),trans.y(),trans.z()+_z);
  40.                                         pat->setPosition(trans);
  41.                                         //viewer->getCamera()->setViewMatrix(trans);
  42.        
  43.                                         std::cout<<"Up"<<std::endl;
  44.                                 }
  45.                                 else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Down )
  46.                                 {
  47.                                         trans.set(trans.x(),trans.y(),trans.z()-_z);
  48.                                         pat->setPosition(trans);
  49.                                         //viewer->getCamera()->setViewMatrix(trans);
  50.                                         std::cout<<"Down"<<std::endl;
  51.                                 }
  52.                                 else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Left )
  53.                                 {
  54.                                         trans.set(trans.x()-_x,trans.y(),trans.z());
  55.                                         pat->setPosition(trans);
  56.                                         //viewer->getCamera()->setViewMatrix(trans);
  57.                                         std::cout<<"Left"<<std::endl;
  58.                                 }
  59.                                 else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Right )
  60.                                 {
  61.                                         trans.set(trans.x()+_x,trans.y(),trans.z());
  62.                                         pat->setPosition(trans);
  63.                                         //viewer->getCamera()->setViewMatrix(trans);
  64.                                         std::cout<<"Right"<<std::endl;
  65.                                 }
  66.                                 return true;
  67.                         }
  68.                         break;
  69.                 default:break;
  70.                 }
  71.                 return false;
  72.         }

  73. private:
  74.         float _x;       
  75.         float _z;
  76. };
复制代码

  1. int main(int argc,char ** argv)
  2. {
  3.         osgViewer::Viewer viewer;
  4.         osg::Node* model = osgDB::readNodeFile( "cow.osg" );
  5.         osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;
  6.         pat->addChild(model);
  7.         viewer.setSceneData( pat.get() );
  8.        
  9. viewer.addEventHandler(new KeyboardHandler);

  10.         return viewer.run();
  11. }
复制代码




我按照《设计与实践》第八章那个处理键盘事件的例子,写的处理键盘事件;
通过Up,Down,Left,Right控制模型在x轴和z轴上移动;通过PositionAttitudeTransform节点控制位置变换;
出现的问题是:
按了一个键以后模型可以在一个方向上正常移动,但是再按另一个键时候,它不是从当前位置上开始移动,而又是从viewer的“零点”开始移动,请问这是为什么?求教~~~

该用户从未签到

发表于 2010-6-29 14:35:29 | 显示全部楼层
#  osg::Vec3d trans(0.0,0.0,0.0);
#                                
#                                 if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Up )
#                                 {                       
#                                         trans.set(trans.x(),trans.y(),trans.z()+_z);
#                                         pat->setPosition(trans);
你的trans是固定在(0,0,0),自然看起来每次进入事件都会回到哪里。
改成  osg::Vec3d trans = pat->getPosition();应该就行了。

该用户从未签到

 楼主| 发表于 2010-6-29 15:20:32 | 显示全部楼层
2# aya_daxiang 是的,非常感谢~~~
还要请教一下哦,为什么通过
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
得到的viewer 不能操作视点变换呢?比如说是
viewer->getCamera()->setViewMatrix(trans);
我最开始是想操作相机变换的,这样做好像并不行?
请教~~~

该用户从未签到

发表于 2010-6-29 15:46:11 | 显示全部楼层
本帖最后由 aya_daxiang 于 2010-6-29 16:03 编辑

viewer.run()中设置了一个默认的TrackballManipulator漫游器,所以如果您使用while (!viewer.done()) viewer.frame();的方法自然就可以用viewer->getCamera()->setViewMatrix( 来控制相机位置了。

该用户从未签到

 楼主| 发表于 2010-6-29 16:08:45 | 显示全部楼层
4# aya_daxiang 我用的就是viewer.frame() 啊

该用户从未签到

发表于 2010-6-29 16:15:01 | 显示全部楼层
可你上面得code里用的是.run()啊...你有没有用什么camera manipulator?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表