查看: 2934|回复: 4

移植《OSG三维渲染引擎编程指南》中PickHandler例子时出错

[复制链接]

该用户从未签到

发表于 2010-4-13 21:31:24 | 显示全部楼层 |阅读模式
RT,在往MFC框架的OSG程序中移植《OSG三维渲染引擎编程指南》280页中的PickHandler例子时,在eventTraversal()时的:
for(EventHandlers::iterator hitr = _eventHandlers.begin();
     hitr!=_eventHandlers.end();
     ++hitr)
{
    (*hitr)->handleWithCheckAgainstIgnoreHandledEventsMask(*event, *this,0,0);
}
红色部分出现了断言失败,提示:
_DEBUG_ERROR("list iterator not incrementable")

感觉是在用:
mViewer->addEventHandler(new CPickHandler(updatetext.get()))
添加事件响应时未成功导致的,不知道这样描述各位高人能不能看出问题出在哪里?还望指教!

该用户从未签到

发表于 2010-4-14 08:18:43 | 显示全部楼层
至少我个人看不出什么端倪~~不知道您是不是试图动态删除或添加什么对象

该用户从未签到

 楼主| 发表于 2010-4-14 10:39:42 | 显示全部楼层
本帖最后由 edisonsuper 于 2010-4-14 10:44 编辑

2# array
并没有删除操作,这个例子在控制台中运行正常,只是想把它移植到ViewerMFC的那个例子里面时运行出错

原控制台主函数如下:
  1. osg::ref_ptr<osgViewer::Viewer>viewer = new osgViewer::Viewer();
  2. osg::ref_ptr<osg::Group>root = new osg::Group();

  3. osg::ref_ptr<osg::Node>node = osgDB::readNodeFile("D:/vpb/M.osga");

  4. osg::ref_ptr<osgText::Text>updatetext = new osgText::Text();
  5. CreateHUD * hudText = new CreateHUD();
  6. root->addChild(node.get());
  7. root->addChild(hudText->createHUD(updatetext.get()));

  8. viewer->addEventHandler(new CPickHandler(updatetext.get()));
  9. osgUtil::Optimizer optimizer;
  10. optimizer.optimize(root.get());
  11. viewer->setSceneData(root.get());
  12. viewer->realize();
  13. viewer->run();
复制代码
ViewerMFC中的调用如下:

  1. InitSceneGraph();
  2. InitCameraConfig();
复制代码
其中:

  1. void CiMaster::InitSceneGraph(void)
  2. {
  3. // Init the main Root Node/Group
  4. mRoot  = new osg::Group;
  5. // Load the Model from the model name
  6. setlocale(LC_ALL , "chs");
  7. mModel = osgDB::readNodeFile(m_ModelName);


  8. // Optimize the model
  9. osgUtil::Optimizer optimizer;
  10. optimizer.optimize(mModel.get());
  11. optimizer.reset();
  12. // Add the model to the scene
  13. mRoot->addChild(mModel.get());
  14. }

  15. void CiMaster::InitCameraConfig(void)
  16. {
  17. // Local Variable to hold window size data
  18. RECT rect;
  19. // Create the viewer for this window
  20. mViewer = new osgViewer::Viewer();
  21. // Add a Stats Handler to the viewer
  22. mViewer->addEventHandler(new osgViewer::StatsHandler);

  23. /////////////////////////////////////////////////////////////////////////////
  24. //修改部分
  25. //pickhandler
  26. osg::ref_ptr<osgText::Text>updatetext = new osgText::Text();
  27. CreateHUD * hudText = new CreateHUD();
  28. mRoot->addChild(hudText->createHUD(updatetext.get()));
  29. CPickHandler* pickhandler = new CPickHandler(updatetext.get());
  30. pickhandler->setDataVariance(osg::Object:ataVariance:YNAMIC);
  31. mViewer->addEventHandler(pickhandler);
  32. //mViewer->addEventHandler(new CPickHandler(updatetext.get()));
  33. mViewer->addEventHandler(new osgViewer::HelpHandler);
  34. /////////////////////////////////////////////////////////////////////////////

  35. // Get the current window size
  36. ::GetWindowRect(m_hWnd, &rect);
  37. // Init the GraphicsContext Traits
  38. osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
  39. // Init the Windata Variable that holds the handle for the Window to display OSG in.
  40. osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
  41. // Setup the traits parameters
  42. traits->x = 0;
  43. traits->y = 0;
  44. traits->width = rect.right - rect.left;
  45. traits->height = rect.bottom - rect.top;
  46. traits->windowDecoration = false;
  47. traits->doubleBuffer = true;
  48. traits->sharedContext = 0;
  49. traits->setInheritedWindowPixelFormat = true;
  50. traits->inheritedWindowData = windata;
  51. // Create the Graphics Context
  52. osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  53. // Init a new Camera (Master for this View)
  54. osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  55. // Assign Graphics Context to the Camera
  56. camera->setGraphicsContext(gc);
  57. // Set the viewport for the Camera
  58. camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
  59. // Add the Camera to the Viewer
  60. mViewer->addSlave(camera.get());
  61. // Add the Camera Manipulator to the Viewer
  62. mViewer->setCameraManipulator(keyswitchManipulator.get());
  63. // Set the Scene Data
  64. mViewer->setSceneData(mRoot.get());
  65. // Realize the Viewer
  66. mViewer->realize();
  67. // Correct aspect ratio
  68. double fovy,aspectRatio,z1,z2;
  69. mViewer->getCamera()->getProjectionMatrixAsPerspective(fovy,aspectRatio,z1,z2);
  70. aspectRatio=double(traits->width)/double(traits->height);
  71. mViewer->getCamera()->setProjectionMatrixAsPerspective(fovy,aspectRatio,z1,z2);

  72. }
复制代码
是这样的调用方式有问题吗,多谢指导!

该用户从未签到

发表于 2010-4-14 12:32:06 | 显示全部楼层
我不知道CPickHandler的具体内容是什么,不过您可以注意一下updatetext是否是被动态改变的:如果是的话,它也要设置为DYNAMIC。此外,一个好的调试方法是暂时屏蔽addEventHandler(CPickHandler)一行,如果程序可以运行的话,那么可能是这个类的代码本身存在问题

该用户从未签到

发表于 2011-8-11 21:46:58 | 显示全部楼层
我移植这个例子的时候也出现相同的问题了,不知道你们当时是怎么解决的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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