查看: 1571|回复: 9

如果一个节点有多个父节点,如何得到每个父节点的名字?

[复制链接]

该用户从未签到

发表于 2012-3-19 22:19:43 | 显示全部楼层 |阅读模式
       在一个选取程序中,想通过模型设置的节点来选取模型, 下面的程序在读取cow.osg总是不能读取在程序中通过setname(targetB),而对于robot.osg则能正确读取,后来发现cow.osg有2个并列的父节点,而总是读取另一个父节点或根节点,不能读取targetB这个节点,当一个节点有多个上级父节点时,该如何处理才能将每个父节点的名字读出来?新手,不知道该如何处理才能读到targetB?请各位大佬帮忙看看,谢谢!
void pick(osg::ref_ptr<osgViewer::View> view, float x, float y)
      {
          osg::ref_ptr<osg::Node> node = new osg::Node();
          osg::ref_ptr<osg::Group> parent = new osg::Group();
            //创建一个线段交集检测函数
                  osgUtil:ineSegmentIntersector::Intersections intersections;
if (view->computeIntersections(x, y, intersections))
   {                          
             for (osgUtil::LineSegmentIntersector::Intersections::iterator iter = intersections.begin(); iter != intersections.end(); iter++)                                                        
         {
         osg::NodePath &np =iter->nodePath;
         std::cout<<"size:"<<np.size()<<iter->nodePath.back()->getName()<<std::endl;
         for(int i=np.size()-1;i>=0;i--)
         {
               osg::Node *nd=dynamic_cast<osg::Node *>(np[i]);
              {
                if (nd->getName () == "targetA")
                {
                    std::cout << "HIT  A!" << std::endl;
                    std::cout <<"node name:"<<nd->getName()<<std::endl ;
                                                                               
                 }
                else if (nd->getName() == "targetB")
                {
                     std::cout <<"node name:"<<nd->getName()<<std::endl ;
                     std::cout << "HIT  B!" << std::endl;
                                                                                                                }
              }
        }
    }

该用户从未签到

发表于 2012-3-20 09:26:00 | 显示全部楼层
getNumParents()以及getParent(i)

该用户从未签到

 楼主| 发表于 2012-3-20 18:40:23 | 显示全部楼层
非常感谢!我试过好象不行,特别是在0sg3.0中,我发现设置的这个节点名好象消失了,断点跟踪np时,就没有targetA这个节点。我是这样设置场景图的:
viewer->setSceneData(root.get());

        root->setName ("root");
    //创建一个节点,读取牛的模型
        osg::Node *nodeB =osgDB::readNodeFile("robot.osg");
        //osg::ref_ptr <osg::Node>nodeA= osgDB::readNodeFile ("robot.osg");
    osg::Node *nodeA= osgDB::readNodeFile ("cessna.osg");

       
        nodeB->setName ("targetB");
        nodeA->setName ("targetA");
       
        //把robot移动开一定距离
        osg::ref_ptr <osg::MatrixTransform>TransformB=new osg::MatrixTransform();
        osg::Matrix t1;
        t1.makeTranslate(osg::Vec3(10.0f,0.0f,0.0f));
        TransformB->setMatrix (t1);
        //TransformB->setMatrix (osg::Matrix::makeTranslate(osg::Vec3(100,0,0)));
        TransformB->addChild (nodeB);
       
        TransformB->setName ("TransformB");
但根节点下的子节点只有:TransformB和cessna.osg,而没有targetA,不知道是什么问题?能否麻烦各位再解答下,多谢!

该用户从未签到

发表于 2012-3-29 17:45:15 | 显示全部楼层
您的代码根本就不全,看不出您把谁设置给root了

该用户从未签到

 楼主| 发表于 2012-4-10 17:19:37 | 显示全部楼层
多谢斑竹!
root->addchild(nodeA);
root->addchild(TransformB);
希望其场景为:root-TransformB-nodeB(TargetB),但实际情况不是这样的。好象与建模时cow.osg和cessna.osg是否有defaulit节点 有关?在程序设计和建模时,能否设置defaulit节点?如何设置呢?能否在指点下,多谢!

该用户从未签到

发表于 2012-4-12 09:56:25 | 显示全部楼层
什么叫做default节点,您遇到了什么问题,场景是什么变化,您预期又是什么。如果没有确切证据的话,不要自己乱下结论

该用户从未签到

 楼主| 发表于 2012-4-12 20:30:21 | 显示全部楼层
不好意思,没有表述清楚。我遇到的问题是:采用nodeB->setName ("targetB")方式对节点命名,并利用LineSegmentIntersector方式pick该命名节点,通过模型的名称来判断是否选取该模型。用了很多模型进行尝试,大都能成功的实现该pick操作,除cow.osg和cessna.osg外。根据跟踪发现在调入cow.osg和cessna.osg时,按照希望场景图应为:root-〉TransformB-〉nodeB(TargetB)—〉cow.osg,但有时TargetB和TransformB是cow.osg的并列节点,有时找不到TargetB节点,不知道是什么原因?另外一个高手告诉我就是在建模时是否有default节点引起的。

该用户从未签到

发表于 2012-4-13 10:11:39 | 显示全部楼层
您依然没有表述清楚,您的场景图是什么样子,求交得到的nodePath就是从父到子排列的,不会有乱入;如果没有求交结果,那么返回结果就是空

该用户从未签到

 楼主| 发表于 2012-4-25 09:47:30 | 显示全部楼层
谢谢!

该用户从未签到

 楼主| 发表于 2012-4-25 09:47:35 | 显示全部楼层
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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