查看: 2360|回复: 14

removeChildren()出现中断,求解决!

[复制链接]

该用户从未签到

发表于 2010-11-23 17:02:27 | 显示全部楼层 |阅读模式
初始化时root节点添加了一个MatrixTransform节点mt,然后在mt下添加了两个MatrixTransform节点mt1,mt2。
然后添加了一个osgGA::NodeTackerManulator nt;nt->setTrackNode(mt1)

结束时在节点mt的“更新回调”中执行清除子节点:mt->removeChildren(0, mt->getNumChildren);

问题:在执行到清除子节点语句时,出现中断。
怀疑是没有去掉nt对mt1的引用,添加了viewer->setCameraManipulator(NULL),问题依然存在。
如果没有nt->setTrackNode(mt1)操作,则程序正常。我想问下时我清除NodeTackerManulator对mt1节点的引用方法不对么?还应该怎么清除呢?

该用户从未签到

发表于 2010-11-23 17:17:13 | 显示全部楼层
  1. mt->removeChildren(0, mt->getNumChildren);
复制代码
  1. viewer->setCameraManipulator(NULL)
复制代码
我想能了解您进行这两个操作的先后顺序和时机应该会更有利于判断问题

该用户从未签到

 楼主| 发表于 2010-11-23 17:28:20 | 显示全部楼层
viewer->setCameraManipulator(NULL)在前,然后mt->removeChildren(0, mt->getNumChildren);

该用户从未签到

发表于 2010-11-23 23:00:49 | 显示全部楼层
应该和nt对mt1的引用没有直接关系吧,只是解除了mt和mt1之间的父子关系而已.
mark一下,我也想知道答案!

该用户从未签到

发表于 2010-11-24 08:32:20 | 显示全部楼层
我倒觉得您直接NodeTackerManulator->setTrackerNode(NULL)也许会更妥当一些

该用户从未签到

 楼主| 发表于 2010-11-24 11:27:28 | 显示全部楼层
我也这样处理了
NodeTackerManulator->setTrackerNode(NULL);
viewer->setCameraManipulator(NULL) ;
mt->removeChildren(0, mt->getNumChildren);

这个时候中断出现在viewer->setCameraManipulator(NULL) ;
很是费解~~去掉开始时的viewer->setCameraManipulator(NULL) ;程序是正常的,所以问题还是在删除物体前的引用消除问题

该用户从未签到

 楼主| 发表于 2010-11-24 19:07:39 | 显示全部楼层
array,还可能有哪里有问题呢~~

该用户从未签到

 楼主| 发表于 2010-11-24 19:51:08 | 显示全部楼层
我单步调试,运行到:
osg::ref_ptr<osgGA::NodeTrackerManipulator> nodeTrack=dynamic_cast<osgGA::NodeTrackerManipulator*>(viewer->getCameraManipulator());
中断。这句话有啥问题呢?

该用户从未签到

发表于 2010-11-24 20:36:16 | 显示全部楼层
我也碰到过类似的问题,应该是在这句之前就出了问题,所以这里通不过. 也就是getCameraManipulator()所得到的东西可能就已经不对了。

该用户从未签到

发表于 2010-11-25 09:16:05 | 显示全部楼层
您这些动作都是在什么地方完成的

该用户从未签到

 楼主| 发表于 2010-11-25 10:42:59 | 显示全部楼层
本帖最后由 tianxiao888 于 2010-11-25 10:46 编辑

to aaa: 有可能,但是得到的nodeTrack的值是正确的,跟一开始定义加入到viewer的nodeTrack相等。

to array:这些动作都是在mt的更新回调里完成的~

该用户从未签到

发表于 2010-11-25 16:06:12 | 显示全部楼层
我想您还是给出一个可以看出问题的小程序比较直接,这样猜您的做法,的确比较费力

该用户从未签到

 楼主| 发表于 2010-11-25 16:36:50 | 显示全部楼层
嗯,我看能整理出来不

该用户从未签到

 楼主| 发表于 2010-11-26 14:54:57 | 显示全部楼层
突然发现,我是在节点mt的更新回调里对viewer的matrixManipulator进行了操作,这个是不是不允许啊?

该用户从未签到

 楼主| 发表于 2010-11-26 15:42:11 | 显示全部楼层
问题解决了呢。
解决方法:
     节点的更新回调中不能对viewer进行MatrixManipulator的更改操作,需要把对viewer的操作移动到viewer的时间处理或者回调中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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