#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include Qt3DCore::QEntity* createSphereMesh() { auto sphereMat = new Qt3DExtras::QDiffuseSpecularMaterial; sphereMat->setDiffuse(QColor(Qt::blue)); auto mesh = new Qt3DExtras::QSphereMesh(); mesh->setRadius(1); auto meshEntity = new Qt3DCore::QEntity; meshEntity->addComponent(mesh); meshEntity->addComponent(sphereMat); return meshEntity; } Qt3DRender::QScreenRayCaster* sm_rayCaster = nullptr; QMetaObject::Connection sm_rayCasterConnection; void recreateRayCaster(Qt3DCore::QEntity* rootEntity) { if (!sm_rayCaster) { sm_rayCaster = new Qt3DRender::QScreenRayCaster(rootEntity); sm_rayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot); sm_rayCaster->setFilterMode(Qt3DRender::QAbstractRayCaster::DiscardAnyMatchingLayers); rootEntity->addComponent(sm_rayCaster); sm_rayCasterConnection = QObject::connect(sm_rayCaster, &Qt3DRender::QScreenRayCaster::hitsChanged, [&](const Qt3DRender::QAbstractRayCaster::Hits& hits) { for (auto& hit : hits) qDebug() << "Hit data" << hit.entity()->objectName() << hit.worldIntersection() << hit.distance() << hit.type(); }); } else { QObject::disconnect(sm_rayCasterConnection); rootEntity->removeComponent(sm_rayCaster); sm_rayCaster->setParent(Q_NODE_NULLPTR); sm_rayCaster->deleteLater(); sm_rayCaster = nullptr; } } int main(int argc, char* argv[]) { QApplication a(argc, argv); auto view = new Qt3DExtras::Qt3DWindow(); auto renderSettings = view->renderSettings(); renderSettings->setRenderPolicy(Qt3DRender::QRenderSettings::Always); auto pickSettings = view->renderSettings()->pickingSettings(); pickSettings->setPickMethod(Qt3DRender::QPickingSettings::PrimitivePicking); pickSettings->setWorldSpaceTolerance(0.1f); auto rootEntity = new Qt3DCore::QEntity(); view->setRootEntity(rootEntity); auto camera = view->camera(); camera->lens()->setPerspectiveProjection(45.0f, 1., 0.1f, 10000.0f); camera->setPosition(QVector3D(0, 0, 5)); camera->setUpVector(QVector3D(0, 1, 0)); camera->setViewCenter(QVector3D(0, 0, 0)); auto camController = new Qt3DExtras::QOrbitCameraController(rootEntity); camController->setCamera(camera); recreateRayCaster(rootEntity); auto sphereEntity = createSphereMesh(); sphereEntity->setParent(rootEntity); auto container = QWidget::createWindowContainer(view); QFrame frame; frame.setLayout(new QVBoxLayout); frame.layout()->addWidget(container); frame.resize(QSize(400, 300)); QTimer::singleShot(100, [&]() { camera->viewAll(); }); QTimer timer; QObject::connect(&timer, &QTimer::timeout, [&]() { if (sm_rayCaster) { sm_rayCaster->trigger(container->mapFromGlobal(QCursor::pos())); qDebug() << "Trigger Raycaster"; } QTimer::singleShot(250, [&]() { recreateRayCaster(rootEntity); }); }); timer.start(500); frame.show(); return a.exec(); }