QT + OSG实现触屏旋转和双指缩放

33 篇文章 4 订阅
22 篇文章 0 订阅
1、为了能够触发触屏事件,需要将窗口属性设为Qt::WA_AcceptTouchEvents
setAttribute(Qt::WA_AcceptTouchEvents);

2、重新实现event

bool OsgContainer::event(QEvent *event)
{
    QEvent::Type type = event->type();
    if(type != QEvent::TouchBegin && type != QEvent::TouchUpdate && type != QEvent::TouchEnd) return QOpenGLWidget::event(event);
    QList<QTouchEvent::TouchPoint> touchPoints = static_cast<QTouchEvent *>(event)->touchPoints();
    debug() << "type:" << type << " size:" <<touchPoints.size();
    if(touchPoints.size() == 1) {
        mouse_touch = false;
        return true;
    }
    switch(type) {
    case QEvent::TouchBegin:{
        event->accept();
        mouse_touch = true;
        qreal v_x = touchPoints.at(1).pos().x() - touchPoints.at(0).pos().x();
        qreal v_y = touchPoints.at(1).pos().y() - touchPoints.at(0).pos().y();
        mouse_point_distance = qSqrt(v_x * v_x + v_y * v_y);
        return true;
    }
    case QEvent::TouchUpdate:{
        event->accept();
        qreal u_x = touchPoints.at(1).pos().x() - touchPoints.at(0).pos().x();
        qreal u_y = touchPoints.at(1).pos().y() - touchPoints.at(0).pos().y();
        qreal u_distance = qSqrt(u_x * u_x + u_y * u_y);
        osg::ref_ptr<osg::MatrixTransform> link_base = this->getRoot()->getChild(0)->asTransform()->asMatrixTransform();
        if(u_distance > mouse_point_distance){
            qreal scale = (u_distance - mouse_point_distance)/width() > 0.1 ? 0.1 : (u_distance - mouse_point_distance)/width();
            link_base->setMatrix(osg::Matrix::scale(1 + scale, 1 + scale, 1 + scale) * link_base->getMatrix());
        } else {
            qreal scale = (mouse_point_distance -u_distance)/width() > 0.1 ? 0.1 : (mouse_point_distance -u_distance)/width();
            link_base->setMatrix(osg::Matrix::scale(1-scale, 1-scale, 1-scale) * link_base->getMatrix());
        }

        return true;
    }
    case QEvent::TouchEnd:{
        event->accept();
        mouse_point_distance = 0;
        mouse_touch = false;
        return true;
    }
    default:
        return QOpenGLWidget::event(event);
    }
}

3、重新实现鼠标press和move事件

void OsgContainer::mousePressEvent(QMouseEvent *event)
{
    int button = 0;
    osg::ref_ptr<osg::Vec3dArray> pVec3dArray = new osg::Vec3dArray();
    switch (event->button()) {
    case Qt::LeftButton: {
        button = 1;
        last_x = event->x();
        last_y = event->y();
        pick_earth = true;
        break;
    }
    case Qt::MidButton: button = 2; break;
    case Qt::RightButton: button = 3; break;
    case Qt::NoButton: button = 0; break;
    default: button = 0; break;
    }
    setKeyboardModifiers(event);
    window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
    update();
}

void OsgContainer::mouseMoveEvent(QMouseEvent *event)
{
    if(pick_earth && !mouse_touch && (qAbs(event->x() - last_x) > qAbs(event->y() - last_y))) {
        osg::ref_ptr<osg::MatrixTransform> link_base = this->getRoot()->getChild(0)->asTransform()->asMatrixTransform();
        link_base->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians((double)((event->x() - last_x) * 0.1)),0.0, 0.0, 1.0)
                             * link_base->getMatrix());
    }
    setKeyboardModifiers(event);
    QOpenGLWidget::mouseMoveEvent(event);
    update();
}

 

安装QtOSGEarth可以按照以下步骤进行操作: 1. 首先,在Qt官网(https://www.qt.io/)上下载适用于您的操作系统的Qt安装包。根据您的需求选择相应的版本和组件进行安装。 2. 安装Qt时,您可以选择使用在线安装程序或离线安装包。如果有网络连接,建议选择在线安装程序,以便自动下载和安装所需的文件和组件。 3. 在安装过程中,选择合适的安装路径,并确保勾选安装所需的Qt模块。根据您项目的需求,可能需要额外安装Qt Creator等组件。 4. 完成Qt的安装后,您可以打开Qt Creator,创建新的项目,并选择合适的项目模板。 5. 接下来,下载OSGEarth的源代码。您可以在OSGEarth的GitHub页面(https://github.com/gwaldron/osgearth)上找到最新的源代码。 6. 在终端或命令行中,切换到OSGEarth源代码的目录,并执行编译和安装命令。具体命令可能因不同平台和编译选项而有所不同。 7. 编译完成后,您可以将OSGEarth集成到您的Qt项目中。在Qt Creator中,打开您的项目文件(通常是一个.pro文件),并添加OSGEarth的相关头文件和库文件。 8. 根据OSGEarth提供的示例代码和文档,编写您需要的功能和界面。 9. 最后,您可以构建和运行您的Qt项目,测试OSGEarth是否按预期工作。 以上是关于安装QtOSGEarth的一般步骤,具体操作可能因不同的操作系统和版本而有所差异。建议在安装和配置过程中参考各自的官方文档和论坛,以获得更准确和详细的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值