【问题标题】:Detecting touch on 3D objects, in addition to mouse click检测 3D 对象上的触摸,除了鼠标点击
【发布时间】:2019-01-07 12:27:09
【问题描述】:

如何在触摸事件中使用Qt3DRender::QObjectPicker

我正在通过这种方法将Qt3DRender::QObjectPicker 组件添加到我的 Qt3D 实体中:

Qt3DRender::QObjectPicker *MyClass::createObjectPickerForEntity(Qt3DCore::QEntity *entity)
{
    Qt3DRender::QObjectPicker *picker = new Qt3DRender::QObjectPicker(entity);
    picker->setHoverEnabled(false);
    entity->addComponent(picker);
    connect(picker, &Qt3DRender::QObjectPicker::pressed, this, &MyClass::handlePickerPress);

    return picker;
}

我的对象选择器适用于鼠标点击,但不适用于触摸事件。有人知道我如何在智能手机上使用带有触摸事件的 Qt3D 对象选择器吗?

【问题讨论】:

  • 你使用的是 Qt >= 5.11 吗?在这种情况下,您可以使用QScreenRayCaster 手动接收触摸事件并将它们转发给光线投射器。
  • @FlorianBlume 谢谢!是的,我使用的是5.11.3 版本,实际上您提供的链接读起来很棒,我相信它可以解决我的问题:)
  • 我认为您需要使用QScreenRayCaster,因为这是将光线从 2D 鼠标位置投射到世界的类。诀窍是(如果我没记错的话)将光线投射器作为组件添加到场景图的 root 实体中。
  • 我回答了一个关于光线投射器here的问题。
  • 很高兴能帮上忙 :) 如果您有可行的解决方案,请不要忘记发布。

标签: qt3d


【解决方案1】:

@FlorianBlume 帮助我解决了这个问题。可以使用QScreenRayCaster 检测 Qt3D 实体上的触摸。我必须在我的根实体中添加一个QScreenRayCaster 组件:

 /*
  * You have to add the ray caster to the root entity as a component
  * Perform ray casting tests by specifying "touch" coordinates in screen space
  */
    m_screenRayCaster = new Qt3DRender::QScreenRayCaster(m_rootEntity);
    m_screenRayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot);
    m_rootEntity->addComponent(m_screenRayCaster);

 /*
  * Handle ray casting results by signal-slot connection
  * "QScreenRayCaster::hitsChanged" signal contains ray casting result for any hit
  * "MyClass::handleScreenRayCasterHits" slot needs to be implemented to handle hit results
  */
    QObject::connect(m_screenRayCaster, &Qt3DRender::QScreenRayCaster::hitsChanged, this, &MyClass::handleScreenRayCasterHits);

我使用m_screenRayCaster->trigger() 方法通过这样的触摸事件触发QScreenRayCaster 测试:

void MyClass::HandleTouchEvent(QTouchEvent *event)
{
    switch (event->type()) {
    case QEvent::TouchBegin:
        break;
    case QEvent::TouchEnd:
        if (event->touchPoints().count() == 1) {
            QPointF point = event->touchPoints().at(0).pos();
            m_screenRayCaster->trigger(QPoint(static_cast<int>(point.x()), static_cast<int>(point.y())));
        }
        break;
    default:
        break;
    }

}

MyClass::handleScreenRayCasterHits槽中处理光线投射结果:

void MyClass::handleScreenRayCasterHits(const Qt3DRender::QAbstractRayCaster::Hits hits)
{
    for (int i = 0; i < hits.length(); ++i) {
        qDebug() << __func__ << "Hit Type: " << hits.at(i).type();
        qDebug() << __func__ << "Hit entity name: " << hits.at(i).entity()->objectName();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多