查看: 3190|回复: 4

帮忙看一下程序

[复制链接]

该用户从未签到

发表于 2008-3-16 22:09:25 | 显示全部楼层 |阅读模式
  1. class tankInputDeviceStateType
  2. {
  3. public:
  4.         tankInputDeviceStateType::tankInputDeviceStateType() :
  5.           moveFwdRequest(false) {}
  6.         bool moveFwdRequest;
  7. };

  8. class myKeyboardEventHandler : public osgGA::GUIEventHandler
  9. {
  10. public:
  11.         myKeyboardEventHandler(tankInputDeviceStateType* tids)
  12.         {
  13.                 tankInputDeviceState = tids;
  14.         }
  15.         virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&);
  16.         virtual void accept(osgGA::GUIEventHandlerVisitor& v)   { v.visit(*this); };
  17.         // ...
  18. protected:
  19.         tankInputDeviceStateType* tankInputDeviceState;
  20. };

  21. bool myKeyboardEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
  22. {
  23.         switch(ea.getEventType())
  24.         {
  25.         case(osgGA::GUIEventAdapter::KEYDOWN):
  26.                 {
  27.                         switch(ea.getKey())
  28.                         {
  29.                         case 'w':
  30.                                 tankInputDeviceState->moveFwdRequest = true;
  31.                                 std::cout<<"The key is w"<<std::endl;
  32.                                 return false;
  33.                                 break;
  34.                         default:
  35.                                 return false;
  36.                         }
  37.                 }
  38.         default:
  39.                 return false;
  40.         }
  41. }

  42. class updateTankPosCallback : public osg::NodeCallback
  43. {
  44. public:
  45.         updateTankPosCallback::updateTankPosCallback(tankInputDeviceStateType* tankIDevState)
  46.                 : tankPos(-15.,0.,0.)
  47.         {
  48.                 tankInputDeviceState = tankIDevState;
  49.         }
  50.         virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
  51.         {
  52.                 osg::PositionAttitudeTransform* pat =
  53.                         dynamic_cast<osg::PositionAttitudeTransform*> (node);
  54.                 if(pat)
  55.                 {
  56.                         if (tankInputDeviceState->moveFwdRequest)
  57.                         {
  58.                                 tankPos.set(tankPos.x()+.1,0,0);
  59.                                 pat->setPosition(tankPos);
  60.                         }
  61.                 }
  62.                 traverse(node, nv);
  63.         }
  64. protected:
  65.         osg::Vec3d tankPos;
  66.         tankInputDeviceStateType* tankInputDeviceState;
  67. };


  68. int main()
  69. {
  70.         osg::Node* TankNode = NULL;

  71.         TankNode= osgDB::readNodeFile( "T72-tank/t72-tank_des.flt" );
  72.         if(TankNode==NULL)
  73.                 std::cout<<"can not open the file, quiting......"<<std::endl;

  74.         osg::Group* root= new osg::Group();       

  75.         // 定义用于记录键盘事件的类的实例。
  76.         tankInputDeviceStateType* tIDevState = new tankInputDeviceStateType;
  77.        
  78.        
  79.         osg::ref_ptr<osg::MatrixTransform> mt =
  80.                 new osg::MatrixTransform;
  81.         mt->setName( "Left Cow\nDYNAMIC" );
  82.         // Set data variance to DYNAMIC to let OSG know that we
  83.         //   will modify this node during the update traversal.
  84.         mt->setDataVariance( osg::Object::DYNAMIC );
  85.         // Set the update callback.
  86.         // 设置坦克的更新回调。
  87.         //  其构造函数将传递上面的实例指针作为实参。
  88.         mt->setUpdateCallback(new updateTankPosCallback(tIDevState));
  89.         mt->addChild( TankNode );
  90.         root->addChild( mt.get() );

  91.         // 键盘处理器类的构造函数同样传递上面的实例指针作为实参。
  92.         myKeyboardEventHandler* tankEventHandler = new myKeyboardEventHandler(tIDevState);


  93.         osgViewer::Viewer viewer;
  94.         // 将事件处理器压入处理器列表。
  95.         viewer.addEventHandler(tankEventHandler);
  96.         // 设置视口并进入仿真循环。
  97.         viewer.setSceneData( root );
  98.         return viewer.run();
  99. }
复制代码
这是整个程序,我想实现当“w”按下时,坦克向前走,但是不动...
控制台下面是有输出的:The key is w
why,请指教,谢谢;

该用户从未签到

发表于 2008-3-16 22:44:09 | 显示全部楼层
粗看了一下代码,似乎楼主在main函数中用MatrixTransform节点来表达坦克的移动位置,并设置了相应的UpdateCallback。
但是在回调类的代码中:
  1. virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
  2. {
  3. osg::PositionAttitudeTransform* pat =
  4.    dynamic_cast<osg::PositionAttitudeTransform*> (node);
  5. if(pat)
  6. ……
复制代码
这样应该就获得不了节点了,因为MatrixTransform和PositionAttitudeTransform是不一样的,修改其中一处应该就可以了

该用户从未签到

 楼主| 发表于 2008-3-16 22:51:42 | 显示全部楼层
试一下,谢谢回复

该用户从未签到

 楼主| 发表于 2008-3-17 13:01:24 | 显示全部楼层
试着把MatrixTransform去掉,直接:
  1. TankNode->setUpdateCallback( new updateTankPosCallback(tIDevState) );
  2.         root->addChild( TankNode );
复制代码
但是结果还是不行, 具体怎么改,请指教,谢谢

该用户从未签到

发表于 2008-3-17 21:26:17 | 显示全部楼层
原帖由 dizuo 于 2008-3-17 13:01 发表
试着把MatrixTransform去掉,直接:TankNode->setUpdateCallback( new updateTankPosCallback(tIDevState) );
        root->addChild( TankNode );但是结果还是不行, 具体怎么改,请指教,谢谢


???
不是去掉MatrixTransform,除非能保证tanknode节点肯定为PositionAttitudeTransform类型。
可以直接这样改:
  1. osg::ref_ptr<osg::PositionAttitudeTransform> mt =
  2.                 new osg::PositionAttitudeTransform;
  3.         mt->setName( "Left Cow\nDYNAMIC" );
  4.         // Set data variance to DYNAMIC to let OSG know that we
  5.         //   will modify this node during the update traversal.
  6.         mt->setDataVariance( osg::Object::DYNAMIC );
  7.         // Set the update callback.
  8.         // 设置坦克的更新回调。
  9.         //  其构造函数将传递上面的实例指针作为实参。
  10.         mt->setUpdateCallback(new updateTankPosCallback(tIDevState));
  11.         mt->addChild( TankNode );
  12.         root->addChild( mt.get() );
复制代码
我做了测试,这样是没问题的,可以实现您预设的效果。当然改动Callback的内容也是可以的

[ 本帖最后由 array 于 2008-3-17 21:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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