Qt 6.11 is out! See what's new in the release
blog
QRayCaster initialization on first frame
-
Greetings,
I would like to report a suspect behavior from the QRayCaster: It seems to work if and only if the QRayCaster is trigger before the first frame. Follows a complete test, that has to be repeated with and without the commented line.
A work around is to create a new QRayCaster instance whenever a shot is needed.
A fix may be to set RayCastingJob::m_castersDirty to true in the QRayCaster::trigger() method.
Qt3DCore::QEntity* sceneSphereMesh() { auto rootEntity = new Qt3DCore::QEntity; auto sphereEntity = new Qt3DCore::QEntity(rootEntity); auto sphereMesh = new Qt3DExtras::QSphereMesh; sphereMesh->setRadius(10); sphereMesh->setRings(50); sphereMesh->setSlices(100); auto sphereMaterial = new Qt3DExtras::QPhongMaterial; sphereEntity->addComponent(sphereMesh); sphereEntity->addComponent(sphereMaterial); auto trnsf = new Qt3DCore::QTransform; trnsf->setTranslation(QVector3D(0, 5, 10)); sphereEntity->addComponent(trnsf); return rootEntity; } int main(int argc, char** argv) { QApplication app(argc, argv); Qt3DExtras::Qt3DWindow view; auto scene = sceneSphereMesh(); view.setRootEntity(scene); view.camera()->setPosition(QVector3D(0, 0, 200)); view.camera()->setViewCenter(QVector3D(0, 0, 0)); auto pickableLayer = new Qt3DRender::QLayer; pickableLayer->setRecursive(true); scene->addComponent(pickableLayer); auto rayCaster = new Qt3DRender::QRayCaster; rayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot); rayCaster->setOrigin(view.camera()->position()); rayCaster->setDirection(view.camera()->viewVector()); rayCaster->setLength(300); rayCaster->addLayer(pickableLayer); scene->addComponent(rayCaster); view.renderSettings()->pickingSettings()->setPickMethod( Qt3DRender::QPickingSettings::TrianglePicking); view.renderSettings()->pickingSettings()->setPickResultMode( Qt3DRender::QPickingSettings::NearestPick); QObject::connect(rayCaster, &Qt3DRender::QAbstractRayCaster::hitsChanged, [](const Qt3DRender::QAbstractRayCaster::Hits& hits) { qDebug() << "hits number: " << hits.size(); }); // Uncomment to get hit results // rayCaster->trigger(); QTimer::singleShot(1000, [rayCaster]() { qDebug() << "timeout"; rayCaster->trigger(); }); view.show(); return app.exec(); }