查看: 1334|回复: 7

关于鼠标拾取

[复制链接]

该用户从未签到

发表于 2013-10-14 19:55:51 | 显示全部楼层 |阅读模式
用鼠标获得场景中的节点 节点类型本身是PositionAttitudeTransform的
获得的时候 想从node类型转成PositionAttitudeTransform 的 代码如下

  1.         osgUtil::LineSegmentIntersector::Intersections intersections;
  2.         if (viewer->computeIntersections(x, y, intersections)){
  3.                 if(flag == 1){
  4.                         parentPick->replaceChild(scribe.get(), nodePick.get());
  5.                         scribe->removeChildren(0, scribe->getNumChildren());
  6.                 }
  7.                 osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
  8.                 osg::NodePath& nodePath = intersection.nodePath;
  9.                 nodePick = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
  10.                 parentPick = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;

  11.                 if (parentPick.get() && nodePick.get()){
  12.                         //thisNode= parentPick->getParent(0);       
  13.                         thisNode = dynamic_cast<osg::PositionAttitudeTransform*>(parentPick->getParent(0));        //获得当前选择的节点
  14.                                
  15.                         //用高亮显示来显示物体已经被选中
  16.                         osg::ref_ptr<osgFX::Scribe> parentAsScribe = dynamic_cast<osgFX::Scribe*>(parentPick.get());
  17.                         if(!parentAsScribe){        //如果对象选择到 高亮显示
  18.                                 scribe->addChild(nodePick.get());               
  19.                                 parentPick->replaceChild(nodePick.get(), scribe.get());
  20.                                 if(flag == 0){        //第一次拾取
  21.                                         isSelect = true;        //表示已经选择到节点
  22.                                         flag = 1;
  23.                                 }
  24.                         }else{                //如果没选择到 移除高亮显示的对象
  25.                                 osg::Node::ParentList parentList = parentAsScribe->getParents();
  26.                                 for(osg::Node::ParentList::iterator itr = parentList.begin(); itr != parentList.end(); ++itr){
  27.                                         (*itr)->replaceChild(parentAsScribe.get(), nodePick.get());
  28.                                 }
  29.                         }
  30.                 }
  31.         }
复制代码
为什么运行后获得的thisNode不正确  调试过 在thisNode = dynamic_cast<osg:ositionAttitudeTransform*>(parentPick->getParent(0));这句运行后  thisNode里的各种信息说是  错误: 无法计算表达式的值       
求指导 谢谢

该用户从未签到

 楼主| 发表于 2013-10-16 01:18:10 | 显示全部楼层
目前解决方案:定义一个 PositionAttitudeTransform 的节点  然后让他->addChild(nodePick.get()); 不报错了 但是运行后 有两个拾取到的节点 应该是一个是root下本来场景中的 另一个就是这次add的  然后把之前的掩码设置成0 不显示出来。。显然这种方法很不好。。但是小程序 凑合用着  求大神指导 正确的方式应该怎么做 谢谢

该用户从未签到

发表于 2013-10-20 18:46:43 | 显示全部楼层
dynamic_cast是动态的类型转换,前提是被转换的实例确实可以转换到这个类型,否则返回NULL;如果RTTI类型不对的话则返回不确定的值。这是比较基本的c++ casting的知识

该用户从未签到

 楼主| 发表于 2013-10-21 18:31:32 | 显示全部楼层
array 发表于 2013-10-20 18:46
dynamic_cast是动态的类型转换,前提是被转换的实例确实可以转换到这个类型,否则返回NULL;如果RTTI类型不 ...

这个我知道啊  问题是 PositionAttitudeTransform  和Node 是继承关系吧? 所以用dynamic_cast应该没问题啊 而且我之前一个工程里貌似相同的办法转过 就能用啊  不知道为什么这次不行了

该用户从未签到

发表于 2013-10-21 20:56:06 | 显示全部楼层
继续检查

该用户从未签到

发表于 2013-11-26 16:12:09 来自手机 | 显示全部楼层
我也遇到类似的问题,当遇到不能转换的类型时就无法拾取,addchild是一种方法,有没有其他的方法呢?楼主你解决了吗

该用户从未签到

发表于 2013-11-29 20:11:42 | 显示全部楼层
这个我遇到过的,好像是先转换成Transfom再转换成PositionAttitudeTransform就可以的

该用户从未签到

发表于 2013-11-30 00:03:12 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-11-30 00:06 编辑

C++基础知识太差了,
动态映射dynamic_cast<osg:: ositionAttitudeTransform*>()
后面的节点必需是此类型的节点才返回TRUE,
如果()内的节点不是osg:: ositionAttitudeTransform*,必然会错,如osg:: Group(不是ositionAttitudeTransform类型的group),osg:: Geode,osg::Node(不是ositionAttitudeTransform类型的Node);

你添加到场景里的节点是什么结构的你应该很清楚,
   比方说:
osg:: Group*  root=new osg:: Goup;
osg::Node * pNode=osgDB:: readNodeFile("cow.osg")
root->addchild(pNode);
你在拾取时,nodePick = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;J就是拾取的NODE路径最深一层(最底层的节点应该就是pNode,如果这里读入的是其他模型,还要看者个模型本身是不是还有更深的NODE节点链接,这个链接的最底层就是nodePath[nodePath.size()-1])
同理nodePath[nodePath.size()-2],就是最底层节点pNode的父亲节点parentPick ;

你的parentPick-> getParent(0)就是osg:: Group 节点root,这个nodePath链上根本就不存PositionAttitudeTransform,这怎么不出错?

除非你的链接是root-> PositionAttitudeTransformNode-> osg:: Node->osg:: Node这种类似的链接结构,你的
thisNode = dynamic_cast<osg:: PositionAttitudeTransform*>(parentPick->getParent(0));  才可能不出错!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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