查看: 1485|回复: 5

对象选取在MFC例子程序的问题。

[复制链接]

该用户从未签到

发表于 2010-7-26 18:57:42 | 显示全部楼层 |阅读模式
  • #include <osgViewer/Viewer>
  • #include <osgViewer/ViewerEventHandlers>
  • #include <osg/Node>
  • #include <osg/Geode>
  • #include <osg/Group>
  • #include <osgDB/ReadFile>
  • #include <osgDB/WriteFile>
  • #include <osgFX/Scribe>
  • #include <osgGA/GUIEventHandler>
  • #include <osgUtil/Optimizer>
  • #include <iostream>
  • //对象选取事件处理器
  • class PickHandler : public osgGA::GUIEventHandler
  • {
  • public:
  •     PickHandler():
  •       _mx(0.0f),
  •       _my(0.0f)
  •       {
  •           //
  •       }
  •       ~PickHandler()
  •       {
  •         //
  •       }
  •         //事件处理函数
  •       bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
  •       {
  •           osg::ref_ptr<osgViewer::View> view = dynamic_cast<osgViewer::View*>(&aa);
  •           if (!view) return false;
  •           switch(ea.getEventType())
  •           {
  •               //鼠标按下
  •           case(osgGA::GUIEventAdapter:USH):
  •               {
  •                   //更新鼠标位置
  •                   _mx = ea.getX();
  •                   _my = ea.getY();
  •                   pick(view.get(), ea.getX(), ea.getY());
  •                   break;
  •               }
  •           case(osgGA::GUIEventAdapter::RELEASE):
  •               {
  •                   if (_mx==ea.getX() && _my==ea.getY())
  •                   {
  •                       //执行对象选取
  •                       //pick(view.get(), ea.getX(), ea.getY());
  •                   }
  •                   break;
  •               }
  •           default:
  •               break;
  •           }
  •           return false;
  •       }
  •         //对象选取事件处理器
  •       void pick(osg::ref_ptr<osgViewer::View> view, float x, float y)
  •       {
  •           osg::ref_ptr<osg::Node> node = new osg::Node();
  •           osg::ref_ptr<osg::Group> parent = new osg::Group();
  •             //创建一个线段交集检测函数
  •           osgUtil:ineSegmentIntersector::Intersections intersections;
  •           if (view->computeIntersections(x, y, intersections))
  •           {
  •               osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
  •               osg::NodePath& nodePath = intersection.nodePath;
  •               //得到选择的物体
  •               node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
  •               parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
  •           }
  •           //用一种高亮显示来显示物体已经被选中
  •           if (parent.get() && node.get())
  •           {
  •               osg::ref_ptr<osgFX::Scribe> parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent.get());
  •               if (!parentAsScribe)
  •               {
  •                   //如果对象选择到,高亮显示
  •                   osg::ref_ptr<osgFX::Scribe> scribe = new osgFX::Scribe();
  •                   scribe->addChild(node.get());
  •                   parent->replaceChild(node.get(),scribe.get());
  •               }
  •               else
  •               {
  •                   //如果没有没有选择到,则移除高亮显示的对象
  •                   osg::Node::ParentList parentList = parentAsScribe->getParents();
  •                   for(osg::Node::ParentList::iterator itr=parentList.begin();
  •                       itr!=parentList.end();
  •                       ++itr)
  •                   {
  •                       (*itr)->replaceChild(parentAsScribe.get(),node.get());
  •                   }
  •               }
  •           }
  •       }
  • public:
  •     //得到鼠标的位置
  •     float _mx ;
  •     float _my;
  • };
  • int main()
  • {
  •     //创建Viewer对象,场景浏览器
  •     osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
  •     viewer->addEventHandler(new PickHandler());
  •     //创建场景组节点
  •     osg::ref_ptr<osg::Group> root = new osg::Group();
  •     //创建一个节点,读取牛的模型
  •     osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
  •     //添加到场景
  •     root->addChild(node.get());
  •     //优化场景数据
  •     osgUtil::Optimizer optimizer ;
  •     optimizer.optimize(root.get()) ;
  •     viewer->setSceneData(root.get());
  •     viewer->realize();
  •     viewer->run();
  •     return 0 ;
  • }


这段程序是用来实现对象选取的,点一下牛就给个白边包上,再点一下就消失了,是从编程指南那本书上copy来的。

然后我把那个PickHandler类加到MFC的例子里,然后在它的InitCameraConfig函数中把这个事件加到viewer中。
  • void cOSG::InitCameraConfig(void)
  • {
  •     // Local Variable to hold window size data
  •     RECT rect;
  •     // Create the viewer for this window
  •     mViewer = new osgViewer::Viewer();
  •     // Add a Stats Handler to the viewer
  •     mViewer->addEventHandler(new osgViewer::StatsHandler);
  • mViewer->addEventHandler(new PickHandler);    // 这行是我加的
  • .....
  • }


程序编译,运行,正常,然后打开模型,就出错。
这是怎么回事?
不过在我另一个MFC程序里,打开模型不出错,选中物体时会出错。这个MFC不过是我自己向导建的,然后把例子的代码原封不动的搬过来,添加了一些功能而已。。。。真是奇怪。

还有。。。。自带的MFC程序有内在泄露?我在debug模式退出的时候,vs2005会提示内在泄露。而我自己向导创建的多文档,然后把它的代码都移植过来的确没有。

该用户从未签到

发表于 2010-7-26 20:11:46 | 显示全部楼层
书中的代码是没有问题的,,您的程序框架有点问题吧,,您设置断点,跟踪一下~~~~~~

该用户从未签到

 楼主| 发表于 2010-7-26 20:44:02 | 显示全部楼层
书中的代码的确没问题,只是不明白为什么放到MFC里就不行了

该用户从未签到

发表于 2013-3-11 19:05:56 | 显示全部楼层
遇到类似问题,有没有解决啊,共享一下?

该用户从未签到

发表于 2013-3-12 07:55:45 | 显示全部楼层
caoze1986 发表于 2013-3-11 19:05
遇到类似问题,有没有解决啊,共享一下?

调试您的程序,我们猜不出来您是怎样去做的

该用户从未签到

发表于 2013-3-12 08:50:13 | 显示全部楼层
还是调试下您的程序吧   这样的话,大神们也都看不出什么问题啦!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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