Qt 3D: Как нарисовать куб с разными текстурами на каждой грани?

Я новичок в Qt 3D (C++), и пока я тренируюсь со своим первым 3D-приложением, я не смог добиться следующего:

Создание куба с 6 различными текстурами на каждой грани... До сих пор я пробовал следующее:

// Cuboid shape data
    Qt3DExtras::QCuboidMesh *cuboid = new Qt3DExtras::QCuboidMesh();

    // CuboidMesh Transform
    Qt3DCore::QTransform *cuboidTransform = new Qt3DCore::QTransform();
    cuboidTransform->setScale(2.0f);

   Qt3DExtras::QTextureMaterial *textureMaterial = new Qt3DExtras::QTextureMaterial();
   Qt3DRender::QTextureCubeMap *cubMap = new Qt3DRender::QTextureCubeMap();

    Qt3DRender::QTextureImage *f1 = new Qt3DRender::QTextureImage();
    Qt3DRender::QTextureImage *f2 = new Qt3DRender::QTextureImage();
    Qt3DRender::QTextureImage *f3 = new Qt3DRender::QTextureImage();
    Qt3DRender::QTextureImage *f4 = new Qt3DRender::QTextureImage();
    Qt3DRender::QTextureImage *f5 = new Qt3DRender::QTextureImage();
    Qt3DRender::QTextureImage *f6 = new Qt3DRender::QTextureImage();

    f1->setSource(QUrl("qrc:/rc/images/cubemap1.png"));
    f1->setFace(Qt3DRender::QAbstractTexture::CubeMapNegativeX);
    f2->setSource(QUrl("qrc:/rc/images/cubemap2.png"));
    f2->setFace(Qt3DRender::QAbstractTexture::CubeMapPositiveX);
    f3->setSource(QUrl("qrc:/rc/images/cubemap3.png"));
    f3->setFace(Qt3DRender::QAbstractTexture::CubeMapNegativeY);
    f4->setSource(QUrl("qrc:/rc/images/cubemap4.png"));
    f4->setFace(Qt3DRender::QAbstractTexture::CubeMapPositiveY);
    f5->setSource(QUrl("qrc:/rc/images/cubemap5.png"));
    f5->setFace(Qt3DRender::QAbstractTexture::CubeMapNegativeZ);
    f6->setSource(QUrl("qrc:/rc/images/cubemap6.png"));
    f6->setFace(Qt3DRender::QAbstractTexture::CubeMapPositiveZ);

    cubMap->addTextureImage(f1);
    cubMap->addTextureImage(f2);
    cubMap->addTextureImage(f3);
    cubMap->addTextureImage(f4);
    cubMap->addTextureImage(f5);
    cubMap->addTextureImage(f6);

    textureMaterial->setTexture(cubMap);

    //Cuboid
    m_cuboidEntity = new Qt3DCore::QEntity(m_rootEntity);
    m_cuboidEntity->addComponent(cuboid);
    m_cuboidEntity->addComponent(textureMaterial);
    m_cuboidEntity->addComponent(cuboidTransform);

Но это дает мне черный куб. Я искал пример в Google, но все, что я нашел, написано на OpenGl, с которым я не знаком. Я считаю, что это возможно только с использованием классов Qt C++.

Я был бы признателен за вашу помощь.


person Osama    schedule 29.10.2019    source источник
comment
С первого взгляда код выглядит нормально. Вы проверили, правильно ли загружаются изображения? Иногда появляется сообщение о том, что изображения не найдены. Может быть, попробуйте загрузить в QImage и проверить, правильно ли он содержит данные.   -  person Florian Blume    schedule 30.10.2019
comment
@FlorianBlume, я так не думаю, потому что они правильно загружаются, когда я использую QTexture2D вместо QTextureCubeMap, и я не получаю никакого вывода.   -  person Osama    schedule 30.10.2019


Ответы (2)


Это может быть связано с отбраковкой задней грани.

Не могли бы вы установить следующее в вашем рендерере?

    activeFrameGraph: ForwardRenderer {
      ...
        frustumCulling: false
    }

При использовании Skybox (который в основном представляет собой CuboidMesh с разными изображениями) это обязательно. Здесь тоже может понадобиться.

person Eddy Alleman    schedule 31.10.2019
comment
Я попробовал m_scene->defaultFrameGraph()->setFrustumCullingEnabled(false), где m_scene — это Qt3DWindow... но куб по-прежнему черный. Хорошо, что вы упомянули Skybox, потому что я пробовал использовать QSkyboxEntity, и он работает !! Так почему же этот код не работает правильно! - person Osama; 01.11.2019