Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QRayCaster initialization on first frame
Qt 6.11 is out! See what's new in the release blog

QRayCaster initialization on first frame

Scheduled Pinned Locked Moved Unsolved General and Desktop
1 Posts 1 Posters 240 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    alban774
    wrote on last edited by
    #1

    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();
    }
    
    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved