解决qml中在顶点属性中设置颜色属性之后,点云颜色显示错误的问题。

张开发
2026/4/16 22:59:53 15 分钟阅读

分享文章

解决qml中在顶点属性中设置颜色属性之后,点云颜色显示错误的问题。
bool PointCloudGeometry::updateGeometry(){if (m_source.isEmpty()) {qWarning() Source is empty!;return false;}m_points.clear();m_source m_source.mid(8, m_source.length()-8);// 使用PCL加载点云pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ);if (pcl::io::loadPCDFilepcl::PointXYZ(m_source.toStdString(), *cloud) -1) {qWarning() Failed to load PCD file: m_source;return false;}// 计算质心Eigen::Vector4f centroid;pcl::compute3DCentroid(*cloud, centroid);m_centerPoint QVector3D(centroid[0], centroid[1], centroid[2]);// 设置几何体属性clear();//每个点有位置3个float和颜色4个float这里假设白色const int stride 7 * sizeof(float);QByteArray vertexData;vertexData.resize(cloud-points.size() * stride);float* p reinterpret_castfloat*(vertexData.data());int lastN 0;float color 0.0f;for (const auto point : cloud-points) {// 位置*p point.x- m_centerPoint.x();*p point.y- m_centerPoint.y();*p point.z- m_centerPoint.z();*p 0.0f;*p 1.0f; // G*p 0.0f; // B*p 1.0f; // a}setVertexData(vertexData);setStride(stride);setPrimitiveType(QQuick3DGeometry::PrimitiveType::Points);// 添加位置属性addAttribute(QQuick3DGeometry::Attribute::PositionSemantic,0,QQuick3DGeometry::Attribute::F32Type);// 添加颜色属性addAttribute(QQuick3DGeometry::Attribute::ColorSemantic,3 * sizeof(float),QQuick3DGeometry::Attribute::F32Type);// 更新边界框用于相机定位和裁剪QVector3D minBounds, maxBounds;if (!cloud-points.empty()) {minBounds QVector3D(cloud-points[0].x, cloud-points[0].y, cloud-points[0].z);maxBounds minBounds;for (const auto point : cloud-points) {minBounds.setX(std::min(minBounds.x(), point.x));minBounds.setY(std::min(minBounds.y(), point.y));minBounds.setZ(std::min(minBounds.z(), point.z));maxBounds.setX(std::max(maxBounds.x(), point.x));maxBounds.setY(std::max(maxBounds.y(), point.y));maxBounds.setZ(std::max(maxBounds.z(), point.z));}}setBounds(minBounds, maxBounds);update();emit sourceChanged();return true;}

更多文章