查看: 1267|回复: 3

事件回调问题。

[复制链接]

该用户从未签到

发表于 2011-8-17 11:32:27 | 显示全部楼层 |阅读模式
各位好,我现在遇到一个问题,就是在camera下面添加了两个事件回调,一个是监听窗口大小发生变化,一个是用来检测是否单击了这个camera下的某个模型,我在vs2010下直接运行都没有问题,但是我在生成的release版本(或者debug版本)下运行的话,这些事件回调有时候有检测到,有时候又没有(就是有时候能响应事件回调,有时候不可以响应事件),不知道大家有没有遇到这种情况。。。。
我用的是在MFC。。。。

该用户从未签到

发表于 2011-8-18 08:25:00 | 显示全部楼层
仅凭您的文字描述我无法判断什么

该用户从未签到

 楼主| 发表于 2011-8-18 09:35:37 | 显示全部楼层
我的的意思就是说:

  1. mHudCamera->addChild(mArtRoot);
  2. mHudCamera->addChild(mToolRoot);
  3. mHudCamera->addChild(mBackGeode);
  4. mHudCamera->addEventCallback(new C3DCameraEvent(this));
复制代码
在这个camera下添加了一个事件回调,用来检测是否单击了mArtRoot、mToolRoot这两个节点下的某个按钮,事件回调的函数如下:

  1. class C3DCameraEvent: public osg::NodeCallback
  2. {
  3. public:
  4.         C3DCameraEvent(CArt3D* art3d);
  5.         ~C3DCameraEvent(void);

  6.         virtual void operator()(osg::Node* n, osg::NodeVisitor* nv)
  7.         {
  8.                 osgGA::EventVisitor* eventVisitor=dynamic_cast<osgGA::EventVisitor*>(nv);
  9.                 osg::Camera* node=dynamic_cast<osg::Camera*>(n);

  10.                 if (!eventVisitor || !node)
  11.                 {
  12.                         std::cout<<"Camera listener fail"<<std::endl;
  13.                         return;
  14.                 }

  15.                 osgGA::EventQueue::Events& events=eventVisitor->getEvents();
  16.                 for (osgGA::EventQueue::Events::const_iterator ite = events.begin(); ite != events.end(); ite++)
  17.                 {
  18.                         double mx;
  19.                         double my;
  20.                         double w;
  21.                         double h;
  22.                         osgUtil::PolytopeIntersector* intersector = NULL;
  23.                         osgUtil::IntersectionVisitor iv;
  24.                         osgUtil::PolytopeIntersector* intersector1 = NULL;
  25.                         osgUtil::IntersectionVisitor iv1;
  26.                         switch ((*ite)->getEventType())
  27.                         {
  28.                         case osgGA::GUIEventAdapter::PUSH:
  29.                                 {
  30.                                         mx = (*ite)->getXnormalized();
  31.                                         my = (*ite)->getYnormalized();
  32.                                         w = 0.005;
  33.                                         h = 0.005;
  34.                                         intersector = new osgUtil::PolytopeIntersector( osgUtil::Intersector::PROJECTION, mx-w, my-h, mx+w, my+h );
  35.                                         iv.setIntersector(intersector);
  36.                                         node->accept(iv);
  37.                                         if (intersector->containsIntersections())
  38.                                         {
  39.                                                 osgUtil::PolytopeIntersector::Intersection intersection = intersector->getFirstIntersection();
  40.                                                 osg::NodePath& nodePath = intersection.nodePath;
  41.                                                 osg::Node* internode = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
  42.                                                 std::string name = internode->getName();
  43.                                                 std::string classname = internode->className();
  44.                                                 mArt3D->mousePush(name);
  45.                                         }
  46.                                 }

  47.                                 break;
  48.                         case osgGA::GUIEventAdapter::MOVE:
  49.                                 {
  50.                                         mx = (*ite)->getXnormalized();
  51.                                         my = (*ite)->getYnormalized();
  52.                                         w = 0.005;
  53.                                         h = 0.005;
  54.                                         intersector1 = new osgUtil::PolytopeIntersector( osgUtil::Intersector::PROJECTION, mx-w, my-h, mx+w, my+h );
  55.                                         iv1.setIntersector(intersector1);
  56.                                         node->accept(iv1);
  57.                                         if (intersector1->containsIntersections())
  58.                                         {
  59.                                                 osgUtil::PolytopeIntersector::Intersection intersection = intersector1->getFirstIntersection();
  60.                                                 osg::NodePath& nodePath = intersection.nodePath;
  61.                                                 osg::Node* internode = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
  62.                                                 std::string name = internode->getName();
  63.                                                 std::string classname = internode->className();
  64.                                                 mArt3D->mouseEnter(name);
  65.                                         }
  66.                                 }
  67.                                 break;

  68.                         case osgGA::GUIEventAdapter::DRAG:
  69.                                 {
  70.                                         //
  71.                                         mArt3D->mouseDrag();
  72.                                 }
  73.                                 break;

  74.                         default:
  75.                                 break;
  76.                         }
  77.                 }

  78.                 traverse(n,nv);
  79.         }

  80. public:
  81.         CArt3D* mArt3D;

复制代码
然后我直接在VS2010调试程序,单击上面的运行调试程序,在这种情况下是没有问题,按键都可以响应到。
但是我单击在它生成的(debug)EXE程序时就会出现有些按钮不能响应。
就是直线在编译器运行调试程序跟在debug生成的程序不一样。

该用户从未签到

发表于 2011-8-19 08:30:55 | 显示全部楼层
这种情况通常和程序代码没有关系,而是您的工程设置有问题,比如依赖库可能存在混用等等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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