82 lines
2.2 KiB
C++
82 lines
2.2 KiB
C++
#ifndef POINTCLOUDGLWIDGET_H
|
||
#define POINTCLOUDGLWIDGET_H
|
||
|
||
#include <QOpenGLWidget>
|
||
#include <QOpenGLFunctions>
|
||
#include <QOpenGLShaderProgram>
|
||
#include <QOpenGLBuffer>
|
||
#include <QOpenGLVertexArrayObject>
|
||
#include <QMatrix4x4>
|
||
#include <QVector3D>
|
||
#include <QMouseEvent>
|
||
#include <QWheelEvent>
|
||
#include <pcl/point_cloud.h>
|
||
#include <pcl/point_types.h>
|
||
#include <vector>
|
||
|
||
class PointCloudGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
|
||
{
|
||
Q_OBJECT
|
||
|
||
public:
|
||
explicit PointCloudGLWidget(QWidget *parent = nullptr);
|
||
~PointCloudGLWidget();
|
||
|
||
void updatePointCloud(pcl::PointCloud<pcl::PointXYZ>::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<float> 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
|