欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
要求
- 打开:打开一个点云并在树上展示
- 拟合:选择中一个点云,选择拟合类型,成功后会在右边渲染几何元素
- 基本信息:选择资源树上一个项目可以在属性栏展示基本信息
- 查看:通过打勾隐藏和显示某一项,可以对渲染框进行旋转和平移查看物体
- 重置中心:重置旋转中心为当前所有显示点云的中心
拟合理论资料
点击前往
类设计
代码链接:https://gitcode.com/chenbb1989/qt-opengl/tree/master/geoFitting
// 树节点
#ifndef TREEITEM_H
#define TREEITEM_H
#include <QObject>
#include <QTreeWidgetItem>
#include "../element/element.h"
class TreeItem : public QObject, public QTreeWidgetItem
{
Q_OBJECT
public:
explicit TreeItem(QObject *parent = nullptr);
void setEle(Element *);
void Draw(QOpenGLShaderProgram &shader);
Element *ele;
signals:
private:
};
#endif // TREEITEM_H
将几何元素与树结点相关联。
// 几何元素
enum ElementType {Cloud, Line, Plane, Circle, Cylinder, Cone};
class Element : public QObject, protected QOpenGLFunctions
{
Q_OBJECT
public:
Element(QObject *parent = nullptr);
virtual bool fit(const std::vector<Eigen::Vector3d>& points);
void loadGL(QOpenGLWidget *gl);
virtual void Draw(QOpenGLShaderProgram &shader)=0;
virtual QString Info()=0;
std::vector<Eigen::Vector3d> vertices; // 存储点集
signals:
protected:
QOpenGLVertexArrayObject VAO;
QOpenGLBuffer EBO;
QOpenGLBuffer VBO;
ElementType type;
std::vector<int> index; // 存储类型
double len;
};
元素可以通过点云来拟合,调用gl方法来准备数据,渲染时调用draw。
交互设计
- 渲染:树监听opengl的paintGL事件,检查打勾项目并渲染。
- 查看:通过鼠标移动改变旋转角度,滚轮控制大小,wasd控制平移。
- 选择项目:监控树选择项目,显示项目基本信息。
- 重置中心:计算当前所有选择点云的中心,重置渲染组件的中心。
效果展示
视频链接:
高斯点云拟合几何元素
直线拟合:
平面拟合:
圆拟合:
圆柱拟合:
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接。