Обнаружение касания 3D-объектов, в дополнение к щелчку мыши - PullRequest
0 голосов
/ 07 января 2019

Как использовать 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 с сенсорными событиями на смартфонах?

1 Ответ

0 голосов
/ 10 января 2019

@ FlorianBlume помог мне решить проблему. Прикосновение к объектам Qt3D можно обнаружить с помощью QScreenRayCaster. Мне пришлось добавить 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);

Я запускаю QScreenRayCaster тесты при таких событиях касания, используя метод m_screenRayCaster->trigger():

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();
    }
}
...