gldemo
PointCloudRenderer.h
1 #pragma once
2 #include "Renderer.h"
3 #include <assert.h>
4 #include <vector>
5 
6 #include "vertex.h"
7 #include "nanoflann.hpp"
8 
9 
15 public:
17  std::vector<Vertex> vertices;
18  VerticesAdaptor() {
19  }
20  // Must return the number of data poins
22  inline size_t kdtree_get_point_count() const {
23  size_t res = vertices.size();
24  return res;
25  }
26  // Must return the dim'th component of the idx'th point in the class:
28  inline float kdtree_get_pt(const size_t idx, int dim) const {
29  if (dim == 0) return vertices[idx].position().x();
30  if (dim == 1) return vertices[idx].position().y();
31  if (dim == 2) return vertices[idx].position().z();
32  return 0;
33  }
34  // 不计算bbox,返回false
35  template <class BBOX>
36  bool kdtree_get_bbox(BBOX &bb) const
37  {
38  return false;
39  }
40 
41 };
42 
43 // nanoflann查询用模板定义
44 typedef nanoflann::KDTreeSingleIndexAdaptor<
45  nanoflann::L2_Simple_Adaptor<float, VerticesAdaptor>,
47  3 /* dim */
48 > kd_tree_t;
49 
50 
51 
52 // 渲染点云
58  public Renderer
59 {
60 
61 private:
62 
64  void applyVertices();
65 
66  QOpenGLBuffer* m_vertexBuffer = NULL;
67  bool modified = false;
68 
69  std::vector<Vertex> vertices;
70 
72  kd_tree_t* kdtree;
73  VerticesAdaptor adaptor;
74 
75 
76 public:
78  QString name() const override { return "PointCloudRenderer"; };
80  QOpenGLShaderProgram* shader = NULL;
81 
82  //ctor
85 
86  void onRender(OpenGLFunctions* gl, glm::mat4 projection, glm::mat4 view, glm::mat4 model) override;
87 
89  void setVertices(const std::vector<Vertex>& vertices);
90 
92  int vertexCount();
94  Vertex getVertex(int i);
95 
97  size_t nearestSearch(QVector3D pos);
98 
100  std::vector<size_t> nearestSearch(QVector3D pos, int k);
101 
103  std::vector<Vertex> getVertices();
104 };
105 
std::vector< Vertex > vertices
存储要访问的顶点数据
Definition: PointCloudRenderer.h:17
Definition: vertex.h:8
Definition: Renderer.h:18
QString name() const override
"PointCloudRenderer"
Definition: PointCloudRenderer.h:78
点云渲染器
Definition: PointCloudRenderer.h:57
float kdtree_get_pt(const size_t idx, int dim) const
返回顶点数据
Definition: PointCloudRenderer.h:28
kd_tree_t * kdtree
指向kdtree索引的指针
Definition: PointCloudRenderer.h:72
nanoflann的kd树接口实现
Definition: PointCloudRenderer.h:14
size_t kdtree_get_point_count() const
返回顶点数量
Definition: PointCloudRenderer.h:22