Как добавить ObjectPicker и Camera для моего объекта в Qt3D? - PullRequest
2 голосов
/ 15 октября 2019

Мне нужно визуализировать некоторые линии и точки, которые содержат некоторые данные в 3D-сцене.

И точки должны быть выбраны мышью, а затем получить данные в точке.

Сначала я попытаюсь определить класс, унаследованный от QQuickFramebufferObject, однако я считаю, что выбор мышью затруднен.

Я обнаружил, что у него есть ObjectPicker в модуле Qt3D, поэтому я хочу использовать Qt3D для работы с моей работой.

Мой тестовый код ниже. Я определил свой объект GeometryRenderer и установил данные о вершинах (просто нарисуйте два треугольника). Вот так:

GeometryRenderer {
    id: geometry
    geometry: Geometry {
        boundingVolumePositionAttribute: position
        Attribute {
            id: position
            attributeType: Attribute.VertexAttribute
            vertexBaseType: Attribute.Float
            vertexSize: 3
            count: 4
            byteOffset: 0
            byteStride: 6 * 4
            name: "position"
            buffer: vertexBuffer
        }
        Attribute {
            id: color
            attributeType: Attribute.VertexAttribute
            vertexBaseType: Attribute.Float
            vertexSize: 3
            count: 4
            byteOffset: 3 * 4
            byteStride: 6 * 4
            name: "color"
            buffer: vertexBuffer
        }

        Attribute {
            attributeType: Attribute.IndexAttribute
            vertexBaseType: Attribute.UnsignedShort
            vertexSize: 1
            count: 6
            buffer: indexBuffer
        }
    }
    Buffer {
        id: vertexBuffer
        type: Buffer.VertexBuffer
        data: new Float32Array(...)
    }
    Buffer {
        id: indexBuffer
        type: Buffer.IndexBuffer
        data: new Uint16Array(...)
    }
}

А затем определите материальный объект следующим образом:

Material {
    id: material
    effect: Effect {
        techniques: Technique {
            graphicsApiFilter {
                profile: GraphicsApiFilter.CoreProfile
            }
            renderPasses: RenderPass {
                shaderProgram: ShaderProgram {
                    vertexShaderCode: loadSource("qrc:/shader/hellotriangle.vert")
                    fragmentShaderCode: loadSource("qrc:/shader/hellotriangle.frag")
                }
            }
        }
    }
}

А затем в моем корневом объекте:


Entity {
    id: root
    components: [
        RenderSettings {
            activeFrameGraph: colorBuffer
            pickingSettings.pickMethod: PickingSettings.TrianglePicking
            pickingSettings.pickResultMode: PickingSettings.NearestPick
        },
        InputSettings { }
    ]
    ClearBuffers {
        id: colorBuffer
        clearColor: Qt.rgba(0.8, 0.8, 0.8, 0.6)
        buffers: ClearBuffers.ColorDepthBuffer
        RenderSurfaceSelector {
            RenderStateSet {
                renderStates: DepthTest {
                    depthFunction: DepthTest.Less
                }
            }
        }
    }
}

Это работает, рендерингдва треугольника. И я хочу добавить Qt3D Camera и ObjectPicker в мою сцену. Как я могу это сделать?

Я обнаружил, что если я использую ForwardRenderer (но я не смог найти способ визуализации моих собственных линий / точек вершин)вместо ClearBuffers работает Camera и ObjectPicker

...