2

I am working on some codes about qt3d. I create a Qt3DWindow(named view).

Try to add a root entity(named rootEntity) in it.

Put a cube entity like this:

m_cubeEntity = new Qt3DCore::QEntity;
...
Qt3DExtras::QCuboidMesh *cubeMesh = new Qt3DExtras::QCuboidMesh;
Qt3DRender::QMaterial *cubeMaterial = new Qt3DRender::QMaterial;
Qt3DCore::QTransform *cubeTransform = new Qt3DCore::QTransform;
Qt3DRender::QObjectPicker *objectPicker = new Qt3DRender::QObjectPicker;
...
m_cubeEntity.addComponent(cubeMesh);
m_cubeEntity.addComponent(cubeMaterial);
m_cubeEntity.addComponent(cubeTransform);
m_cubeEntity.adComponent(objectPicker);

m_cubeEntity.setParent(m_rootEntity);

Everything works fine.

And then I find using PickingSettings.BoundingVolumePicking to pick my cube entity is inaccuracy. I want the PickingSettings.TrianglePicking. ====================================================================/

So then i do it like this:

    m_renderSettings = new Qt3DRender::QRenderSettings();
    m_renderSettings->pickingSettings()->setPickMethod(Qt3DRender::QPickingSettings::TrianglePicking);
    m_renderSettings->pickingSettings()->setPickResultMode(Qt3DRender::QPickingSettings::AllPicks);
    m_renderer = new Qt3DExtras::QForwardRenderer();
    m_renderer->setClearColor(Qt::lightGray);
    m_renderSettings->setActiveFrameGraph(m_renderer);
    m_rootEntity->addComponent(m_renderSettings);

But now nothing is rendered. If i remove "m_renderSettings" from rootEntity, everything returns correct.

How to set rendersetting correctly for the root entity?

Mengyu Chen
  • 137
  • 6

1 Answers1

3

Most likely you just set a bad framegraph. You can easily display the standard framegraph using dumpObjectTree(), which tends to be a very useful function in debugging the framegraph of Qt3D.

For your simple use case it suffices to just use the renderSettings already contained in the activeFrameGraph() of the Qt3DWindow.

Just try the following simple app, that contains your desired QObjectPicker.

#include <QApplication>
#include <Qt3DCore/QTransform>
#include <Qt3DRender/QPickEvent>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QFrameGraphNode>
#include <Qt3DRender/QObjectPicker>
#include <Qt3DExtras/QDiffuseSpecularMaterial>
#include <Qt3DExtras/QCuboidMesh>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DRender/QRenderSettings>
#include <QDebug>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);

    auto view = new Qt3DExtras::Qt3DWindow();

    auto rootEntity = new Qt3DCore::QEntity();
    view->setRootEntity(rootEntity);

    // Shows your framegraph! Simple forward renderer! 
    view->activeFrameGraph()->dumpObjectTree(); 
    auto rendersettings=view->renderSettings();
    rendersettings->pickingSettings()->setPickMethod(Qt3DRender::QPickingSettings::TrianglePicking);
    rendersettings->pickingSettings()->setPickResultMode(Qt3DRender::QPickingSettings::AllPicks);

    auto cameraEntity = view->camera();
    cameraEntity->lens()->setPerspectiveProjection(45.0f, 1., 0.1f, 10000.0f);
    cameraEntity->setPosition(QVector3D(0, 2, 0));
    cameraEntity->setUpVector(QVector3D(0, 1, 0));
    cameraEntity->setViewCenter(QVector3D(0, 0, 0));

    auto cubeEntity = new Qt3DCore::QEntity(rootEntity);
    auto cubeMesh = new Qt3DExtras::QCuboidMesh;
    cubeMesh->setXExtent(1.);
    cubeMesh->setYExtent(1.);
    auto cubeMaterial = new Qt3DExtras::QDiffuseSpecularMaterial;
    auto objectPicker = new Qt3DRender::QObjectPicker;

    QObject::connect(objectPicker, &Qt3DRender::QObjectPicker::clicked, [](Qt3DRender::QPickEvent* pick) {
        qDebug() << pick;
    });
    cubeEntity->addComponent(cubeMesh);
    cubeEntity->addComponent(cubeMaterial);
    cubeEntity->addComponent(objectPicker);

    view->show();
    return a.exec();
}
Aleph0
  • 5,816
  • 4
  • 29
  • 80
  • Thanks! Works perfectly! Also, I want to say we had problems in customizing the Picker settings, until I found your post: the trick is to set them by using the `rendersettings` returned by the `view`! Thanks a lot for sharing! +1! – rmbianchi Aug 09 '20 at 00:21