查看: 1164|回复: 6

请教拾取的问题,谢谢

[复制链接]

该用户从未签到

发表于 2012-12-14 22:13:37 | 显示全部楼层 |阅读模式
有哪位大侠在mfc下做过osg的拾取,小弟在osgMFC那个例子里增加拾取功能,老是报错,请指点一二,不胜感激!!!

下面是CPickHandler的代码
//////h文件
#pragma once
#include <osgGA/GUIEventHandler>
#include <osgViewer/View>

class CPickHandler :
        public osgGA::GUIEventHandler
{
public:
        CPickHandler(void);
        virtual ~CPickHandler(void);

public:
        float m_fMouseX;
        float m_fMouseY;

public:

        bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);

        void pick( osg::ref_ptr<osgViewer::View> view, float x, float y);


};

/////////cpp文件
#include "StdAfx.h"
#include "ickHandler.h"
#include <osgUtil/LineSegmentIntersector>

CPickHandler::CPickHandler(void)
{
        m_fMouseX = 0;
        m_fMouseY = 0;
}

CPickHandler::~CPickHandler(void)
{
}
bool CPickHandler::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:
                {
                        m_fMouseX = ea.getX();
                        m_fMouseY = ea.getY();
                        break;
                }

        case osgGA::GUIEventAdapter::RELEASE:
                {
                        if ( m_fMouseX==ea.getX() && m_fMouseY == ea.getY() )
                        {
                                pick(view.get(), m_fMouseX, m_fMouseY);
                        }
                        break;
                }

        default:

                break;
        }
        return false;
}

void CPickHandler::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;

                CString ss;
                std::string str = node->getName();
                ss = str.c_str();
                AfxMessageBox(ss);
        }
}

在osg类中增加事件处理器
void cOSG::InitCameraConfig(void)
{
    // Local Variable to hold window size data
    RECT rect;

    // Create the viewer for this window
    mViewer = new osgViewer::Viewer();
       
     //这句注释掉就不报错,打开就报错
   mViewer->addEventHandler(new CPickHandler());

    // Add a Stats Handler to the viewer
    //mViewer->addEventHandler(new osgViewer::StatsHandler);
   
    // Get the current window size
    ::GetWindowRect(m_hWnd, &rect);

   ………………以下省略……………………
}
22222.bmp

该用户从未签到

 楼主| 发表于 2012-12-14 22:15:51 | 显示全部楼层
补充一下,就是把handle函数改为
bool CPickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
        osg::ref_ptr<osgViewer::View> view = dynamic_cast<osgViewer::View*>(&aa);

         return false;
}

同样报错。。。

该用户从未签到

 楼主| 发表于 2012-12-16 18:12:30 | 显示全部楼层
哪位大侠给指点下啊,谢谢了

该用户从未签到

发表于 2012-12-17 08:32:43 | 显示全部楼层
bool CPickHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
        osg::ref_ptr<osgViewer::View> view = dynamic_cast<osgViewer::View*>(&aa);

         return false;
}

这样也能出错 比较奇怪

该用户从未签到

发表于 2012-12-17 10:14:58 | 显示全部楼层
既然错误指向的地址是0,那么您肯定在什么地方用到了空指针,如是

该用户从未签到

 楼主| 发表于 2012-12-17 10:37:41 | 显示全部楼层
谢谢回复,我跟了一下,报错的位置在void cOSG::Render(void* ptr)中的viewer->frame();

该用户从未签到

 楼主| 发表于 2012-12-17 10:39:31 | 显示全部楼层
是怎么回事呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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