Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
qtws26_logo

The Qt Event of the Year: Qt World Summit 2026

Save Your Spot >
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Qt3D Filtering Entities
Qt 6.12 LTS is out! See what's new in the release blog

Qt3D Filtering Entities

Scheduled Pinned Locked Moved Unsolved General and Desktop
1 Posts 1 Posters 265 Views
  • 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
    AlexandrePTJ
    wrote on last edited by
    #1

    I am trying to display two entites into two different viewport. Looks like QFilter should help, but I don't know how.

    Here is what I did:

    #include <QApplication>
    
    #include <Qt3DCore/QEntity>
    #include <Qt3DCore/QTransform>
    #include <Qt3DExtras/QConeMesh>
    #include <Qt3DExtras/QGoochMaterial>
    #include <Qt3DExtras/QMetalRoughMaterial>
    #include <Qt3DExtras/QOrbitCameraController>
    #include <Qt3DExtras/QSphereMesh>
    #include <Qt3DExtras/Qt3DWindow>
    #include <Qt3DRender/QCamera>
    #include <Qt3DRender/QCameraSelector>
    #include <Qt3DRender/QClearBuffers>
    #include <Qt3DRender/QLayer>
    #include <Qt3DRender/QLayerFilter>
    #include <Qt3DRender/QNoDraw>
    #include <Qt3DRender/QObjectPicker>
    #include <Qt3DRender/QPickEvent>
    #include <Qt3DRender/QRenderSettings>
    #include <Qt3DRender/QRenderSurfaceSelector>
    #include <Qt3DRender/QViewport>
    
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
    
        auto rootNode        = new Qt3DCore::QEntity;
        auto rootScene       = new Qt3DCore::QEntity(rootNode);
        auto renderSettings  = new Qt3DRender::QRenderSettings(rootNode);
        auto surfaceSelector = new Qt3DRender::QRenderSurfaceSelector(renderSettings);
    
        renderSettings->setActiveFrameGraph(surfaceSelector);
        rootNode->addComponent(renderSettings);
    
        // Main viewport
        auto mainViewport = new Qt3DRender::QViewport(surfaceSelector);
        mainViewport->setNormalizedRect(QRectF(0, 0, 1, 1));
    
        // clear buffer + NoDrawBuffer
        auto clearBuffer = new Qt3DRender::QClearBuffers(mainViewport);
        clearBuffer->setBuffers(Qt3DRender::QClearBuffers::ColorDepthBuffer);
        clearBuffer->setClearColor(QColor(QRgb(0xa7a8db)));
        new Qt3DRender::QNoDraw(clearBuffer);
    
        // Left viewport
        auto leftViewport = new Qt3DRender::QViewport(mainViewport);
        leftViewport->setNormalizedRect(QRectF(0, 0, 0.5, 1));
        auto leftCamera = new Qt3DRender::QCamera(leftViewport);
        leftCamera->setProjectionType(Qt3DRender::QCameraLens::OrthographicProjection);
        leftCamera->setPosition(QVector3D(0, 0, 20.0f));
        leftCamera->setViewCenter(QVector3D(0, 0, 0));
        auto leftCameraSelector = new Qt3DRender::QCameraSelector(leftViewport);
        leftCameraSelector->setCamera(leftCamera);
        auto leftCameraController = new Qt3DExtras::QOrbitCameraController(leftViewport);
        leftCameraController->setCamera(leftCamera);
    
        // Right viewport
        auto rightViewport = new Qt3DRender::QViewport(mainViewport);
        rightViewport->setNormalizedRect(QRectF(0.5, 0, 0.5, 1));
        auto rightCamera = new Qt3DRender::QCamera(rightViewport);
        rightCamera->setProjectionType(Qt3DRender::QCameraLens::OrthographicProjection);
        rightCamera->setPosition(QVector3D(0, 0, 20.0f));
        rightCamera->setViewCenter(QVector3D(0, 0, 0));
        auto rightCameraSelector = new Qt3DRender::QCameraSelector(rightViewport);
        rightCameraSelector->setCamera(rightCamera);
        auto rightCameraController = new Qt3DExtras::QOrbitCameraController(rightViewport);
        rightCameraController->setCamera(rightCamera);
    
        // Sphere object
        auto sent  = new Qt3DCore::QEntity(rootScene);
        auto smesh = new Qt3DExtras::QSphereMesh(sent);
        smesh->setRadius(10.0);
        sent->addComponent(smesh);
        sent->addComponent(new Qt3DExtras::QGoochMaterial);
    
        // Cone object
        auto cent  = new Qt3DCore::QEntity(rootScene);
        auto cmesh = new Qt3DExtras::QConeMesh(cent);
        cmesh->setTopRadius(1.0);
        cmesh->setBottomRadius(12.0);
        cmesh->setLength(15);
        cent->addComponent(cmesh);
        cent->addComponent(new Qt3DExtras::QMetalRoughMaterial);
    
        // Show sphere on the left
        auto sphereLayer = new Qt3DRender::QLayer(sent);
        sphereLayer->setRecursive(true);
        sent->addComponent(sphereLayer);
        auto leftLayerFilter = new Qt3DRender::QLayerFilter(leftViewport);
        leftLayerFilter->addLayer(sphereLayer);
    
        // Show cone on the right
        auto coneLayer = new Qt3DRender::QLayer(cent);
        coneLayer->setRecursive(true);
        cent->addComponent(coneLayer);
        auto rightLayerFilter = new Qt3DRender::QLayerFilter(rightViewport);
        rightLayerFilter->addLayer(coneLayer);
    
        // Picker to select right viewport
        auto picker = new Qt3DRender::QObjectPicker(rootNode);
        QObject::connect(picker, &Qt3DRender::QObjectPicker::pressed, [&](Qt3DRender::QPickEvent* pick) {
            if (pick->viewport() == leftViewport)
            {
                leftCameraController->setEnabled(true);
                rightCameraController->setEnabled(false);
            }
            else if (pick->viewport() == rightViewport)
            {
                leftCameraController->setEnabled(false);
                rightCameraController->setEnabled(true);
            }
        });
        rootNode->addComponent(picker);
    
        // Display
        Qt3DExtras::Qt3DWindow w3d;
        w3d.setRootEntity(rootNode);
        w3d.setActiveFrameGraph(surfaceSelector);
        w3d.show();
    
        leftCamera->viewAll();
        rightCamera->viewAll();
    
        return app.exec();
    }
    

    Result is that both objects are display on both viewports. What did I miss ?

    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
    • Unsolved