查看: 2101|回复: 10

Pick中删除高亮崩溃

[复制链接]

该用户从未签到

发表于 2010-9-9 09:23:00 | 显示全部楼层 |阅读模式
osgkeyboardmouse实例中的pick类,源代码没有改动,不用原来的Viewer显示,而该用一般的windows窗体,结果第一次选中,能正确高亮,第二次选择,如果是选择新物体,则上次高亮物体没有删除,新选择物体高亮了。如果第二次选择的是上次选择的物体,则崩溃了。请教高手原因!

该用户从未签到

 楼主| 发表于 2010-9-9 09:25:25 | 显示全部楼层
void toggleScribe(osg::Group* parent, osg::Node* node) {
        if (!parent || !node) return;

        std::cout<<"  parent "<<parent->className()<<std::endl;

        osgFX::Scribe* parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent);
        if (!parentAsScribe)
        {
            // node not already picked, so highlight it with an osgFX::Scribe
            osgFX::Scribe* scribe = new osgFX::Scribe();
            scribe->addChild(node);
            parent->replaceChild(node,scribe);
        }
        else
        {
            // node already picked so we want to remove scribe to unpick it.
            osg::Node:arentList parentList = parentAsScribe->getParents();
            for(osg::Node::ParentList::iterator itr=parentList.begin();
                itr!=parentList.end();
                ++itr)
            {
                (*itr)->replaceChild(parentAsScribe,node);//此句崩溃
            }
        }

    }

该用户从未签到

发表于 2010-9-9 11:16:49 | 显示全部楼层
toggleScribe的执行是在什么地方?一定要放在回调或者GUIEventHandler中,以避免产生线程冲突

该用户从未签到

 楼主| 发表于 2010-9-13 11:17:57 | 显示全部楼层
在GUIEventHandler中执行

该用户从未签到

发表于 2010-9-13 16:20:51 | 显示全部楼层
您也许需要提前设置了parent节点的DYNAMIC属性,不过我个人不太建议用这种危险的替换节点的方法来实现高亮。用一个setEnabled()来关闭特效,或者用自定义的Scribe节点,这应当都是更为推荐的方式

该用户从未签到

 楼主| 发表于 2010-9-16 16:20:38 | 显示全部楼层
parent节点的DYNAMIC属性已经设置,线程模式也设置成单线程了,还是不能解决。请教您说的自定义Scribe或者setEnabled()是什么意思?
是建立一个新的高亮节点,将原节点隐藏吗?

该用户从未签到

发表于 2010-9-17 09:20:13 | 显示全部楼层
setEnabled就是Effect节点的方法,直接scribe->setEnabled()就可以。如果您设置成单线程都会有错误,那么我更相信您还有别的什么代码在这里产生影响,但是您并没有提及

该用户从未签到

发表于 2012-10-11 13:02:14 | 显示全部楼层
array 发表于 2010-9-17 09:20
setEnabled就是Effect节点的方法,直接scribe->setEnabled()就可以。如果您设置成单线程都会有错误,那么我 ...

你好,我按照个人对您的回复的理解,把else中代码//(*itr)->replaceChild(parentAsScribe.get(),node.get());改成这样                                                        
osg::ref_ptr<osgFX::Effect>eff=dynamic_cast<osgFX::Effect*>(parentAsScribe.get());
eff->setEnabled(able);
able=!able;
虽然可以取消选中,没有栈溢出等异常,但是不能再次选中了.

其中bool able=false;位于if()之前。不知道为什么呢?

该用户从未签到

发表于 2012-10-12 08:33:58 | 显示全部楼层
逻辑问题

该用户从未签到

发表于 2012-10-12 09:34:21 | 显示全部楼层
liuzhiyu123 发表于 2012-10-12 08:33
逻辑问题

什么意思,逻辑有问题么?我写的是able=!able;不就该可以了吗?

该用户从未签到

发表于 2013-9-29 10:57:09 | 显示全部楼层
非常的不错的啊,我进来职场以啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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