From 057a1392932f6052f47a769097ea7ca3c32f4516 Mon Sep 17 00:00:00 2001 From: "bocska.karina" <bocska.karina@hallgato.ppke.hu> Date: Sat, 24 Aug 2024 21:32:44 +0200 Subject: [PATCH] generate tetrahedron mesh --- .gitignore | 1 + headers/tetrahedronGenerator.hpp | 77 +++++++++++++++++++ main.cpp | 7 +- pointClouds/tetrahedron_downsampled_trafo.fbx | 3 + pointClouds/tetrahedron_downsampled_trafo.obj | 3 + 5 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 headers/tetrahedronGenerator.hpp create mode 100644 pointClouds/tetrahedron_downsampled_trafo.fbx create mode 100644 pointClouds/tetrahedron_downsampled_trafo.obj diff --git a/.gitignore b/.gitignore index a4fb4fb..f198629 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build/ .cache/ +*.ply diff --git a/headers/tetrahedronGenerator.hpp b/headers/tetrahedronGenerator.hpp new file mode 100644 index 0000000..fa46f99 --- /dev/null +++ b/headers/tetrahedronGenerator.hpp @@ -0,0 +1,77 @@ +#ifndef TETRAHEDRONGENERATOR_HPP +#define TETRAHEDRONGENERATOR_HPP + +#include "pcl/common/distances.h" +#include <fstream> +#include <pcl/impl/point_types.hpp> +#include <pcl/io/ply_io.h> +#include <pcl/point_cloud.h> + +inline std::vector<pcl::PointXYZ> +calculateTetrahedronVertices(float trisize, float x, float y, float z) { + // float trisize = 0.06; + float z_trisize = trisize + 0.04; + float pi = 3.14; + + pcl::PointXYZ A(x, y, z + 2 * trisize / 3); + pcl::PointXYZ B(x + trisize * cos(0.0 / 3 * 2 * pi), + y + trisize * sin(0.0 / 3 * 2 * pi), z - z_trisize / 3); + pcl::PointXYZ C(x + trisize * cos(1.0 / 3 * 2 * pi), + y + trisize * sin(1.0 / 3 * 2 * pi), z - z_trisize / 3); + pcl::PointXYZ D(x + trisize * cos(2.0 / 3 * 2 * pi), + y + trisize * sin(2.0 / 3 * 2 * pi), z - z_trisize / 3); + + std::vector<pcl::PointXYZ> ret; + ret.emplace_back(A); + ret.emplace_back(B); + ret.emplace_back(C); + ret.emplace_back(D); + + return ret; +} + +inline void createTetrahedronModel(std::string plyFile) { + // load pcl cloud + pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud( + new pcl::PointCloud<pcl::PointXYZRGB>()); + pcl::io::loadPLYFile("../pointClouds/" + plyFile, *cloud); + + // create and open output obj file + std::fstream fout; + fout.open("../pointClouds/tetrahedron_" + + plyFile.substr(0, plyFile.length() - 4) + ".obj", + std::ios::out); + + if (!fout) { + std::cout << "file cannot be opened" << std::endl; + return; + } + + // set trisize according to distance of the points + float dist = pcl::euclideanDistance(cloud->points[0], cloud->points[1]); + dist *= 0.2f; + + int i = 1; + for (pcl::PointXYZRGB &pt : cloud->points) { + std::vector<pcl::PointXYZ> vertex = + calculateTetrahedronVertices(dist, pt.x, pt.y, pt.z); + + // write the vertices into the obj file + for (pcl::PointXYZ &vpt : vertex) { + fout << "v " << vpt.x << " " << vpt.y << " " << vpt.z << " " + << pt.r / 255.0 << " " << pt.g / 255.0 << " " << pt.b / 255.0 + << std::endl; + } + + // write the faces + fout << "f " << i << " " << i + 1 << " " << i + 2 << std::endl; + fout << "f " << i << " " << i + 2 << " " << i + 3 << std::endl; + fout << "f " << i << " " << i + 3 << " " << i + 1 << std::endl; + fout << "f " << i + 1 << " " << i + 3 << " " << i + 2 << std::endl; + i += 4; + } + + fout.close(); +} + +#endif // !TETRAHEDRONGENERATOR_HPP diff --git a/main.cpp b/main.cpp index eac67e8..ea3154b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,11 @@ +#include "tetrahedronGenerator.hpp" #include "voxelfilter.hpp" int main() { - voxelGridFilter("trafo.ply"); + // 1st reduce file size + // voxelGridFilter("trafo.ply"); + + // 2nd write obj file with tetrahedrons + createTetrahedronModel("downsampled_trafo.ply"); return 0; } diff --git a/pointClouds/tetrahedron_downsampled_trafo.fbx b/pointClouds/tetrahedron_downsampled_trafo.fbx new file mode 100644 index 0000000..433566a --- /dev/null +++ b/pointClouds/tetrahedron_downsampled_trafo.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f2b809037064893f9007d18c267bda34f48e19678a09dfd218864c5c825afc3 +size 2327292 diff --git a/pointClouds/tetrahedron_downsampled_trafo.obj b/pointClouds/tetrahedron_downsampled_trafo.obj new file mode 100644 index 0000000..511a436 --- /dev/null +++ b/pointClouds/tetrahedron_downsampled_trafo.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83412fd727cd76f4fc60d2c0c12c7d9f6da678b5a0de7b018d0df0162cb5d2c0 +size 7604927 -- GitLab