查看: 1196|回复: 5

节点访问器搜索节点

[复制链接]

该用户从未签到

发表于 2012-3-20 10:15:48 | 显示全部楼层 |阅读模式
本帖最后由 knightlixiao 于 2012-3-20 11:04 编辑

大家好,我用节点访问器去搜索节点的时候,代码如下
findNodeVisitor findobjectNodeover (”name“);
m_Root->accept(findobjectNodeover);
osg::ref_ptr<osg::PositionAttitudeTransform> object =
        dynamic_cast<osg::PositionAttitudeTransform*>(findobjectNodeover.getFirst());


如果m_Root节点下面没有想要搜索的节点程序运行到红色代码段就报错了(原因应该是节点访问器的列表中为空)。但是我想要得效果是如果没有这个节点,程序就自动提示一下没有这个节点,而不是程序直接报错。请问这个有什么方法解决。谢谢。

补充:我在红色代码之前添加了判断条件
if (!findobjectNodeover.getFirst())
{
     AfxMessageBox(_T("没有找到节点"));
}
但是程序运行到这个判断时报错;如下 vector iterator not dereferencable;

谢谢

该用户从未签到

 楼主| 发表于 2012-3-20 11:30:42 | 显示全部楼层
后来了我查看了Flysky的《OSG。。。编程指南》一书中的节点访问器的例子。其中判断条件也是

findNodeVisitor cow("cow.osg");
node->accept(cow);
if (!cow.getFirst())
{
        std::cout<<"无法找到节点"<<std::endl;
}
else
{
        std::cout<<"找到节点"<<std::endl;
}

但是出先的问题是一样的;如果可以找到查找的节点,则程序正常并且可以执行显示“找到节点”;但是如果我想要找的节点是在节点树上没有的节点,则程序报错崩溃,并不能执行显示“无法找到节点”。错误一样: QQ截图20120320105827.png

该用户从未签到

发表于 2012-3-20 12:59:11 | 显示全部楼层
可以把你的 FindNodeVisitor::getFirst () 代码贴出来看看吗?没有找到应该返回 0 或者 NULL

该用户从未签到

 楼主| 发表于 2012-3-20 14:45:20 | 显示全部楼层
本帖最后由 knightlixiao 于 2012-3-20 14:50 编辑
xuganggm 发表于 2012-3-20 12:59
可以把你的 FindNodeVisitor::getFirst () 代码贴出来看看吗?没有找到应该返回 0 或者 NULL



你好,以下是节点访问器的代码,红色的是getFirst()函数。程序运行到getFirst函数中return *(foundNodeList.begin());
就会报错中断。谢谢

findNodeVisitor::findNodeVisitor() : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
                                        searchForName()
{
}

findNodeVisitor::findNodeVisitor(const std::string &searchName) :
                                   osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
                                   searchForName(searchName)
{
}

void findNodeVisitor::apply(osg::Node &searchNode)
{
   if (searchNode.getName() == searchForName)
   {
      foundNodeList.push_back(&searchNode);
   }
   traverse(searchNode);
}

void findNodeVisitor::setNameToFind(const std::string &searchName)
{
   searchForName = searchName;
   foundNodeList.clear();
}

void findNodeVisitor::apply(osg::Transform &searchNode)
{

   apply ( (osg::Node&) searchNode);
   traverse(searchNode);
}

void findNodeVisitor::apply(osg::Geode &geode)
{
        apply( (osg::Node&) geode);
        traverse((osg::Node&) geode);
}
osg::Node* findNodeVisitor::getFirst()
{
   return *(foundNodeList.begin());
}


该用户从未签到

发表于 2012-3-20 14:58:36 | 显示全部楼层
海军教程的实现:
osg::Node* findNodeVisitor::getFirst()
{
   return foundNodeList.empty() ? NULL : foundNodeList[0];
}

该用户从未签到

 楼主| 发表于 2012-3-20 16:37:03 | 显示全部楼层
xuganggm 发表于 2012-3-20 14:58
海军教程的实现:
osg::Node* findNodeVisitor::getFirst()
{

问题解决了,正如您说的。我把GetFirst函数改成这样就OK了。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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