Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-81087

Object silhouette displayed when using QtSceneLoader and Qt3D rendertree

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • None
    • 5.14.0, 5.14.1, 5.14.2, 5.15.0 Beta3, 5.15.0
    • Qt3D
    • None
    • All

    Description

      Using a split RenderTree for transparentLayer and opaqueLayer. When using the SceneLoader to load object into the scene it seems that there are some graphics draw so that a black silhouette of the object appear in front of the scene.

      In the picture the silhouette of the robot is shown from the robot loaded inn front of the transparent cone.

      MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent)
          , ui(new Ui::MainWindow)
      {
          ui->setupUi(this);    createSceen();    setWindowTitle("Load scene transparent");
      }MainWindow::~MainWindow()
      {
          delete ui;
      }
      void MainWindow::createSceen()
      {
          // Create a view and attach to widget
          m_view = new Qt3DExtras::Qt3DWindow();
          QWidget *viewContainer = QWidget::createWindowContainer(m_view);
          setCentralWidget(viewContainer);    // The root entity for the new sceen
          m_rootEntity = new Qt3DCore::QEntity();    // Create a splitt rendertree
          m_transparentLayer = new Qt3DRender::QLayer;
          m_opaqueLayer = new Qt3DRender::QLayer;
          Qt3DRender::QRenderSurfaceSelector *renderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector();
          renderSurfaceSelector->setSurface(m_view);
          Qt3DRender::QClearBuffers *clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector);
          clearBuffers->setBuffers(Qt3DRender::QClearBuffers::AllBuffers);
          clearBuffers->setClearColor(Qt::white);    Qt3DRender::QViewport *viewport = new Qt3DRender::QViewport(renderSurfaceSelector);
          Qt3DRender::QCameraSelector *cameraSelector = new Qt3DRender::QCameraSelector(viewport);
          m_camera = new Qt3DRender::QCamera(cameraSelector);
          m_camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
          m_camera->setPosition(QVector3D(-20.0f, 20.0f, 0.0f));
          m_camera->setUpVector(QVector3D(0,1,0));
          m_camera->setViewCenter(QVector3D(0, 0, 0));    cameraSelector->setCamera(m_camera);
          // not entirely sure why transparent filter has to go first
          // I would have expected the reversed order of the filters but this works...    Qt3DRender::QLayerFilter *transparentFilter = new Qt3DRender::QLayerFilter(m_camera);
          transparentFilter->addLayer(m_transparentLayer);    Qt3DRender::QLayerFilter *opaqueFilter = new Qt3DRender::QLayerFilter(m_camera);
          opaqueFilter->addLayer(m_opaqueLayer);    m_view->setActiveFrameGraph(renderSurfaceSelector);    m_opaqueLayer->setRecursive(true);
          m_transparentLayer->setRecursive(true);    m_view->setRootEntity(m_rootEntity);    Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(m_rootEntity);
          camController->setLinearSpeed( 50.0f );
          camController->setLookSpeed( 180.0f );
          camController->setCamera(m_camera);    // Create a few basic geometries that works...    // Create a Cone Shape
          Qt3DExtras::QConeMesh *cone = new Qt3DExtras::QConeMesh();
          cone->setTopRadius(0.5);
          cone->setBottomRadius(1);
          cone->setLength(3);
          cone->setRings(50);
          cone->setSlices(20);    // ConeMesh Transform
          Qt3DCore::QTransform *coneTransform = new Qt3DCore::QTransform();
          coneTransform->setScale(1.5f);
          coneTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0f), 45.0f));
          coneTransform->setTranslation(QVector3D(0.0f, 4.0f, -1.5));    // Cone material
          Qt3DExtras::QPhongMaterial *coneMaterial = new Qt3DExtras::QPhongMaterial();
          coneMaterial->setDiffuse(QColor(QRgb(0x928327)));    // Cone
          Qt3DCore::QEntity * coneEntity = new Qt3DCore::QEntity(m_rootEntity);
          coneEntity->addComponent(cone);
          coneEntity->addComponent(coneMaterial);
          coneEntity->addComponent(coneTransform);
          coneEntity->addComponent(m_opaqueLayer);
          // Create a Cylinder shape
          Qt3DExtras::QCylinderMesh *cylinder = new Qt3DExtras::QCylinderMesh();
          cylinder->setRadius(1);
          cylinder->setLength(3);
          cylinder->setRings(100);
          cylinder->setSlices(20);    // CylinderMesh Transform
          Qt3DCore::QTransform *cylinderTransform = new Qt3DCore::QTransform();
          cylinderTransform->setScale(1.5f);
          cylinderTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0f), 45.0f));
          cylinderTransform->setTranslation(QVector3D(-5.0f, 4.0f, -1.5));    // Cylinder material
          Qt3DExtras::QPhongAlphaMaterial *cylinderMaterial = new Qt3DExtras::QPhongAlphaMaterial();
          cylinderMaterial->setDiffuse(QColor(QRgb(0x928327)));
          cylinderMaterial->setAlpha(0.5f);    // Cylinder
          Qt3DCore::QEntity * cylinderEntity = new Qt3DCore::QEntity(m_rootEntity);
          cylinderEntity->addComponent(cylinder);
          cylinderEntity->addComponent(cylinderMaterial);
          cylinderEntity->addComponent(cylinderTransform);
          cylinderEntity->addComponent(m_transparentLayer);    // Now create a object using the scene loader...
          // NOT WORKING? This cause an black area to be displayed inn front of the scene :(
          Qt3DCore::QEntity * objectEntity = loadFromFile(QUrl("qrc:/models/object-1.qgltf"));
          objectEntity->addComponent(m_transparentLayer);
      }Qt3DCore::QEntity *MainWindow::loadFromFile(const QUrl & url)
      {
          qDebug() << "Load from file: " << url;    Qt3DCore::QEntity *sceneLoaderEntity = new Qt3DCore::QEntity(m_rootEntity);
          Qt3DRender::QSceneLoader *sceneLoader = new Qt3DRender::QSceneLoader(sceneLoaderEntity);    sceneLoaderEntity->addComponent(sceneLoader);
          sceneLoader->setSource(url);    return sceneLoaderEntity;
      }
      

       

       

       

      Attachments

        1. Transparent.png
          Transparent.png
          16 kB
        2. Transparent.zip
          22 kB
        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            seanharmer Sean Harmer
            magodra Anders Reggestad
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes