查看: 1377|回复: 15

单幅点云文件 点击拾取具体点

[复制链接]

该用户从未签到

发表于 2015-8-26 14:35:52 | 显示全部楼层 |阅读模式
逛了好久,只是知道用多胞体可以拾取,但具体怎么拾取,麻烦大牛给段代码参考参考,不胜感激~


该用户从未签到

发表于 2015-9-14 08:56:45 | 显示全部楼层
view->computeIntersections(ea,intersections)     试试看

该用户从未签到

 楼主| 发表于 2016-1-14 14:44:55 | 显示全部楼层
yang 发表于 2015-9-14 08:56
view->computeIntersections(ea,intersections)     试试看

能在具体点么?

该用户从未签到

发表于 2016-1-15 16:04:21 | 显示全部楼层
这个函数里就有坐标,遍历一下就可以取出。

该用户从未签到

 楼主| 发表于 2016-1-18 14:25:24 | 显示全部楼层
能不能麻烦给点代码性的帮助信息~ 拜托拜托

该用户从未签到

发表于 2016-1-18 16:46:42 | 显示全部楼层
osgUtil:ineSegmentIntersector::Intersections intersections;
    int index = 0;
    if(mView->computeIntersections(x,y,intersections))  {
        for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr
            = intersections.begin();hitr != intersections.end(); ++hitr){
            if(! hitr->nodePath.empty()){
                os<<"Mouse in World X:"<<hitr->getWorldIntersectPoint().x()
                 <<"Mouse in World Y:"<<hitr->getWorldIntersectPoint().y()
                 <<"Mouse in World Z:"<<hitr->getWorldIntersectPoint().z()<<std::endl;
                glist += os.str();
//                setLabel(glist);
                if(index++ == 0){
                     updatePick(createPointSelector(hitr->getWorldIntersectPoint()));
                }
            }
        }

    }

该用户从未签到

 楼主| 发表于 2016-1-18 16:49:08 | 显示全部楼层
yang 发表于 2016-1-18 16:46
osgUtil:ineSegmentIntersector::Intersections intersections;
    int index = 0;
    if(mView->com ...

这个在CookBook那本书上有,针对node可以pick,但如果针对点云的话,这样是不行的~有人说使用polytopeIntersector可以,可是我不怎么会使用polytopeIntersector~没有编出来~

该用户从未签到

发表于 2016-1-18 19:42:51 | 显示全部楼层
本帖最后由 xuefeng310 于 2016-1-18 19:44 编辑

要实现拾取点,前提当然要将每个点作为一个几何元素,这样绘制过程才能反过来确定选择的点,因此绘制过程也要调整啊!

该用户从未签到

发表于 2016-1-18 21:55:23 | 显示全部楼层
wy313122343 发表于 2016-1-18 16:49
这个在CookBook那本书上有,针对node可以pick,但如果针对点云的话,这样是不行的~有人说使用polytopeInte ...

你的点云不是node类型的点构成的吗? 点云不就是一堆坐标点文件吗?这些点转成node类型的绘制出来就可以拾取了。

该用户从未签到

发表于 2016-1-18 22:16:27 | 显示全部楼层
bool pick( const double x, const double y,
            osgViewer::Viewer* viewer )
    {
        if (!viewer->getSceneData())
            // Nothing to pick.
            return false;

        double w( .05 ), h( .05 );
        osgUtil:olytopeIntersector* picker =
                new osgUtil::PolytopeIntersector(
                    osgUtil::Intersector::PROJECTION,
                        x-w, y-h, x+w, y+h );

        osgUtil::IntersectionVisitor iv( picker );
        viewer->getCamera()->accept( iv );

        if (picker->containsIntersections())
        {
            const osg::NodePath& nodePath =
                    picker->getFirstIntersection().nodePath;
            unsigned int idx = nodePath.size();
            while (idx--)
            {
                // Find the LAST MatrixTransform in the node
                //   path; this will be the MatrixTransform
                //   to attach our callback to.
                osg::MatrixTransform* mt =
                        dynamic_cast<osg::MatrixTransform*>(
                            nodePath[ idx ] );
                if (mt == NULL)
                    continue;

                // If we get here, we just found a
                //   MatrixTransform in the nodePath.

                if (_selectedNode.valid())
                    // Clear the previous selected node's
                    //   callback to make it stop spinning.
                    _selectedNode->setUpdateCallback( NULL );

                _selectedNode = mt;
                _selectedNode->setUpdateCallback( new RotateCB );
                break;
            }
            if (!_selectedNode.valid())
                osg::notify() << "ick failed." << std::endl;
        }
        else if (_selectedNode.valid())
        {
            _selectedNode->setUpdateCallback( NULL );
            _selectedNode = NULL;
        }
        return _selectedNode.valid();
    }
参考一下这段代码!!

该用户从未签到

 楼主| 发表于 2016-1-19 09:40:30 | 显示全部楼层
yang 发表于 2016-1-18 22:16
bool pick( const double x, const double y,
            osgViewer::Viewer* viewer )
    {

感谢感谢~我先试试~~~~ :kiss: :kiss:

该用户从未签到

 楼主| 发表于 2016-1-19 09:43:01 | 显示全部楼层
xuefeng310 发表于 2016-1-18 19:42
要实现拾取点,前提当然要将每个点作为一个几何元素,这样绘制过程才能反过来确定选择的点,因此绘制过程也 ...

你的意思是 每个点都作为一个Node进行绘制显示? 那如果我有千万个点的点云 还得绘制千万个node?这样不行吧?

该用户从未签到

 楼主| 发表于 2016-1-19 09:46:17 | 显示全部楼层
其实碰到这种问题的有好多了,只是他们解决问题后,只是说“我解决了,用了polytopeIntersector”,就没了,也没说具体怎么做的~哎~~~~~

该用户从未签到

发表于 2016-1-19 20:50:29 | 显示全部楼层
不用都是Node啊,一个Node里边可以有很多几何元素,你可以看看osgPick例子

该用户从未签到

 楼主| 发表于 2016-1-20 21:54:39 | 显示全部楼层
xuefeng310 发表于 2016-1-19 20:50
不用都是Node啊,一个Node里边可以有很多几何元素,你可以看看osgPick例子

恩,好的~感谢!

该用户从未签到

 楼主| 发表于 2016-1-21 10:02:23 | 显示全部楼层
yang 发表于 2016-1-18 22:16
bool pick( const double x, const double y,
            osgViewer::Viewer* viewer )
    {

成功了,可以拾取到选区内的所有点云,使用getIntersections,跟进去可以看到有很多交点,可是这些焦点要怎么才能输出拿到呢?又碰到这个问题了~贱笑贱笑~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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