Files
d330viewer/include/gui/PointCloudGLWidget.h

82 lines
2.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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