82 const Eigen::Vector3i &index_3d,
90 if (leaf_node[4] <
iso_level_) cubeindex |= 16;
91 if (leaf_node[5] <
iso_level_) cubeindex |= 32;
92 if (leaf_node[6] <
iso_level_) cubeindex |= 64;
93 if (leaf_node[7] <
iso_level_) cubeindex |= 128;
102 std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > p;
104 for (
int i = 0; i < 8; ++i)
106 Eigen::Vector3f point = center;
108 point[1] =
static_cast<float> (center[1] +
size_voxel_[1]);
111 point[2] =
static_cast<float> (center[2] +
size_voxel_[2]);
113 if ((i & 0x1) ^ ((i >> 1) & 0x1))
114 point[0] =
static_cast<float> (center[0] +
size_voxel_[0]);
120 std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > vertex_list;
121 vertex_list.resize (12);
123 interpolateEdge (p[0], p[1], leaf_node[0], leaf_node[1], vertex_list[0]);
125 interpolateEdge (p[1], p[2], leaf_node[1], leaf_node[2], vertex_list[1]);
127 interpolateEdge (p[2], p[3], leaf_node[2], leaf_node[3], vertex_list[2]);
129 interpolateEdge (p[3], p[0], leaf_node[3], leaf_node[0], vertex_list[3]);
131 interpolateEdge (p[4], p[5], leaf_node[4], leaf_node[5], vertex_list[4]);
133 interpolateEdge (p[5], p[6], leaf_node[5], leaf_node[6], vertex_list[5]);
135 interpolateEdge (p[6], p[7], leaf_node[6], leaf_node[7], vertex_list[6]);
137 interpolateEdge (p[7], p[4], leaf_node[7], leaf_node[4], vertex_list[7]);
139 interpolateEdge (p[0], p[4], leaf_node[0], leaf_node[4], vertex_list[8]);
141 interpolateEdge (p[1], p[5], leaf_node[1], leaf_node[5], vertex_list[9]);
143 interpolateEdge (p[2], p[6], leaf_node[2], leaf_node[6], vertex_list[10]);
145 interpolateEdge (p[3], p[7], leaf_node[3], leaf_node[7], vertex_list[11]);
148 for (
int i = 0;
triTable[cubeindex][i] != -1; i += 3)
151 p1.getVector3fMap () = vertex_list[
triTable[cubeindex][i]];
153 p2.getVector3fMap () = vertex_list[
triTable[cubeindex][i+1]];
155 p3.getVector3fMap () = vertex_list[
triTable[cubeindex][i+2]];
164 Eigen::Vector3i &index3d)
169 leaf[1] =
getGridValue (index3d + Eigen::Vector3i (1, 0, 0));
170 leaf[2] =
getGridValue (index3d + Eigen::Vector3i (1, 0, 1));
171 leaf[3] =
getGridValue (index3d + Eigen::Vector3i (0, 0, 1));
172 leaf[4] =
getGridValue (index3d + Eigen::Vector3i (0, 1, 0));
173 leaf[5] =
getGridValue (index3d + Eigen::Vector3i (1, 1, 0));
174 leaf[6] =
getGridValue (index3d + Eigen::Vector3i (1, 1, 1));
175 leaf[7] =
getGridValue (index3d + Eigen::Vector3i (0, 1, 1));
177 for (
int i = 0; i < 8; ++i)
179 if (std::isnan (leaf[i]))
219 std::vector<pcl::Vertices> &polygons)
221 if (iso_level_ < 0 || iso_level_ >= 1)
223 PCL_ERROR (
"[pcl::%s::performReconstruction] Invalid iso level %f! Please use a number between 0 and 1.\n",
246 double size_reserve = std::min(
static_cast<double>(intermediate_cloud.
points.max_size ()),
248 intermediate_cloud.
reserve (
static_cast<std::size_t
>(size_reserve));
250 for (
int x = 1; x <
res_x_-1; ++x)
251 for (
int y = 1; y <
res_y_-1; ++y)
252 for (
int z = 1; z <
res_z_-1; ++z)
254 Eigen::Vector3i index_3d (x, y, z);
255 std::vector<float> leaf_node;
257 if (!leaf_node.empty ())
261 points.
swap (intermediate_cloud);
263 polygons.resize (points.
size () / 3);
264 for (std::size_t i = 0; i < polygons.size (); ++i)
268 for (
int j = 0; j < 3; ++j)
269 v.
vertices[j] =
static_cast<int> (i) * 3 + j;
void interpolateEdge(Eigen::Vector3f &p1, Eigen::Vector3f &p2, float val_p1, float val_p2, Eigen::Vector3f &output)
Interpolate along the voxel edge.
void createSurface(const std::vector< float > &leaf_node, const Eigen::Vector3i &index_3d, pcl::PointCloud< PointNT > &cloud)
Calculate out the corresponding polygons in the leaf node.
void getMinMax3D(const pcl::PointCloud< PointT > &cloud, PointT &min_pt, PointT &max_pt)
Get the minimum and maximum values on each of the 3 (x-y-z) dimensions in a given pointcloud.
void toPCLPointCloud2(const pcl::PointCloud< PointT > &cloud, pcl::PCLPointCloud2 &msg, bool padding)
Convert a pcl::PointCloud<T> object to a PCLPointCloud2 binary data blob.