OSG结点的父子索引变化

来源:互联网 发布:免费的读书软件 编辑:程序博客网 时间:2024/05/16 17:17

最近在做Osg的相关项目研发,在大场景下结点自然会多,结点的操作也就会带来很多问题。写这篇文章的目的就是希望可以帮助Osg研发工作者节省一些时间,好的,进入正题。谢谢观看,如有问题,请给予指正。

        首先,要知道对定义的Osg结点new了或对它们赋值了,它们就在内存中真实存在了,Osg结点在内存中都有一系列的数据,包括结点名字、结点的所有父亲的地址、结点所有孩子的地址、及它们的索引等等。

 

情形1、osg::ref_ptr<osg::Group>类型结点root,root下加三个孩子osg::ref_ptr<osg::Node>类型结点node1、node2、node3,程序会按加的顺序记录索引,此时root会记录node1、node2、node3分别为孩子0、1、2,node1、node2、node3也都会记录root为它们的父亲0,这是最基本的情况,想必大家都是知道的。

 

情形2、在情形1的情况下,假设node1下面还有一些孩子结点,也就是node1为一树,使用root->removeChild(node1); ///移除root下的node1结点,node1的树关系不会变 

removeChild函数会解除父子关系,对于root,root会把node1在自身内存数据判断查找,找到后识别为孩子0索引,删除所有其相关信息,然后对孩子索引重排,重排按照后续孩子前后关系不变的原则,node2变为root孩子0,node3变为root孩子1。对于node1,它会删除记录的父亲root的信息,变为无父亲,但记住,只要没有对node1指针清零,这个节点的数据还是存在的,还可以再次利用。

 

情形3、在情形1的情况下,定义类型osg::ref_ptf<osg::MatrixTransform>的transform变化结点。

操作 root->replaceChild(node1, transform) ///想当先调用root->removeChild(node1);再调用root->addChild(transform)

          ///也就是root下node2为0孩子,node3为1孩子,transform为2孩子。

         tansform->addChild(node1); ///node1的父亲0为transform,假设node1还有其他父节点,那么结果就是tansform是其最后一个父亲了。

经常使用这两段代码对场景根下的某个结点进行位置变换,所以,使用孩子取代函数replaceChild并不是对被取代结点和取代结点进行简单的替换,而是每进行一次这样的操作会把取代结点transform作为root根节点的最后一个孩子索引,被取代节点node1也是把取代结点作为最后一个父亲。

 

情形4、当执行了view->setSceneData(root); 之后root结点丛没有父亲变为有一个父亲,类型就是Osg的照相机结点osg::Camera。

     当程序中要显示多个窗口时,会定义多个osg::ref_ptr<osgViewer::Viewer>类型变量,可能多个场景照相机指向同个结点,所以不要忘了osg::Camera结点在其中的参与的索引变化。

0 0
原创粉丝点击