查看: 1570|回复: 6

子节点更换父节点

[复制链接]

该用户从未签到

发表于 2012-3-1 16:39:02 | 显示全部楼层 |阅读模式
有个问题请教各位。我建了个节点树如下
              root
              /     \
         PAT1   PAT2
             |        |
          MT1
            

其中MT1->setMatrix(osg::Matrix::scale(osg::Vec3(l,w,h)));
       MT1->addChild(osg::readNodeFile("..."))
我想在想把这个MT1节点重PAT1下去掉,然后挂到PAT2节点下面,请问这个应该怎么处理呢?(注意,其中MT1换过去后放缩的值也不能改变,就是说模型仍然是经过放缩的那么大);
谢谢!

该用户从未签到

发表于 2012-3-1 20:25:55 | 显示全部楼层
用指针保存你想换的节点,然后先remove再addchild就是了

该用户从未签到

发表于 2012-3-2 16:22:02 | 显示全部楼层
在节点回调中操作即可~

该用户从未签到

发表于 2012-3-2 21:10:04 | 显示全部楼层
直接摘除添加就可以了

该用户从未签到

 楼主| 发表于 2012-3-3 10:15:34 | 显示全部楼层
哦,谢谢大家,我试试。

该用户从未签到

 楼主| 发表于 2012-3-3 16:40:11 | 显示全部楼层
我是想做一个起重机吊东西的动作,用路径动画做的。1、首先吊装物在一个Group节点上,当起重机开始吊装的时候,将吊装物从Group节点上移到起重机节点下面。2、当起重机所有动作做完之后再将吊装物移回那个Group节点下面。
我使用了节点访问器。1、当访问到起重机节点,再访问吊装物节点,然后将吊装物节点移到起重机节点下面。2、当整个起重机的动作完成(回调那段函数结束),则再访问到吊装物节点,将其移到Group节点下面。不知道这样的思路是否正确。

代码如下:
第一部分是起重机的回调,我把起重机分成各个部分做了刚体动画然后回调的
        //转台回调
        findNodeVisitor findcraneNode1 ("DOF1");
        mp_Crane->accept(findcraneNode1);
        osg:ositionAttitudeTransform* zhuantaiDOF =
                dynamic_cast<osg::PositionAttitudeTransform* >(findcraneNode1.getFirst());
        if( zhuantaiDOF)
        {
                path1->setLoopMode(osg::AnimationPath::NO_LOOPING);
                zhuantaiDOF->setUpdateCallback(new osg::AnimationPathCallback(path1));
        }

        //主臂回调
        findNodeVisitor findcraneNode2 ("DOF2");
        mp_Crane->accept(findcraneNode2);
        osg::PositionAttitudeTransform* zhubiDOF =
                dynamic_cast<osg::PositionAttitudeTransform* >(findcraneNode2.getFirst());
        if( zhubiDOF)
        {
                path2->setLoopMode(osg::AnimationPath::NO_LOOPING);
                zhubiDOF->setUpdateCallback(new osg::AnimationPathCallback(path2));
        }

        //吊索(显)回调
        findNodeVisitor findcraneNode3 ("DOF3");
        mp_Crane->accept(findcraneNode3);
        osg::PositionAttitudeTransform* diaosuoXDOF =
                dynamic_cast<osg::PositionAttitudeTransform* >(findcraneNode3.getFirst());

        if( diaosuoXDOF)
        {
                path3->setLoopMode(osg::AnimationPath::NO_LOOPING);
                diaosuoXDOF->setUpdateCallback(new osg::AnimationPathCallback(path3));
        }

        //吊索(隐)回调
        findNodeVisitor findcraneNode33 ("DOF33");
        mp_Crane->accept(findcraneNode33);
        osg::PositionAttitudeTransform* diaosuoYDOF =
                dynamic_cast<osg::PositionAttitudeTransform* >(findcraneNode33.getFirst());
        if( diaosuoYDOF)
        {
                findNodeVisitor findobjectNode (name);  // 找到相应的吊装物
                mp_Object->accept(findobjectNode);
                osg::PositionAttitudeTransform* object1 =
                        dynamic_cast<osg::PositionAttitudeTransform*>(findobjectNode.getFirst());
                if (object1)
                {
                        osg::ref_ptr<osg::PositionAttitudeTransform> ObjectTime =
                                                        new osg::PositionAttitudeTransform;
                        ObjectTime = object1;
                        mp_Object->asGroup()->removeChild(object1);
                        diaosuoYDOF->asGroup()->addChild(ObjectTime.get()); //将吊装物节点移到起重机节点下面

                        path33->setLoopMode(osg::AnimationPath::NO_LOOPING);
                        diaosuoYDOF->setUpdateCallback(new osg::AnimationPathCallback(path33));//起重机一部分回调

                        path4->setLoopMode(osg::AnimationPath::NO_LOOPING);
                        object1->setUpdateCallback(new osg::AnimationPathCallback(path4));//吊装物回调
                }
        }

第二部分代码,是当以上动作完成之后,就是讲吊装物节点放回的函数
               findNodeVisitor findobjectNodeover (name);
        mp_Crane->accept(findobjectNodeover);
        osg::PositionAttitudeTransform* object1over =
                dynamic_cast<osg::PositionAttitudeTransform*>(findobjectNodeover.getFirst());
        if (object1over)
        {
                osg::ref_ptr<osg::PositionAttitudeTransform> ObjectTime =
                                        new osg::PositionAttitudeTransform;
                ObjectTime = object1over;
                mp_Crane->asGroup()->removeChild(object1over);   
                mp_Object->asGroup()->addChild(ObjectTime.get());               
        }

麻烦看一下,不知道思路是否有问题。因为我是想做多个吊装物的吊装过程。吊一个之后,选择第二个吊装物的时候好像第一个吊装物并没有从起重机节点上移除,而是莫名奇妙的消失了。谢谢大家

该用户从未签到

发表于 2012-3-5 09:34:18 | 显示全部楼层
一般来说这是您自己的代码的逻辑问题而已,请仔细检查
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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