You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT6.7中Scene3D的GeometryRenderer无法显示,求问题排查

Qt6.7下Qt3D显示点云空白问题排查

问题描述

使用Qt6.7构建Qt3D点云显示项目,包含main.cpp和main.qml,已将Qt3D组件放入Scene3D容器中,但运行后仅显示空白屏幕,无任何渲染内容。项目代码如下:

Main.qml

import QtQuick 2.2 as QQ2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.15
import QtQuick.Scene3D

QQ2.Window {
    visible: true
    Scene3D {
        visible: true
        anchors.fill: parent

        Entity {
            id: rootEntity
            property int pointCount: 10000  // Number of points in the cloud
            function generateVetexData() {
                var vertexData = new Float32Array(pointCount * 9);  // 9 floats per vertex

                for (var i = 0; i < pointCount; i++) {
                    var x = Math.random() * 20 - 10;  // Random x position between -10 and 10
                    var y = Math.random() * 20 - 10;  // Random y position between -10 and 10
                    var z = Math.random() * 20 - 10;  // Random z position between -10 and 10
                    var r = Math.random();            // Random red color value
                    var g = Math.random();            // Random green color value
                    var b = Math.random();            // Random blue color value
                    var nx = 0.0;                     // Normal x
                    var ny = 1.0;                     // Normal y
                    var nz = 0.0;                     // Normal z

                    // Set the vertex data
                    vertexData[i * 10 + 0] = x;
                    vertexData[i * 10 + 1] = y;
                    vertexData[i * 10 + 2] = z;
                    vertexData[i * 10 + 3] = r;
                    vertexData[i * 10 + 4] = g;
                    vertexData[i * 10 + 5] = b;
                    vertexData[i * 10 + 6] = nx;
                    vertexData[i * 10 + 7] = ny;
                    vertexData[i * 10 + 8] = nz;
                }

                return vertexData;
            }

            RenderSettings {
                id: renderSettings
                activeFrameGraph: ForwardRenderer {
                    clearColor: "black"
                    camera: camera
                    showDebugOverlay: true
                }
            }

            // Camera
            Camera {
                id: camera
                projectionType: CameraLens.PerspectiveProjection
                fieldOfView: 75
                aspectRatio: 16 / 9
                nearPlane: 0.01
                farPlane: 1000.0
                position: Qt.vector3d(0.0, 10.0, -50.0)
                upVector: Qt.vector3d(0.0, 1.0, 0.0)
                viewCenter: Qt.vector3d(0.0, 0.0, 10.0)
            }

            // Light
            DirectionalLight {
                id: light
                worldDirection: Qt.vector3d(-1.0, -1.0, -1.0)
                intensity: 1.0
            }

            TorusMesh {
                   id: torusMesh
                   radius: 5
                   minorRadius: 1
                   rings: 100
                   slices: 20
               }

            // Material
            PhongMaterial {
                id: phongMaterial
                ambient: "gray"
                diffuse: "white"
                specular: "lightgray"
                shininess: 50.0
            }

            Buffer {
                id: vertexBuffer
                usage: Buffer.ReadWrite
                data: rootEntity.generateVetexData()
            }

            // Geometry for point cloud
            GeometryRenderer {
                id: pointCloudRenderer
                instanceCount: 1
                primitiveType: GeometryRenderer.Points
                geometry: Geometry {
                    id: pointCloudGeometry
                    attributes: [
                        // Position attribute
                        Attribute {
                            name: defaultPositionAttributeName
                            attributeType: Attribute.VertexAttribute
                            buffer: vertexBuffer
                            byteOffset: 0
                            byteStride: 36 // 3 (position) + 3 (color) + 3 (normal) = 9 floats * 4 bytes
                            vertexBaseType: Attribute.Float
                            vertexSize: 3
                            count: rootEntity.pointCount
                        },

                        // Color attribute
                        Attribute {
                            name: defaultColorAttributeName
                            attributeType: Attribute.VertexAttribute
                            buffer: vertexBuffer
                            byteOffset: 12 // 3 (position) * 4 bytes
                            byteStride: 36 // 3 (position) + 3 (color) + 3 (normal) = 9 floats * 4 bytes
                            vertexBaseType: Attribute.Float
                            vertexSize: 3
                            count: rootEntity.pointCount
                        },

                        // Normal attribute
                        Attribute {
                            name: defaultNormalAttributeName
                            attributeType: Attribute.VertexAttribute
                            buffer: vertexBuffer
                            byteOffset: 24 // 3 (position) + 3 (color) * 4 bytes
                            byteStride: 36 // 3 (position) + 3 (color) + 3 (normal) = 9 floats * 4 bytes
                            vertexBaseType: Attribute.Float
                            vertexSize: 3
                            count: rootEntity.pointCount
                        }
                    ]
                }
            }

            // Transform
            Transform {
                id: transform
                scale3D: Qt.vector3d(1.0, 1.0, 1.0)
            }

            // Camera Controller
            OrbitCameraController {
                camera: camera
            }

            components: [renderSettings, pointCloudRenderer, transform, torusMesh, light]
        }
    }
}

Main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSurfaceFormat>
#include <QOpenGLContext>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QSurfaceFormat format;
    if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
        format.setVersion(3, 2);
        format.setProfile(QSurfaceFormat::CoreProfile);
    }
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    format.setSamples(4);
    QSurfaceFormat::setDefaultFormat(format);

    QQmlApplicationEngine engine;
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreationFailed,
        &app,
        []() { QCoreApplication::exit(-1); },
        Qt::QueuedConnection);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

关键问题与修复方案

1. 顶点数据索引越界

generateVetexData函数中,声明的数组长度为pointCount * 9,但循环内使用i * 10作为索引偏移,导致数组越界,数据写入错误。修复索引计算:

vertexData[i * 9 + 0] = x;
vertexData[i * 9 + 1] = y;
vertexData[i * 9 + 2] = z;
vertexData[i * 9 + 3] = r;
vertexData[i * 9 + 4] = g;
vertexData[i * 9 + 5] = b;
vertexData[i * 9 + 6] = nx;
vertexData[i * 9 + 7] = ny;
vertexData[i * 9 + 8] = nz;

2. 渲染组件缺少材质绑定

GeometryRenderer未关联材质,Qt3D需要材质才能完成渲染流程。给pointCloudRenderer添加材质绑定:

GeometryRenderer {
    id: pointCloudRenderer
    // ... 原有配置 ...
    material: phongMaterial
}

3. Entity组件冲突

根Entity的components同时添加了pointCloudRenderer和torusMesh两个渲染组件,会导致渲染逻辑冲突。将两者拆分为独立子Entity:

// Torus子Entity
Entity {
    components: [torusMesh, phongMaterial, transform]
}

// 点子云子Entity
Entity {
    components: [pointCloudRenderer, phongMaterial, transform]
}

4. Qt3D模块版本适配

Qt6中Qt3D模块版本需统一使用6.x,避免混合旧版版本号导致API兼容问题:

import Qt3D.Core 6.7
import Qt3D.Render 6.7
import Qt3D.Input 6.7
import Qt3D.Extras 6.7

5. 点大小优化(可选)

默认点尺寸过小可能导致视觉上不可见,添加渲染状态调整点大小:

GeometryRenderer {
    id: pointCloudRenderer
    // ... 原有配置 ...
    renderStates: [
        PointSize {
            value: 2.0
            programmable: true
        }
    ]
}

6. 相机视锥体调整

当前相机位置和视中心设置可能导致点云不在可视范围内,调整相机参数:

Camera {
    id: camera
    // ... 原有配置 ...
    position: Qt.vector3d(0.0, 0.0, -30.0)
    viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
}

内容的提问来源于stack exchange,提问作者sola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:38:10