查看: 3240|回复: 14

osg中拾取billboard对象不成功

[复制链接]

该用户从未签到

发表于 2012-5-15 11:51:55 | 显示全部楼层 |阅读模式
osg中拾取billboard对象不成功,view->computeIntersections(x,y,intersections,traversalMask)函数不走

该用户从未签到

发表于 2012-5-15 19:39:34 | 显示全部楼层
终于有人遇到跟我一样的问题了,我在做text的时候也选择不到,实体有的时候也选的不对

该用户从未签到

发表于 2012-5-17 10:48:21 | 显示全部楼层
选择Text没有什么问题,您需要给出更多的信息

该用户从未签到

 楼主| 发表于 2012-5-17 11:55:48 | 显示全部楼层
定义一个Billboard节点,pick时view->computeIntersections(x,y,intersections,traversalMask)函数不走,将节点类型改为Geode,该函数就走,另外BillBoard中添加的Drawable是自己绘制的Geometry

该用户从未签到

发表于 2012-5-21 13:26:04 | 显示全部楼层
另外BillBoard中添加的Drawable是自己绘制的Geometry
这就是问题的关键,自己绘制的Geometry不包含可以求交时使用的顶点和图元信息,除非您重写accept()系列函数,否则无法对这类自定义的元素求交

该用户从未签到

 楼主| 发表于 2012-5-21 14:02:09 | 显示全部楼层
array 发表于 2012-5-21 13:26
这就是问题的关键,自己绘制的Geometry不包含可以求交时使用的顶点和图元信息,除非您重写accept()系列函数 ...

那为什么节点类型是Geode时添加自己定义的Geometry对象可以拾取到,把节点类型改为BillBoard时同样的Geometry就拾取不到了

该用户从未签到

发表于 2012-5-22 09:38:46 | 显示全部楼层
您需要给出更多的信息,自己写的Drawable是不能求交的,不过如果您是用了Geometry并继承它的话,倒是没有问题

该用户从未签到

 楼主| 发表于 2012-5-22 10:38:10 | 显示全部楼层
array 发表于 2012-5-22 09:38
您需要给出更多的信息,自己写的Drawable是不能求交的,不过如果您是用了Geometry并继承它的话,倒是没有问 ...

osg::ref_ptr<osg:rawable> createRectangle()
{
        osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
        osg::ref_ptr<osg::Vec3Array> coords = new osg::Vec3Array();
        coords->push_back(osg::Vec3(-6.5f,0.0f,6.5f));
        coords->push_back(osg::Vec3(-6.5f,0.0f,5.5f));
        coords->push_back(osg::Vec3(-6.0f,0.0f,5.5f));
        coords->push_back(osg::Vec3(-6.0f,0.0f,6.5f));
        geom->setVertexArray(coords.get());
        geom->addPrimitiveSet(new osg::DrawArrays(osg:rimitiveSet:UADS,0,4));
        osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();
        nc->push_back(osg::Vec3(0.0f,-1.0f,0.0f));
        geom->setNormalArray(nc.get());
        geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
        osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
        vc->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        vc->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        vc->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        vc->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
        geom->setColorArray(vc.get());
        geom->setColorBinding(osg::Geometry::BIND_OVERALL);
        osg::StateSet* stateset = geom->getOrCreateStateSet();
        stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::ON);
        return geom.get();
}
我是定义的一个Drawable,把它加给BillBoard就不能拾取,加给geode就可以拾取

该用户从未签到

发表于 2012-5-24 13:17:08 | 显示全部楼层
这叫做“自己定义”么。。。分明就是用的Geometry,您这是一个纯粹的平面,不排除因为包围盒的建立和精度问题导致求交没有结果。可以很简单地在Y上加一个高度试试

该用户从未签到

 楼主| 发表于 2012-5-24 16:40:18 | 显示全部楼层
改成coords->push_back(osg::Vec3(-6.5f,1.0f,6.5f));
        coords->push_back(osg::Vec3(-6.5f,1.0f,5.5f));
        coords->push_back(osg::Vec3(-6.0f,2.0f,5.5f));
        coords->push_back(osg::Vec3(-6.0f,2.0f,6.5f));
或coords->push_back(osg::Vec3(-6.5f,1.0f,6.5f));
        coords->push_back(osg::Vec3(-6.5f,1.0f,5.5f));
        coords->push_back(osg::Vec3(-6.0f,1.0f,5.5f));
        coords->push_back(osg::Vec3(-6.0f,1.0f,6.5f));
还是不行,加上osg::Billboard* b = new osg::Billboard();
        b->addDrawable(createRectangle());
        b->setMode(osg::Billboard:OINT_ROT_EYE);
        osg::BoundingBox bs;
        bs.set(-7.0f,-1.0f,5.0f,-6.0f,1.0f,6.0f);
        b->setInitialBound(bs);
也不行

该用户从未签到

发表于 2012-5-24 16:46:56 | 显示全部楼层
那么根据您目前给出的信息我就判断不了什么了,也许和您的LinesegmentIntersector使用也有关

该用户从未签到

 楼主| 发表于 2012-5-24 21:39:09 | 显示全部楼层
拾取算法没问题,把定义的geometry加给Geode节点就能拾取到,加给billboard就不可以

该用户从未签到

 楼主| 发表于 2012-5-24 21:41:15 | 显示全部楼层
array 发表于 2012-5-24 16:46
那么根据您目前给出的信息我就判断不了什么了,也许和您的LinesegmentIntersector使用也有关

拾取算法没问题,把定义的geometry加给Geode节点就能拾取到,加给billboard就不可以

该用户从未签到

发表于 2012-6-18 21:26:44 | 显示全部楼层
看osgPick的例子  利用Geode叶节点的setName给节点增加名称  然后挂到Camera节点上  这样鼠标在拾取的时候  执行hitr->nodePath.back()->getName一句就能获得setName赋予的名称 进入下一层语句   是不是要给Billboard附上名称才可以Pick啊?

该用户从未签到

发表于 2019-10-17 10:03:45 | 显示全部楼层
这个问题有解决吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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