查看: 2632|回复: 7

NodeVisitor问题

[复制链接]

该用户从未签到

发表于 2011-10-31 14:49:01 | 显示全部楼层 |阅读模式
各位大神,小弟自己建立一个节点树(其中包含了一个osg::PositionAttitudeTransform节点)。然后将文件写入一个.ive文件中。 最后仿照海军教程上得tank访问器章节申请一个节点访问器去读取.ive文件的节点。编译连接是通过了,但是运行时出现vector iterator not dereferencable错误! 请诸位指点一下!谢谢。代码如下
节点树ive文件代码

  1. int main()
  2. {
  3. osg::ref_ptr<osg::Group> root = new osg::Group;
  4. osg::ref_ptr<osg::Group> car = new osg::Group;
  5. car->addChild(osgDB::readNodeFile("crane\\car.3ds"));
  6. root->addChild(car.get());

  7. osg::ref_ptr<osg::PositionAttitudeTransform> DOF = new osg::PositionAttitudeTransform;

  8. osg::ref_ptr<osg::Group> zhubi = new osg::Group;
  9. zhubi->addChild(osgDB::readNodeFile("crane\\zhubi1.3ds"));

  10. DOF->addChild(zhubi.get());
  11. root->addChild(DOF.get());

  12. osgDB::writeNodeFile(*(root.get()),"crane.ive");

  13. osgViewer::Viewer viewer;
  14. viewer.setSceneData(root.get());
  15. return viewer.run();


  16. }
复制代码


findNodeVisitor.h
  1. #ifndef FIND_NODE_VISITOR_H
  2. #define FIND_NODE_VISITOR_H

  3. #include <osg/NodeVisitor>
  4. #include <osg/Node>

  5. #include <osg/PositionAttitudeTransform>
  6. #include <iostream>
  7. #include <vector>


  8. class findNodeVisitor : public osg::NodeVisitor
  9. {
  10. public:

  11. findNodeVisitor();

  12. findNodeVisitor(const std::string &searchName) ;

  13. virtual void apply(osg::Node &searchNode);
  14. virtual void apply(osg::Transform &searchNode);

  15. void setNameToFind(const std::string &searchName);

  16. osg::Node* getFirst();

  17. typedef std::vector<osg::Node*> nodeListType;

  18. nodeListType& getNodeList() { return foundNodeList; }

  19. private:

  20. std::string searchForName;
  21. nodeListType foundNodeList;

  22. };

  23. #endif
复制代码


findNodeVisitor.cpp
  1. #include "NodeVisitor.h"


  2. findNodeVisitor::findNodeVisitor() : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
  3. searchForName()
  4. {
  5. }


  6. findNodeVisitor::findNodeVisitor(const std::string &searchName) :
  7. osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
  8. searchForName(searchName)
  9. {

  10. }


  11. {
  12. if (searchNode.getName() == searchForName)
  13. {
  14. foundNodeList.push_back(&searchNode);
  15. }
  16. traverse(searchNode);
  17. }


  18. void findNodeVisitor::setNameToFind(const std::string &searchName)
  19. {
  20. searchForName = searchName;
  21. foundNodeList.clear();
  22. }

  23. void findNodeVisitor::apply(osg::Transform &searchNode)
  24. {


  25. osg::PositionAttitudeTransform* dofNode =
  26. dynamic_cast<osg::PositionAttitudeTransform*>(&searchNode);


  27. apply ( (osg::Node&) searchNode);
  28. traverse(searchNode);
  29. }
  30. osg::Node* findNodeVisitor::getFirst()
  31. {
  32. return *(foundNodeList.begin());
  33. }
复制代码


test.cpp
  1. int main()
  2. {
  3. osg::Group* root = new osg::Group();

  4. osg::Group* crane = NULL;

  5. osgViewer::Viewer viewer;

  6. crane = dynamic_cast<osg::Group*>
  7. (osgDB::readNodeFile("crane\\crane1.ive"));

  8. crane->accept( *(new findNodeVisitor("")) );

  9. if( !crane )
  10. {
  11. std::cout<< "could not load crane models" << std::endl;
  12. return -1;
  13. }

  14. root->addChild(crane);


  15. findNodeVisitor findcraneNode ("DOF");

  16. crane->accept(findcraneNode);

  17. osg::PositionAttitudeTransform* craneDOF =
  18. dynamic_cast<osg::PositionAttitudeTransform* >(findcraneNode.getFirst());

  19. if( craneDOF)
  20. {
  21. craneDOF ->setPosition ( osg::Vec3(0.0,0.0,10.0) );
  22. }

  23. viewer.setSceneData( root );
  24. viewer.setCameraManipulator( new osgGA::TrackballManipulator() );
  25. viewer.realize();

  26. while ( !viewer.done() )
  27. {
  28. viewer.frame();
  29. }


  30. }
复制代码

该用户从未签到

发表于 2011-11-1 12:15:52 | 显示全部楼层
各位大神,小弟自己建立一个节点树(其中包含了一个osg::PositionAttitudeTransform节点)。然后将文件写 ...
knightlixiao 发表于 2011-10-31 14:49


诡异

该用户从未签到

发表于 2011-11-1 20:22:16 | 显示全部楼层
请给出运行时的call stack信息

该用户从未签到

 楼主| 发表于 2011-11-1 23:09:25 | 显示全部楼层
回复 3# array

谢谢!call stack信息如下:
  1. > msvcp90d.dll!std::_Debug_message(const wchar_t * message=0x0041fdb8, const wchar_t * file=0x0041fb48, unsigned int line=98) Line 24 C++
  2. jiedianfangwen.exe!std::_Vector_const_iterator<osg::Node *,std::allocator<osg::Node *> >::operator*() Line 98 + 0x14 bytes C++
  3. jiedianfangwen.exe!std::_Vector_iterator<osg::Node *,std::allocator<osg::Node *> >::operator*() Line 340 C++
  4. jiedianfangwen.exe!findNodeVisitor::getFirst() Line 46 + 0x36 bytes C++
  5. jiedianfangwen.exe!main() Line 82 + 0x17 bytes C++
  6. jiedianfangwen.exe!__tmainCRTStartup() Line 586 + 0x19 bytes C
  7. jiedianfangwen.exe!mainCRTStartup() Line 403 C
  8. kernel32.dll!7c817077()
  9. [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
  10. msvcr90d.dll!_mbsnbcpy_l(unsigned char * dst=0xe8f04d8b, const unsigned char * src=0xfffb451c, unsigned int cnt=1390695819, localeinfo_struct * plocinfo=0xfb61abe8) Line 57 + 0x29 bytes C++
  11. 51e04d8b()
复制代码

该用户从未签到

发表于 2011-11-2 09:02:31 | 显示全部楼层
建议可以先写成为osg文件,看看场景树的结构,查看下结构

该用户从未签到

 楼主| 发表于 2011-11-3 16:42:33 | 显示全部楼层
我试过在组装节点树的时候,将每个节点下面都添加入实体模型,还是出现同样的错误。

该用户从未签到

 楼主| 发表于 2011-11-4 16:56:38 | 显示全部楼层
谢谢大家!问题解决终于了。还是我自己建立节点树的时候出现的问题。
以我上面(第一篇代码)建立节点树的方法有问题,因为实际上那个PositionAttitudeTransform节点是没有自己的名字的,(我是写了一个节点属性访问器,去查看我建的节点树的有个节点名称,结果发现原来这个PositionAttitudeTransform节点DOF是没有名字的,只有类名)。后来我就修改建立节点树的代码,在osg::ref_ptr<osg:ositionAttitudeTransform>DOF = new osg::PositionAttitudeTransform 后面加一行代码DOF->setName("DOF").这样这个节点就有名字DOF了,节点访问器也就可以成功找个这个节点了!
谢谢大家的帮助!希望大家以后在用NodeVisitor时注意这个问题。

该用户从未签到

发表于 2012-9-21 23:26:56 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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