簡體   English   中英

使用 C++ 在 Qt3D 中創建多個視口時出現問題

[英]Problem creating multiple viewports in Qt3D using C++

我正在嘗試使用 C++ 設置具有多個視口的 Qt3DWindow。 根據文檔提供的 QML 示例,我需要做的就是創建一個框架圖,其中一個主要的 QViewport object 分支成幾個 RenderViews。 第一個 RenderView 包含一個 QClearBuffers object,其余的包含平鋪視口及其對應的相機選擇器。 因此,如果我想要 N 個視口,我需要創建 N+1 個 RenderViews。

但是,如果我按照該程序進行操作,主視口會顯示某種“默認”視圖,該視圖出現在 window 的頂部,跨越所有視口。 我不知道這個視圖來自哪里,因為它不對應任何相機。 是下面發布的代碼中的 output。

我找到了一個解決方案,但我對此並不滿意,因為它感覺像是某種 hack:我沒有從主視口創建所有RenderViews 分支,而是將其中一個子視口附加到 ClearBuffers object 本身。 因此,對於 N 個視口,我有 N 個 RenderViews 而不是 N+1。 我不太了解框架圖的內部結構,所以我想知道這個解決方案是否只是從強迫症的角度來看是錯誤的,或者它實際上會適得其反。

這是一個最小的示例,其中兩個視口共享默認相機。 如果我從clearBuffers而不是mainViewPort創建viewPort1viewPort2分支,一切都會按預期工作:

#include <QGuiApplication>

#include <Qt3DCore/QTransform>

#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DExtras/QTorusMesh>
#include <Qt3DExtras/QPhongMaterial>

#include <Qt3DRender/QCamera>
#include <Qt3DRender/QRenderSurfaceSelector>
#include <Qt3DRender/QViewport>
#include <Qt3DRender/QClearBuffers>
#include <Qt3DRender/QCameraSelector>

Qt3DCore::QEntity *createScene()
{
    // Root entity
    auto rootEntity = new Qt3DCore::QEntity;

    // Torus
    auto torusEntity = new Qt3DCore::QEntity(rootEntity);

    auto torusMesh = new Qt3DExtras::QTorusMesh;
    torusMesh->setRadius(0.5f);
    torusMesh->setMinorRadius(0.1f);
    torusMesh->setRings(100);
    torusMesh->setSlices(20);

    auto torusTransform = new Qt3DCore::QTransform;
    torusTransform->setScale3D(QVector3D(1.2f, 1.f, 0.8f));
    torusTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), 45.0f));

    torusEntity->addComponent(torusMesh);
    torusEntity->addComponent(torusTransform);
    torusEntity->addComponent(new Qt3DExtras::QPhongMaterial(rootEntity));

    return rootEntity;
}

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    Qt3DExtras::Qt3DWindow view;

    // Set camera transform
    view.camera()->setPosition(QVector3D(0, 4.0f, 0));
    view.camera()->setViewCenter(QVector3D(0, 0, 0));

    // Framegraph root node
    auto surfaceSelector = new Qt3DRender::QRenderSurfaceSelector();
    auto mainViewPort = new Qt3DRender::QViewport(surfaceSelector);

    // First RenderView: clear buffers
    auto clearBuffers = new Qt3DRender::QClearBuffers(mainViewPort);
    clearBuffers->setBuffers(Qt3DRender::QClearBuffers::ColorDepthBuffer);
    clearBuffers->setClearColor(Qt::white);

    // Second RenderView: left viewport
    auto viewPort1 = new Qt3DRender::QViewport(mainViewPort);
    viewPort1->setNormalizedRect(QRectF(0.0f, 0.0f, 0.5f, 1.0f));
    auto cameraSelector1 = new Qt3DRender::QCameraSelector(viewPort1);
    cameraSelector1->setCamera(view.camera());

    // Third RenderView: right viewport
    auto viewPort2 = new Qt3DRender::QViewport(mainViewPort);
    viewPort2->setNormalizedRect(QRectF(0.5f, 0.0f, 0.5f, 1.0f));
    auto cameraSelector2= new Qt3DRender::QCameraSelector(viewPort2);
    cameraSelector2->setCamera(view.camera());

    // Add framegraph and scenegraph to viewer
    view.setActiveFrameGraph(surfaceSelector);
    view.setRootEntity(createScene());

    view.show();

    return app.exec();
}

我仍然認為它在視口上繪制是一種錯誤,但是您可以將QNoDraw節點作為QClearBuffers的子節點放在您的框架圖中:

auto noDraw = new Qt3DRender::QNoDraw(clearBuffers);

這解決了渲染問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM