查看: 1582|回复: 13

对一个root鼠标查询出现问题

[复制链接]

该用户从未签到

发表于 2013-6-2 14:54:11 | 显示全部楼层 |阅读模式
本帖最后由 ldj 于 2013-6-2 14:57 编辑

//事件处理函数
bool CPickHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
        //AfxMessageBox(_T("ddd"));
        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
        if (!viewer)
                        return false;       
        switch(ea.getEventType())
        {
          case(osgGA::GUIEventAdapter:USH):
                {
                        m_x=ea.getX();
                        m_y=ea.getY();
                        pick(viewer,m_x,m_y);
                        return false;
                }
                //每一帧
         //   case(osgGA::GUIEventAdapter::RELEASE):
                //{               
                //     if(m_x==ea.getX()&&m_y==ea.getY())
                //         
                //                //执行PICK动作
                //               
                //          
                //
                //        return false;
                //}   
        default:
                return false;
        }

}
//PICK动作
void CPickHandler::pick(osgViewer::Viewer* viewer,double x,double y)
{
         
        if(!viewer->getSceneData())
                return  ;
        double w(0.5),h(0.5);
        osgUtil::PolytopeIntersector *picker=new osgUtil::PolytopeIntersector(osgUtil::Intersector::PROJECTION,x-h,y-h,x+h,y+h);
        osgUtil::IntersectionVisitor iv(picker);
        osg::Node  *node=viewer->getSceneData();
        osg::Group *group=node->asGroup();
        group->accept(iv);
        if(picker->containsIntersections())//后面括号的代码都不执行。
        {
                osg::NodePath& nodepath= picker->getFirstIntersection().nodePath ;
                unsigned int idx=nodepath.size();
                osg::Node *node= dynamic_cast<osg::Node *>(nodepath[idx-1]);
                m_osgHandle->ickNodeCallBack(node);
        }
}
请高手帮助看下。

该用户从未签到

发表于 2013-6-3 08:36:13 | 显示全部楼层
应该是WINDOW吧

该用户从未签到

 楼主| 发表于 2013-6-3 10:43:54 | 显示全部楼层
具体说

该用户从未签到

 楼主| 发表于 2013-6-4 14:39:01 | 显示全部楼层
请版主解答。

该用户从未签到

发表于 2013-6-4 16:35:38 | 显示全部楼层
ldj 发表于 2013-6-4 14:39
请版主解答。

new osgUtillytopeIntersector(osgUtil::Intersector:ROJECTION
ROJECTION改为WINDOW

该用户从未签到

 楼主| 发表于 2013-6-4 17:38:39 | 显示全部楼层
修改后 还是不行

该用户从未签到

发表于 2013-6-4 21:12:10 | 显示全部楼层
估计是你的:
group->accept(iv)有问题;
场景的group节点与osgUtil::IntersectionVisitor应该只有一次遍历访问吧,而且结果是与group类型节点是无相交;
那么他当然就不可能执行下去了;
可以尝试用:
用scene->accept(iv);
或是Camera->accept(iv);

该用户从未签到

 楼主| 发表于 2013-6-4 21:39:19 | 显示全部楼层
//PICK动作
void CPickHandler:: pick(osgViewer::Viewer* viewer,double x,double y)
{
         
        if(!viewer->getSceneData())
                return  ;
        double w(0.05),h(0.05);
        osgUtil:: PolytopeIntersector * picker=new osgUtil:: PolytopeIntersector(osgUtil:: PolytopeIntersector:: PROJECTION,x-h,y-h,x+h,y+h);
        osgUtil::IntersectionVisitor iv(picker);
        osg::Node  *node=viewer->getSceneData();
        osg::Group *group=node->asGroup();

        //group->accept(iv);
        viewer->getCamera()->accept(iv);
        if(picker->containsIntersections())
        {
                osg::NodePath& nodepath= picker->getFirstIntersection().nodePath ;
                unsigned int idx=nodepath.size();
                osg::Node *node= dynamic_cast<osg::Node *>(nodepath[idx-1]);
                m_osgHandle->PickNodeCallBack(node);
        }
}
一样不执行

该用户从未签到

发表于 2013-6-4 22:39:27 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-6-4 22:58 编辑

这样很难判断:
   1.第一,如果你的OSG环境是简单的单一的视窗,单摄像机,那么这个PICK 应该是没有太大的问题,不相交,只能说明picker=new osgUtil:: PolytopeIntersector(osgUtil:: PolytopeIntersector:: PROJECTION,x-h,y-h,x+h,y+h)确实没有交点;
  2.如果你的PICKER是在多个的VIEWER或是CAMERA环境中,PICK的执行与对应 的(VIEWER或是CAMERA)之间的关系,需要考虑清楚。
3.还有就是,你的 pick(osgViewer::Viewer* viewer,double x,double y)函数,是在什么情况下触发执行的有很大关系----是否与鼠标事件挂钩?就是说你是在case osgGA::GUIEventAdapter:: RELEASE还是在case osgGA::GUIEventAdapter::  PUSH下去执行的PICK,也就是说是否存在containsIntersections()事件!
(一般PICK事件是否应该放在release下?否则,你鼠标Push 的释放前瞬间最后的点如果没有相交呢?(containsIntersections()事件结果就不存在了))
4.就是场景的单元是否特殊,相交的是否是osgUtil:: PolytopeIntersector类型的,还是其他如LineSegmentIntersector?

  以上是你可能要考虑的几个方面,不能单看一个函数就判断是否问题只限于这个区域内了!

该用户从未签到

 楼主| 发表于 2013-6-5 10:27:34 | 显示全部楼层
是单相机
  case(osgGA::GUIEventAdapter::RELEASE):
                {               
                     m_x=ea.getX();
                        m_y=ea.getY();
                        pick(viewer,m_x,m_y);
                               
                          
                 
                        return false;
                }   
还是不执行
场景就是一堆建筑和贴图

该用户从未签到

发表于 2013-6-5 12:12:37 | 显示全部楼层
因不知道你的整体运行环境:
     不执行,只能说明picker->containsIntersections()返回的是FALSE
建议:
问题查找:
1.放到简单的环境,新建一个简单的OSG窗口环境
2.只考虑需要测试的类的CPickHandler::handle()
3. 用一个简单模型(如COW.OSG)作为场景,测试是否执行

----A如果能执行: 说明 类函数正确
  
问题可能是:
  1.模型问题(模型不能用这种方法实现相交,模型可能不是PLOYTOPE类型)
     可以再加载你的建筑模型,看是否能够正确PICK(能够,就不是模型的问题,排除此可能性,问题出在其他方面)
  2.你的osg整体环境影响(也许是线程、其他函数参数等等)

----B 如果不能执行
  说明你的函数是有问题(这种可能性不大,有也应该是你的触发问题)!

该用户从未签到

 楼主| 发表于 2013-6-5 14:21:11 | 显示全部楼层
忘记说了 模型都是3角面组成的 应该是PLOYTOPE的问题?

该用户从未签到

发表于 2013-6-5 15:43:22 | 显示全部楼层
本帖最后由 fenma3422 于 2013-6-5 15:45 编辑

如果你设置的坐标系是window或者project,那么在accept时应该采用camera节点来accept。
如果是世界坐标系或其他坐标系则可以使用对应的node来accept

该用户从未签到

发表于 2013-6-5 16:19:16 | 显示全部楼层
osgUtillytopeIntersector *picker=new osgUtil:olytopeIntersector(osgUtil::Intersector:ROJECTION,x-h,y-h,x+h,y+h);


中的osgUtil::Intersector:ROJECTION就是坐标系设置
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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