Qt 3D: Как нарисовать куб с разными текстурами на каждом лице? - PullRequest
2 голосов
/ 29 октября 2019

Я новичок в 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);

    cuboidMaterial->setTexture(cubMap);

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

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

Буду признателен за вашу помощь.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Это может быть связано с отбором лицевой стороны.

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

    activeFrameGraph: ForwardRenderer {
      ...
        frustumCulling: false
    }

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

0 голосов
/ 10 ноября 2019

Попробуйте использовать f1->setSource(QUrl::fromLocalFile("...")); вместо f1->setSource(QUrl("...")); и т. Д. И помните о Status

...