Как добавить компонент rendersetting к моей корневой сущности в qt3d? - PullRequest
2 голосов
/ 16 октября 2019

Я работаю над некоторыми кодами о qt3d. Я создаю Qt3DWindow (именованное представление).

Попробуйте добавить в него корневую сущность (с именем rootEntity).

Поместите сущность куба следующим образом:

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);

Все работает нормально.

А потом я обнаружил, что использование PickingSettings.BoundingVolumePicking для выбора моего объекта куба является неточностью. Я хочу, чтобы PickingSettings.TrianglePicking. ==================================================================== /

Итак, я делаю это так:

    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);

Но теперь ничего не отображается. Если я удалю «m_renderSettings» из rootEntity, все вернется правильно.

Как правильно настроить rendersetting для корневого объекта?

1 Ответ

2 голосов
/ 16 октября 2019

Скорее всего, вы просто установили плохой фреймграф. Вы можете легко отобразить стандартный framegraph, используя dumpObjectTree(), что является очень полезной функцией при отладке framegraph в Qt3D.

Для вашего простого случая использования достаточно просто использовать renderSettings, уже содержащийся в activeFrameGraph() из Qt3DWindow.

. Просто попробуйте следующее простое приложение, которое содержит желаемое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();
}
...