查看: 1111|回复: 5

求教:osg 拾取失败

[复制链接]

该用户从未签到

发表于 2014-8-9 17:53:58 | 显示全部楼层 |阅读模式
在qt5中想要实现osg拾取功能,但是拾取不到;
  1. bool PickHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa)
  2. {
  3.        osgViewer::View* viewer = dynamic_cast<osgViewer::View*>(&aa);

  4.        if (!viewer) return false;
  5.        switch(ea.getEventType())
  6.        {
  7.            case(osgGA::GUIEventAdapter::KEYUP):
  8.            {
  9.                if (ea.getKey()=='s')
  10.                {
  11.                   // saveSelectedModel(viewer->getSceneData());
  12.                }
  13.                else if (ea.getKey()=='o')
  14.                {
  15.                    osg::notify(osg::NOTICE)<<"Saved model to file 'saved_model.osg'"<<std::endl;
  16.                   // osgDB::writeNodeFile(*(viewer->getSceneData()), "saved_model.osg");
  17.                }
  18.                else if (ea.getKey()=='p')
  19.                {

  20.                }
  21.                else if (ea.getKey()=='c')
  22.                {

  23.                }
  24.                else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Delete || ea.getKey()==osgGA::GUIEventAdapter::KEY_BackSpace)
  25.                {

  26.                }
  27.                return false;
  28.            }
  29.            case(osgGA::GUIEventAdapter::PUSH):
  30.            case(osgGA::GUIEventAdapter::MOVE):
  31.            {
  32.                _mx = ea.getX();
  33.                _my = ea.getY();
  34.                return false;
  35.            }
  36.            case(osgGA::GUIEventAdapter::RELEASE):
  37.            {
  38.                if (_mx == ea.getX() && _my == ea.getY())
  39.                {
  40.                    // only do a pick if the mouse hasn't moved
  41.                    osg::Node* scene = viewer->getSceneData();
  42.                    if (!scene) return false;
  43.                    qDebug()<<scene->asGroup()->getNumChildren();
  44.                    qDebug()<<"picked";
  45.                    osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
  46.                    osgUtil::IntersectionVisitor iv(intersector.get());
  47.                     viewer->getCamera()->accept(iv);


  48.                    if (intersector->containsIntersections()) {
  49.                         qDebug()<<"get picked";
  50.                    }
  51.                    osgUtil::LineSegmentIntersector::Intersections intersections;
  52.                    if(viewer->computeIntersections(_mx,_my,intersections)){
  53.                        qDebug()<<"get picked";

  54.                    }
  55.                }
  56.                return true;
  57.            }
  58.            default:
  59.                return false;
  60.        }
  61.    }
复制代码


intersector->containsIntersections()

viewer->computeIntersections(_mx,_my,intersections)
返回的都是false。

该用户从未签到

 楼主| 发表于 2014-8-9 19:04:53 | 显示全部楼层
添加模型的代码是这样的:
  1. osg::ref_ptr<osg::Node> MainWindow::drawMash(int zone_number, int reg_number)
  2. {
  3.     Zone* zone = &zones[zone_number];
  4.     Regn* r  = &zone->regs[reg_number];
  5.     //osg::ref_ptr< osg::Group > root = new osg::Group;
  6.     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  7.     geode->setName(r->name);
  8.     //定义颜色数组
  9.     osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
  10.     c->push_back(osg::Vec4(1.f,0.f,0.f,0.3f));
  11.     //定义颜色数组
  12.     osg::ref_ptr<osg::Vec4Array> b = new osg::Vec4Array;
  13.     b->push_back(osg::Vec4(1.f,1.f,1.f,0.3f));
  14.     if(r->dim == CellDim){
  15.         if (r->nedges) {
  16.               int ne;
  17.               osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
  18.               //首先定义点
  19.               osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  20.               geom->setVertexArray(v.get());
  21.               for (ne = 0; ne < r->nedges; ne++) {
  22.                     v->push_back(osg::Vec3(zone->nodes[r->edges[ne].nodes[0]][0],zone->nodes[r->edges[ne].nodes[0]][1],zone->nodes[r->edges[ne].nodes[0]][2]));
  23.                     v->push_back(osg::Vec3(zone->nodes[r->edges[ne].nodes[1]][0],zone->nodes[r->edges[ne].nodes[1]][1],zone->nodes[r->edges[ne].nodes[1]][2]));
  24.                 }

  25.                geom->setColorArray(b.get());
  26.                geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
  27.               //设置关联方式

  28.                geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, r->nedges*2));
  29.                geode->addDrawable(geom.get());


  30.             }
  31.     }else{
  32.     int nf,nn;
  33.     Face *f;
  34.     for (f = r->faces, nf = 0; nf < r->nfaces; nf++, f++) {
  35.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
  36.         //首先定义点
  37.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  38.         geom->setVertexArray(v.get());
  39.         for (nn = 0; nn < f->nnodes; nn++){
  40.             v->push_back(osg::Vec3(zone->nodes[f->nodes[nn]][0],zone->nodes[f->nodes[nn]][1],zone->nodes[f->nodes[nn]][2]));
  41.         }

  42.         geom->setColorArray(c.get());
  43.         geom->setColorBinding(osg::Geometry::BIND_OVERALL);
  44.         //设置关联方式

  45.          geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, f->nnodes));
  46.          geode->addDrawable(geom.get());
  47.     }
  48.    }

  49.     osg::StateSet *ss=geode->getOrCreateStateSet();
  50.     ss->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  51.     return geode.get();
  52. }
复制代码


求各位大神指教啊、

该用户从未签到

发表于 2015-5-15 10:25:24 | 显示全部楼层
楼主问题最后怎么解决的?

该用户从未签到

发表于 2015-5-29 15:59:36 | 显示全部楼层
foeming 发表于 2015-5-15 10:25
楼主问题最后怎么解决的?

我好想又看到你了

该用户从未签到

发表于 2015-6-1 09:49:34 | 显示全部楼层

多交流才会有进步嘛

该用户从未签到

发表于 2015-6-3 10:23:37 | 显示全部楼层
本帖最后由 buaahc 于 2015-6-3 10:27 编辑

看了一下 你的代码,场景中的节点是一条线和一个线的闭环,碰撞检测没有实现对于线的检测,目标节点最起码要是个三角形,对于点和线可以考虑使用多面体求交器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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