OSG点选事件的基类

原创 2015年07月09日 21:04:08

由于我的例子中有多处需要用到点选操作,我不想对一段代码到处复制粘贴,所以我写了一基类对点选操作进行管理。
其功能有:
1. 管理点选事件的添加和删除操作
2. 管理点选成功后Qt信号的发送
话不多数,上代码。
handleadapter.h

class HandleAdapter : public QObject
{
    Q_OBJECT

public:
    HandleAdapter(GraphicsView* view, QObject* parent = NULL);
    ~HandleAdapter();

    void benginHandle();
    void endHandle();

private slots:
    // 虚函数的实现,有其子类来
    virtual void slotPicked(osg::Vec3d pos){}
    virtual void slotMoveing(osg::Vec3d pos){}

    virtual void slotPickedXYZ(osg::Vec3d pos){}
    virtual void slotMoveingXYZ(osg::Vec3d pos){}

    virtual void slotRightHandle(){}

public:
    GraphicsView* m_pMap3D;
    osg::Group* m_pLayerGroup;
    PickHandle* m_pEventHandle;
};

功能实现如handleadapter.cpp

HandleAdapter::HandleAdapter(GraphicsView* view, QObject* parent/* = NULL*/)
    : m_pMap3D(view), QObject(parent)
{
    m_pLayerGroup = new osg::Group;
    m_pMap3D->getRoot()->addChild(m_pLayerGroup);

    m_pEventHandle = new PickHandle(m_pMap3D->getSRS());
}

HandleAdapter::~HandleAdapter()
{

}

void HandleAdapter::benginHandle()
{
    m_pMap3D->getOSGViewer()->addEventHandler(m_pEventHandle);
    connect(m_pEventHandle, SIGNAL(signalPicked(osg::Vec3d)), this, SLOT(slotPicked(osg::Vec3d)));
    connect(m_pEventHandle, SIGNAL(signalMoving(osg::Vec3d)), this, SLOT(slotMoveing(osg::Vec3d)));
    connect(m_pEventHandle, SIGNAL(signalRightPicked()), this, SLOT(slotRightHandle()));
    connect(m_pEventHandle, SIGNAL(signalPickedXYZ(osg::Vec3d)), this, SLOT(slotPickedXYZ(osg::Vec3d)));
    connect(m_pEventHandle, SIGNAL(signalMovingXYZ(osg::Vec3d)), this, SLOT(slotMoveingXYZ(osg::Vec3d)));
}

void HandleAdapter::endHandle()
{
    disconnect(m_pEventHandle, SIGNAL(signalPicked(osg::Vec3d)), this, SLOT(slotPicked(osg::Vec3d)));
    disconnect(m_pEventHandle, SIGNAL(signalMoving(osg::Vec3d)), this, SLOT(slotMoveing(osg::Vec3d)));
    disconnect(m_pEventHandle, SIGNAL(signalRightPicked()), this, SLOT(slotRightHandle()));
    disconnect(m_pEventHandle, SIGNAL(signalPickedXYZ(osg::Vec3d)), this, SLOT(slotPickedXYZ(osg::Vec3d)));
    disconnect(m_pEventHandle, SIGNAL(signalMovingXYZ(osg::Vec3d)), this, SLOT(slotMoveingXYZ(osg::Vec3d)));
    m_pMap3D->getOSGViewer()->removeEventHandler(m_pEventHandle);
}

好了,点选操作的基本功能就完善了,下面就可以开始进行功能性操作了。请看下一篇,画线。

版权声明:本文为博主原创文章,未经博主允许不得转载。

OSG获取鼠标点选事件的位置

OSG点选操作的思路是从osgGA::GUIEventHandler继承,并重新实现虚函数virtual bool handle(const osgGA::GUIEventAdapter& ea, o...
  • chlk118
  • chlk118
  • 2015年07月08日 22:13
  • 4923

osg点选pick物体

osg已经实现了通过屏幕坐标直接与物体求交的方法。 能得到pick的物体,也能得到坐标。 我希望点击大地形,根据点击的点画出直线。 屏幕坐标与世界坐标的转换都会了,随后实现这个功能。 ...
  • A599677743
  • A599677743
  • 2016年06月29日 14:53
  • 793

OSG学习笔记11 物体控制—对点选物体进行平移、缩放、旋转

使用鼠标点选当前场景中的物体,然后旋转、平移、缩放。 使用了两个自带的Dragger, TrackballDragger实现旋转,选中哪一个环就使物体沿哪个环渲染 TabBoxDragger:盒式拖曳...
  • u011310341
  • u011310341
  • 2016年05月16日 21:29
  • 1911

OSG鼠标选择求交

OSG鼠标选择求交 ////求交方法一:(用WINDOW坐标值,在相机下求交)            //osg::ref_ptr picker = new osgUtil::LineSegmen...
  • tmljs1988
  • tmljs1988
  • 2012年07月31日 14:25
  • 11086

osg例子osgpick的一些知识点的理解

在例子“osgpick”中,有一段类似下面的代码   if (view->computeIntersections(x, y, intersections)) { ...
  • LaineGates
  • LaineGates
  • 2012年03月17日 12:13
  • 4163

OSG 对线或者点组成的模型选取

#include "PickHandler.h" #include "ModelShape.h" #include "DraggerNodeVisitor.h" #include #include ...
  • zhurui3747
  • zhurui3747
  • 2017年08月31日 17:48
  • 122

OSG学习笔记16 - 对点选物体平移(鼠标点选物体)(物体随鼠标移动)(屏幕坐标转世界坐标)

之前的一篇博文是有一篇对点选物体进行平移、缩放旋转。那一篇是很简单的调用了OSG中定义的一些dragger,但这些dragger都有坐标轴或者tapbox等在模型上,与我最近要做的事情的需求不同。网上...
  • u011310341
  • u011310341
  • 2016年11月16日 14:42
  • 1439

osg节点选择

  • 2017年05月02日 18:29
  • 4KB
  • 下载

OSG点选事件的基类

由于我的例子中有多处需要用到点选操作,我不想对一段代码到处复制粘贴,所以我写了一基类对点选操作进行管理。 其功能有: 1. 管理点选事件的添加和删除操作 2. 管理点选成功后Qt信号的发送 话...
  • chlk118
  • chlk118
  • 2015年07月09日 21:04
  • 1608

OSG学习笔记15-OSG中对事件的处理

看了王锐大大的书,我感觉OSG中对事件的处理主要是由以下几块组成的: 1、事件适配器 GUIEventAdapter 这个类是作为系统交互事件和OSG交互事件的适配接口。这一句话还不是很理解。 ...
  • u011310341
  • u011310341
  • 2016年10月10日 20:05
  • 917
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG点选事件的基类
举报原因:
原因补充:

(最多只允许输入30个字)