查看: 1359|回复: 3

NodeVisitor里面可以调整场景结构吗?

[复制链接]

该用户从未签到

发表于 2009-9-18 23:47:58 | 显示全部楼层 |阅读模式
我写了一段代码 用一个NodeVisitor来将场景中的所有Scribe去掉 代码如下:
  1. void ClearSelectionNodeVisitor::apply(Node& node){
  2.     Node::ParentList parentList=node.getParents();
  3.     for(Node::ParentList::iterator it=parentList.begin();
  4.         it!=parentList.end();++it){
  5.         Group* gp=*it;
  6.         Scribe* parent=dynamic_cast<Scribe*>(gp);
  7.         if(gp&&parent)
  8.         {            
  9.             Node::ParentList ancestorList=gp->getParents();
  10.             for(Node::ParentList::iterator ast=ancestorList.begin();
  11.                 ast!=ancestorList.end();++ast){
  12.                     (*ast)->replaceChild(gp,&node);
  13.             }
  14.             it=parentList.begin ();
  15.         }
  16.     }
  17.     traverse(node);
  18. }
复制代码
基本算法如下:
1.找到当前节点的所有父节点
2.如果其中某一个为Scribe, 那么找到这个Scribe的所有父节点,然后用当前节点替换Scribe.

在离开这个函数后 系统挂掉了.根据我的推测是因为我修改了场景导致系统中某个结构(比如某个iterator)出现异常了.

这段代码有什么问题吗?

该用户从未签到

 楼主| 发表于 2009-9-18 23:59:18 | 显示全部楼层
VisitorType和TRAVERSE model的设置为:
NodeVisitor::UPDATE_VISITOR和NodeVisitor::TRAVERSE_ALL_CHILDREN

该用户从未签到

发表于 2009-9-19 00:02:20 | 显示全部楼层
在回调中完成访问器的访问,并且注意设置节点的DYNAMIC属性,应当没有问题

该用户从未签到

发表于 2009-9-19 10:48:08 | 显示全部楼层
我去掉Scribe,用的是removeChilad,没用replaceChild
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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