Как контролировать размер текстуры для узла с изображением в Quick3d? - PullRequest
3 голосов
/ 28 мая 2020

Я экспериментирую с QtQuick3D на Qt 5.15. Это возможность встраивать QtQuick Item s довольно круто. Мне нравится создавать прямоугольник (100 x 100 единиц) и заполнять его Image (1000 x 1000 пикселей).

Это отлично работает, когда я определяю Material и назначаю его (см. Модель okButCodeSpread, правый прямоугольник на скриншоте), но это больше для кода.

Намного короче определить Node и встроить Image. Однако в этом случае мне сложно контролировать размер текстуры. Что бы я ни пробовал, это расплывчато. См. Модель doesNotWork и левый прямоугольник на скриншоте.

Я нашел решение, увеличив масштаб Image вверх и Node вниз. См. Модель okButUgly, средний прямоугольник на скриншоте.

Есть идеи, кому получить четкую текстуру для модели doesNotWork?

Кроме того, как можно скрыть изображение в 2D, используемое для определения Material? Установка для свойства visible значения false приводит к тому, что текстура в 3D будет solid черным ...

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15
import QtQuick3D.Helpers 1.15

Window {
    width: 640
    height: 480
    visible: true

    Image {
        id: image   
        layer.enabled: true
        width: 1000
        height: 1000
        source: "test.png"
    }

    View3D {
        id: view
        width: 400
        height: 400
        renderMode: View3D.Inline

        environment: SceneEnvironment {
            clearColor: "dimgray"
            backgroundMode: SceneEnvironment.Color
        }

        PerspectiveCamera {
            id: cam
            position: Qt.vector3d(0, 0, 350)
        }

        DirectionalLight {
        }

        WasdController {
            controlledObject: cam
        }

        DefaultMaterial {
            id: mat
            diffuseMap: Texture {
                sourceItem: image
            }
        }

        Node {
            id: doesNotWork
            position: Qt.vector3d(-150, 0, 0)

            Image {
                layer.enabled: true
                layer.textureSize: Qt.size(1000, 1000)
                sourceSize: Qt.size(1000, 1000)
                width: 100
                height: 100
                source: "test.png"
           }
        }

        Node {
            id: okButUgly        
            property real scaleFactor: 10
            position: Qt.vector3d(0, 0, 0)
            scale: Qt.vector3d(1/scaleFactor, 1/scaleFactor , 1/scaleFactor)

            Image {
                width: 100 * okButUgly.scaleFactor
                height: 100 * okButUgly.scaleFactor           
                source: "test.png"
            }
        }

        Model {
            id: okButCodeSpread
            position: Qt.vector3d(150, 0, 0)
            source: "#Rectangle"
            materials: mat
        }
    }

    DebugView {
        source: view
    }
}

Screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...