首页 > 解决方案 > 如何在 Qt3D 中将 objectpicker 和 Camera 添加到我的实体?

问题描述

我需要渲染一些在 3d 场景中保存一些数据的线和点。

并且点需要用鼠标拾取,然后获取点中的数据。

我首先尝试定义一个继承自 QQuickFramebufferObject 的类,但是我发现很难进行鼠标选择。

我发现它在 Qt3D 模块中有 ObjectPicker,所以我想使用 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 可以工作

标签: qt3d

解决方案


推荐阅读