查看: 2091|回复: 11

FireBreath尝试响应Pick函数,但插件崩溃

[复制链接]

该用户从未签到

发表于 2012-11-29 15:22:56 | 显示全部楼层 |阅读模式
  1. void EventHandler::Pick(float x,float y)
  2. {
  3.         osg::Node* node = 0;
  4.         osg::Group* parent = 0;

  5.         osgUtil::LineSegmentIntersector::Intersections interSections;

  6.         if (viewer->computeIntersections(x,y,interSections))
  7.                 //利用 view 的computerIntersection 函数来测试屏幕与场景相交结果存入到结果集中
  8.         {
  9.                 //申请一个交点的迭代器,也就是遍历器,这里还有问题:只用了begin就取出了相交的节点
  10.                 osgUtil::LineSegmentIntersector::Intersections::iterator iter = interSections.begin();

  11.                 osg::NodePath& nodePath = iter->nodePath;
  12.                 //以下的代码来自osgcompositeviewer
  13.                 node = nodePath[nodePath.size()-1];
  14.                 nodeName = node->getName();
  15.                 parent = dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]);
  16.         }//传入交点的函数执行完毕
  17.         showPick();
  18. }
复制代码
我有两个怀疑:
1.我这个viewer是EventHandler里从插件的osgWeb的源文件里传入进来的,不知道是不是这个viewer有问题,做的方法都是从Cookbook上抄下来的,不知道往自己写的这个EventHandler类里应该传哪个viewer

2.是线程的原因么?

该用户从未签到

 楼主| 发表于 2012-11-29 15:24:22 | 显示全部楼层
不知道给各位大神们吧问题描述清楚了没有。、。。。

该用户从未签到

 楼主| 发表于 2012-11-29 16:00:47 | 显示全部楼层
在线等大神啊,我想从插件里传发送事件给网页啊

该用户从未签到

发表于 2012-11-29 16:34:29 | 显示全部楼层
EventHandler:: Pick是在什么地方执行的

该用户从未签到

 楼主| 发表于 2012-11-29 22:40:42 | 显示全部楼层
array 发表于 2012-11-29 16:34
EventHandler:: Pick是在什么地方执行的

是在osgWeb:nWindowAttached(FB::AttachedEvent *evt, FB:luginWindow *win)这个函数里头添加的一个eventhandler,pick是eventhandler的一个函数。。。。
array老师的意思呢?

该用户从未签到

 楼主| 发表于 2012-11-29 23:47:47 | 显示全部楼层
我有看了CookBook后面的一个例子,那个Command Buffer的那个,难道是进程冲突的问题么?

该用户从未签到

发表于 2012-11-30 07:40:09 | 显示全部楼层
??什么问题

该用户从未签到

 楼主| 发表于 2012-11-30 09:18:08 | 显示全部楼层
liuzhiyu123 发表于 2012-11-30 07:40
??什么问题

就是我在FireBreath的插件里PICK,然后传事件到网页上去,但是一单击模型就崩溃了
应该是这句viewer->computeIntersections(x,y,interSections)导致的崩溃

该用户从未签到

发表于 2012-11-30 11:04:32 | 显示全部楼层
多半是线程同时操作导致的冲突问题,可以尝试改写一下那个command buffer的例子

该用户从未签到

 楼主| 发表于 2012-11-30 19:59:38 | 显示全部楼层
array 发表于 2012-11-30 11:04
多半是线程同时操作导致的冲突问题,可以尝试改写一下那个command buffer的例子

array老师,还是不行啊,插件还是崩溃,太菜了,完全搞不懂这个线程这个东西的概念。。。。
  1. bool PickHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
  2. {
  3.         switch(ea.getEventType())
  4.         {
  5.         case(osgGA::GUIEventAdapter::PUSH):
  6.                 {
  7.                         OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);
  8.                        
  9.                         osgViewer::View* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
  10.                         if (viewer) pick(viewer,ea);
  11.                         return false;
  12.                 }      
  13.         default:
  14.                 return false;
  15.         }
  16. }

  17. void PickHandler::pick(osgViewer::View* viewer, const osgGA::GUIEventAdapter& ea)
  18. {
  19.         float x = ea.getX();
  20.         float y = ea.getY();

  21.         osgUtil::LineSegmentIntersector::Intersections interSections;
  22.         viewer->computeIntersections(x,y,interSections);
  23. }
复制代码

该用户从未签到

发表于 2012-12-5 13:58:20 | 显示全部楼层
那您发给我的代码片段能说明什么问题?

该用户从未签到

发表于 2016-3-18 10:45:10 | 显示全部楼层
syaokun219 发表于 2012-11-30 19:59
array老师,还是不行啊,插件还是崩溃,太菜了,完全搞不懂这个线程这个东西的概念。。。。

老兄,这个问题最后怎么解决了。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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