void MeshConversion::convert(const pcl::PolygonMesh& pclMesh, Mesh::MeshObject& meshObject) { // number of points size_t nr_points = pclMesh.cloud.width * pclMesh.cloud.height; size_t point_size = pclMesh.cloud.data.size () / nr_points; // number of faces for header size_t nr_faces = pclMesh.polygons.size (); MeshCore::MeshPointArray points; points.reserve(nr_points); MeshCore::MeshFacetArray facets; facets.reserve(nr_faces); // get vertices MeshCore::MeshPoint vertex; for (size_t i = 0; i < nr_points; ++i) { int xyz = 0; for (size_t d = 0; d < pclMesh.cloud.fields.size(); ++d) { int c = 0; // adding vertex if ((pclMesh.cloud.fields[d].datatype == #if PCL_VERSION_COMPARE(>,1,6,0) pcl::PCLPointField::FLOAT32) && #else sensor_msgs::PointField::FLOAT32) && #endif (pclMesh.cloud.fields[d].name == "x" || pclMesh.cloud.fields[d].name == "y" || pclMesh.cloud.fields[d].name == "z")) { float value; memcpy (&value, &pclMesh.cloud.data[i * point_size + pclMesh.cloud.fields[d].offset + c * sizeof (float)], sizeof (float)); vertex[xyz] = value; if (++xyz == 3) { points.push_back(vertex); break; } } } } // get faces MeshCore::MeshFacet face; for (size_t i = 0; i < nr_faces; i++) { face._aulPoints[0] = pclMesh.polygons[i].vertices[0]; face._aulPoints[1] = pclMesh.polygons[i].vertices[1]; face._aulPoints[2] = pclMesh.polygons[i].vertices[2]; facets.push_back(face); } MeshCore::MeshKernel kernel; kernel.Adopt(points, facets, true); meshObject.swap(kernel); meshObject.harmonizeNormals(); }
PyObject* MeshFeaturePy::harmonizeNormals(PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; PY_TRY { Mesh::MeshObject *mesh = getFeaturePtr()->Mesh.startEditing(); mesh->harmonizeNormals(); getFeaturePtr()->Mesh.finishEditing(); } PY_CATCH; Py_Return; }