Qt3d QML: как добавить текст в качестве наложения в стандартный пример - PullRequest
2 голосов
/ 25 января 2020

Давний программист здесь, но QML nube.

Я хочу sh запустить проект Qt из примера: " Qt 3D: Пример Shadow Map QML ", что легко доступно из примеров, перечисленных в QtCreator. Вот ссылка на это также: https://doc.qt.io/qt-5/qt3d-shadow-map-qml-example.html

Я хочу сначала настроить его, добавив 2d текст, который в идеале должен оставаться в фиксированной позиции на экране, оставаясь в поле зрения как положение камеры / угол изменился. Я хотел бы просто добавить любой простой текст на экран любым способом!

Начиная с этого примера, я добавил файл:

Title.qml

import Qt3D.Core 2.12
import Qt3D.Extras 2.13

Entity {
    id: titleText
    components: [ Transform { translation: Qt.vector3d(0.0, 10.0, 30.0) } ]

    Text2DEntity {
        font.family: "Sans Serif"
        font.pointSize: 100
        color: "white"
        text: "MY TITLE"
        width: text.length * font.pointSize*2
        height: font.pointSize * 4
    }
}

Затем, в нижней части main.qml , я пытаюсь включить следующее:

import QtQuick 2.1 as QQ2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0

Entity {
    id: sceneRoot

    Camera {
        id: camera
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 45
        aspectRatio: _window.width / _window.height
        nearPlane: 0.1
        farPlane: 1000.0
        position: Qt.vector3d(0.0, 10.0, 20.0)
        viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
        upVector: Qt.vector3d(0.0, 1.0, 0.0)
    }

    FirstPersonCameraController { camera: camera }

    ShadowMapLight {
        id: light
    }

    components: [
        ShadowMapFrameGraph {
            id: framegraph
            viewCamera: camera
            lightCamera: light.lightCamera
        },
        // Event Source will be set by the Qt3DQuickWindow
        InputSettings { }
    ]


    AdsEffect {
        id: shadowMapEffect

        shadowTexture: framegraph.shadowTexture
        light: light
    }


    // Trefoil knot entity
    Trefoil {
        material: AdsMaterial {
            effect: shadowMapEffect
            specularColor: Qt.rgba(0.5, 0.5, 0.5, 1.0)
        }
    }

    // Toyplane entity
    Toyplane {
        material: AdsMaterial {
            effect: shadowMapEffect
            diffuseColor: Qt.rgba(0.9, 0.5, 0.3, 1.0)
            shininess: 75
        }
    }

    // Plane entity
    GroundPlane {
        material: AdsMaterial {
            effect: shadowMapEffect
            diffuseColor: Qt.rgba(0.2, 0.5, 0.3, 1.0)
            specularColor: Qt.rgba(0, 0, 0, 1.0)
        }
    }

    // -------------------------------------
    // Title entity
    Title {}
   // -------------------------------------
}

Я точно знаю, что сущность Title будучи включенным Я добавил звуковой эффект к этим onload и console.logs (), чтобы доказать это (удалено из этого поста). Я пытался манипулировать сущностью различными способами, но это никогда не появляется. Я думаю, что другие компоненты должны скрывать его / блокировать / делать его несовместимым с отображением ...

1 Ответ

3 голосов
/ 27 января 2020

Объект text2D предназначен для помещения текста в трехмерную сцену (например, для размещения некоторых текстовых тегов на указанных c объектах). Я думаю, вы просто хотите поместить текст на экран в качестве наложения.

Это можно сделать с помощью стандартного типа текста QML.

Я адаптировал ваш код и отметил новый строки с // ДОБАВЛЕНО. Строки, которые вам больше не нужны, помечены // REMOVED

pro file:

Вам понадобится модуль 3dextras в вашем pro файле

QT + = 3dextras

main. cpp

Измените ваш main. cpp, используя QQuickView вместо Qt3DQuickWindow. причина этого в том, что механизмы рендеринга между scene3D и Qt3DQuickWindow разные. Scene3D использует визуализатор QML для выполнения рендеринга, тогда как Qt3DQuickWindow создаст выделенный поток рендеринга. Другими словами: если вашей программе нужно только показать трехмерную среду, используйте Qt3DQuickWindow. Если вы хотите поместить текст и кнопки поверх вашей трехмерной среды, используйте QQuickView.

#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <Qt3DQuick/QQmlAspectEngine>
#include <QGuiApplication>
#include <QQmlContext>
#include <QQmlEngine>
#include <QQuickView>//ADDED

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);

//ADDED:
    QQuickView view;

    view.rootContext()->setContextProperty("_window", &view);
    view.setSource(QUrl("qrc:/main.qml"));
    view.setWidth(1600);
    view.setHeight(900);
    view.show();

//REMOVED:
//    Qt3DExtras::Quick::Qt3DQuickWindow view;
//    view.resize(1600, 800);
//    view.engine()->qmlEngine()->rootContext()->setContextProperty("_window", &view);
//    view.setSource(QUrl("qrc:/main.qml"));
//    view.show();

    return app.exec();
}

main.qml

В следующем примере я использую прямоугольник в качестве root и Scene3D на том же уровне, что и текст (в верхний левый угол) и кнопка, показывающая, как можно комбинировать стандартные типы QML.

Rectangle {
    anchors.fill: parent

    Scene3D{
        anchors.fill: parent
        focus: true
        aspects: ["input", "logic"]
        Entity {
            id: sceneRoot

                Camera {
                    id: camera
                    projectionType: CameraLens.PerspectiveProjection
                    fieldOfView: 45
                    aspectRatio: _window.width / _window.height
                    nearPlane: 0.1
                    farPlane: 1000.0
                    position: Qt.vector3d(0.0, 10.0, 20.0)
                    viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
                    upVector: Qt.vector3d(0.0, 1.0, 0.0)
                }

                FirstPersonCameraController { camera: camera }

                ShadowMapLight {
                    id: light
                }

                components: [
                    ShadowMapFrameGraph {
                        id: framegraph
                        viewCamera: camera
                        lightCamera: light.lightCamera
                    },
                    // Event Source will be set by the Qt3DQuickWindow
                    InputSettings { }
                ]


                AdsEffect {
                    id: shadowMapEffect

                    shadowTexture: framegraph.shadowTexture
                    light: light
                }


                // Trefoil knot entity
                Trefoil {
                    material: AdsMaterial {
                        effect: shadowMapEffect
                        specularColor: Qt.rgba(0.5, 0.5, 0.5, 1.0)
                    }
                }

                // Toyplane entity
                Toyplane {
                    material: AdsMaterial {
                        effect: shadowMapEffect
                        diffuseColor: Qt.rgba(0.9, 0.5, 0.3, 1.0)
                        shininess: 75
                    }
                }

                // Plane entity
                GroundPlane {
                    material: AdsMaterial {
                        effect: shadowMapEffect
                        diffuseColor: Qt.rgba(0.2, 0.5, 0.3, 1.0)
                        specularColor: Qt.rgba(0, 0, 0, 1.0)
                    }
                }
            }
        }

    Text {
        id: title
        text: qsTr("TITLE")
        font.family: "Arial"
        font.pointSize: 30
        color: "black"

        anchors.top:parent.top
        anchors.left:parent.left
        anchors.leftMargin: 20
        anchors.topMargin: 20
    }
}

РЕДАКТИРОВАТЬ

Вот экран печати примера, работающего на Windows10 с Qt5.13.2 MSVC2015 64bit и работает также на Qt5.14.0 MSVC2015 64bit enter image description here

...