查看: 2657|回复: 5

addEventHandler有什么特殊的地方吗?

[复制链接]

该用户从未签到

发表于 2009-3-21 22:48:01 | 显示全部楼层 |阅读模式
我写了一个EventHanlder来选中节点 结果addEventHandler后 没有任何效果呢.是不是有什么特殊的地方要处理啊.
头文件:
  1. /*
  2. * QNodePickHandler.h
  3. *
  4. *  Created on: Mar 21, 2009
  5. *      Author: Administrator
  6. */

  7. #ifndef QNODEPICKHANDLER_H_
  8. #define QNODEPICKHANDLER_H_
  9. #include <osgViewer/Viewer>
  10. #include <osgViewer/View>
  11. #include <osg/Node>
  12. #include <osg/Geode>
  13. #include <osg/Group>
  14. #include <osgDB/ReadFile>
  15. #include <osgDB/WriteFile>
  16. #include <osgFX/Scribe>
  17. #include <osgGA/GUIEventHandler>

  18. using namespace osg;
  19. using namespace osgGA;
  20. using namespace osgFX;
  21. using namespace osgViewer;
  22. class QNodePickHandler:public GUIEventHandler
  23. {
  24. public:
  25.         QNodePickHandler();
  26.         virtual ~QNodePickHandler();
  27.         osgViewer::View* getViewer() const;
  28.         void setViewer(osgViewer::View* viewer);
  29.         bool handle(const GUIEventAdapter& ea,const GUIActionAdapter& aa);
  30.         void enable(bool enable);
  31.         bool isEnable() const;
  32. private:
  33.         void pick(float x,float y);
  34. private:
  35.   bool _enabled;
  36.         float _x;
  37.         float _y;
  38.         osgViewer::View* _viewer;
  39. };

  40. #endif /* QNODEPICKHANDLER_H_ */
复制代码
实现:
  1. /*
  2. * QNodePickHandler.cpp
  3. *
  4. *  Created on: Mar 21, 2009
  5. *      Author: Administrator
  6. */

  7. #include "QNodePickHandler.h"

  8. QNodePickHandler::QNodePickHandler()
  9. {
  10.   _x = 0.0f;
  11.   _y = 0.0f;
  12.   _enabled = true;
  13. }

  14. QNodePickHandler::~QNodePickHandler()
  15. {
  16.   // TODO Auto-generated destructor stub
  17. }
  18. osgViewer::View* QNodePickHandler::getViewer() const
  19. {
  20.   return _viewer;
  21. }
  22. void QNodePickHandler::setViewer(osgViewer::View* viewer)
  23. {
  24.   _viewer = viewer;
  25. }
  26. bool QNodePickHandler::handle(const GUIEventAdapter& ea,
  27.     const GUIActionAdapter&aa)
  28. {
  29.   if (!_viewer||!_enabled)
  30.     return false;
  31.   switch (ea.getEventType())
  32.   {
  33.     case GUIEventAdapter::PUSH: {
  34.       _x = ea.getX();
  35.       _y = ea.getY();
  36.       break;
  37.     }
  38.     case GUIEventAdapter::RELEASE: {
  39.       if (_x == ea.getX() && _y == ea.getY()) {
  40.         pick(_x, _y);
  41.       }
  42.       break;
  43.     }
  44.     default:
  45.       break;
  46.   }
  47.   return false;
  48. }
  49. void QNodePickHandler::pick(float x, float y)
  50. {
  51.   Node* node = NULL;
  52.   Group* parent = new Group();
  53.   osgUtil::LineSegmentIntersector::Intersections intersections;
  54.   if (_viewer->computeIntersections(x, y, intersections)) {
  55.     osgUtil::LineSegmentIntersector::Intersection inter =
  56.         *intersections.begin();
  57.     NodePath& nodePath = inter.nodePath;
  58.     if (nodePath.size() > 0)
  59.       node = nodePath[nodePath.size() - 1];
  60.     if (nodePath.size() > 1)
  61.       parent = dynamic_cast<Group*> (nodePath[nodePath.size() - 2]);
  62.     if (parent && node) {
  63.       Scribe* parentAsScribe = dynamic_cast<Scribe*> (parent);
  64.       if (!parentAsScribe) {
  65.         Scribe* scribe = new Scribe();
  66.         scribe->addChild(node);
  67.         parent->replaceChild(node, scribe);
  68.       } else {
  69.         Node::ParentList parentList = parentAsScribe->getParents();
  70.         for (Node::ParentList::iterator itr = parentList.begin(); itr
  71.             != parentList.end(); ++itr) {
  72.           (*itr)->replaceChild(parentAsScribe, node);
  73.         }
  74.       }
  75.     }
  76.   }
  77. }
  78. void QNodePickHandler::enable(bool enable)
  79. {
  80. _enabled=enable;
  81. }
  82. bool QNodePickHandler::isEnable() const
  83. {
  84.   return _enabled;
  85. }
复制代码

该用户从未签到

 楼主| 发表于 2009-3-21 23:02:30 | 显示全部楼层
全部代码如下:
src.rar (1.8 KB, 下载次数: 156)

该用户从未签到

发表于 2009-3-22 09:03:38 | 显示全部楼层
您的handle函数为:
  1. bool handle(const GUIEventAdapter& ea,const GUIActionAdapter& aa);
复制代码
而GUIEventHandler的handle函数的正确派生格式为:
  1. bool handle (const GUIEventAdapter& ea, GUIActionAdapter& aa);
复制代码
因此我认为这里您并没有正确使用虚函数。

该用户从未签到

 楼主| 发表于 2009-3-22 14:18:18 | 显示全部楼层
老大一出手 就知有没有

该用户从未签到

发表于 2011-2-18 08:44:28 | 显示全部楼层
高手啊

该用户从未签到

发表于 2011-2-18 11:58:07 | 显示全部楼层
细节错误,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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