#ifndef POINTCLOUDGLWIDGET_H #define POINTCLOUDGLWIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include class PointCloudGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit PointCloudGLWidget(QWidget *parent = nullptr); ~PointCloudGLWidget(); void updatePointCloud(pcl::PointCloud::Ptr cloud); void setColorMode(bool enabled) { m_colorMode = enabled ? 1 : 0; update(); } bool colorMode() const { return m_colorMode != 0; } void resetView(); // 重置视角到初始状态 protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; // 鼠标交互 void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void wheelEvent(QWheelEvent *event) override; private: void setupShaders(); void updateBuffers(); private: // OpenGL资源 QOpenGLShaderProgram *m_program; QOpenGLBuffer *m_vertexBuffer; QOpenGLVertexArrayObject *m_vao; // 点云数据 std::vector m_vertices; int m_pointCount; float m_minZ, m_maxZ; // 深度范围(用于着色) // 相机参数 QMatrix4x4 m_projection; QMatrix4x4 m_view; QMatrix4x4 m_model; float m_fov; // 透视投影视场角 float m_rotationX; // X轴旋转角度 float m_rotationY; // Y轴旋转角度 QVector3D m_cloudCenter; // 点云中心 float m_viewDistance; // 观察距离 QVector3D m_panOffset; // 用户平移偏移 float m_zoom; // 缩放因子 // 鼠标交互状态 QPoint m_lastMousePos; bool m_leftButtonPressed; bool m_rightButtonPressed; // 首帧标志(只在首帧时自动居中) bool m_firstFrame; // 颜色模式(0=黑白,1=彩色) int m_colorMode; }; #endif // POINTCLOUDGLWIDGET_H