查看: 947|回复: 5

选定模型改变颜色的问题,nodevisitor只能对应一个节点

[复制链接]

该用户从未签到

发表于 2014-5-8 21:18:54 | 显示全部楼层 |阅读模式
本帖最后由 nononono 于 2014-5-9 17:56 编辑

请教高手

  1. case osgGA::GUIEventAdapter::DOUBLECLICK:
  2.         {
  3.             if(ea.getButton()==1){
  4.                 osgUtil::LineSegmentIntersector::Intersections hits;

  5.                     if(node!=NULL){//*************************************//
  6.                         extractor.setColor(0.0f, 0.0f, 0.0f);
  7.                         node->accept(extractor);
  8.                     }

  9.                     if(view->computeIntersections(ea.getX(),ea.getY(),hits)){
  10.                         osgUtil::LineSegmentIntersector::Intersection intersection = *hits.begin();
  11.                         osg::NodePath& nodePath = intersection.nodePath;
  12.                         node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;       

  13.                         if(parent.get()&&node.get()){
  14.                             extractor.setColor(1.0f, 0.0f, 0.0f);
  15.                             node->accept(extractor);
  16.                         }
  17.                    }
  18.               }
  19.         }
  20.         break;
复制代码


想要实现这样一个功能:1.双击选定一个模型的时候改变他的颜色。
                                       2.如果选定这个模型之前选择过另一个模型,那么把这个已经选择过的模型颜色换成黑色。
                                       3.如果双击没有选中任何模型,则把之前选中的变黑。
使用nodevisitor来改变模型的颜色,代码中的extractor是nodevisitor的一个实例。
现在的状况是,功能1和3都可以完成,但是2却不能实现。
在已经选定一个模型的情况下,如果再选一个新的,那么新选的会变色,而旧选的不会变黑。

感觉问题应该就出在很简单的地方,但就是搞不出来。node指针在双击求交成功之后,确确实实是转而指向了另一个模型。为什么实现功能3的时候星号标记处的代码能工作,但是实现功能2的时候就不起作用呢。

该用户从未签到

发表于 2014-5-8 22:05:07 | 显示全部楼层
你这里公用一个nodevisitor对象。
如果nodevisitor不是马上生效(猜测啊),下一帧来临时,nodevisitor只保留了最后的Node对象。
应该就会出现你所说的现象。

为每一个Node对象定义nodevisitor对象!
不妨试一下啊!

该用户从未签到

发表于 2014-5-8 22:23:43 | 显示全部楼层
刚才看了下nodevisitor的一般实现,应该是立即生效啊
不知道你是怎么自定义的nodevisitor
检查下你的访问器生效机制吧!

该用户从未签到

发表于 2014-5-8 22:29:27 | 显示全部楼层
应该这样回答你
{
你这里共用一个nodevisitor对象。
如果你自定义的nodevisitor不是马上生效(猜测啊),
生效时nodevisitor只处理最后保留的Node对象,
应该就会出现你所说的现象。
}

该用户从未签到

 楼主| 发表于 2014-5-8 23:20:45 | 显示全部楼层
cenfer 发表于 2014-5-8 22:29
应该这样回答你
{
你这里共用一个nodevisitor对象。

非常感谢这位大哥提醒,我去关注一下nodevisitor

该用户从未签到

 楼主| 发表于 2014-5-9 17:55:50 | 显示全部楼层
确实如ls大哥所说,为每个node分配了单独的nodevisitor后,三个效果都可以完成了
我的理解是,nodevisitor遍历完一个节点后,会保存对这个节点的修改以便在下一次帧刷新时提交。连续让两个节点accept遍历器,那么遍历器只能保存最近的对节点的修改,提交进行渲染
可能理解的不是很准确
反正就是 it works!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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