查看: 745|回复: 1

下面的拾取高亮代码有什么问题,为什么会报map/set iterator not incrementable

[复制链接]

该用户从未签到

发表于 2014-5-5 16:39:25 | 显示全部楼层 |阅读模式
用EventHandler来实现点击选中并且高亮节点,拾取函数如下。
在多次点击拾取模型中的节点之后可能报错,需要的点击次数不固定,有时5次就报错,有时20次左右才报错;只在Debug模式下报错,Release下从来不报错。
报错信息见下图:
  1. void CPickHandler::Pick(float x, float y)
  2. {
  3.         static osg::ref_ptr<osg::Group> m_selected = new osg::Group();
  4.         static osg::ref_ptr<osg::Material> m_material = new osg::Material();
  5.         m_material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.f, 0.f, 0.f, 1.f));
  6.        
  7.         while(m_selected->getNumChildren() > 0)
  8.         {
  9.                 osg::ref_ptr<osg::Node> node = m_selected->getChild(0);
  10.                 node->getOrCreateStateSet()->removeAttribute(m_material.get());
  11.                 m_selected->removeChild(node.get());
  12.         }
  13.        
  14.         osgUtil::LineSegmentIntersector::Intersections intersections;
  15.         if(m_Viewer->computeIntersections(x, y, intersections))
  16.         {
  17.                 osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
  18.                 if (hitr != intersections.end() && !hitr->nodePath.empty())
  19.                 {
  20.                         osg::ref_ptr<osg::Node> node = hitr->nodePath.back();
  21.                        
  22.                         osg::StateSet * stateset = node->getOrCreateStateSet();
  23.                         stateset->setAttribute(m_material.get(), osg::StateAttribute::ON/* | osg::StateAttribute::OVERRIDE*/);

  24.                         m_selected->addChild(node.get());
  25.                 }
  26.         }
  27. }
复制代码

9`Y)401UR9TU~E8}54XB(XC.jpg

该用户从未签到

发表于 2014-5-16 17:07:08 | 显示全部楼层
那么显然您应该调试一下,在call stack里面找到可能出错的代码然后了解原因
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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