diff --git a/.gitignore b/.gitignore
index a4fb4fb1259d0ad25a8cb9e10cda46a64d51d2e0..f19862923a0ae64119b2e63152400d03ca56cab2 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 0000000000000000000000000000000000000000..fa46f9947e8526043c33680f505bddbf88ed781e
--- /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 eac67e8b0c4ce15d0c84ee859f5589a7f9047f31..ea3154b3914665e32fccae1646691afa25061d17 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 0000000000000000000000000000000000000000..433566aa700a8097d7967abb810756139840dc90
--- /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 0000000000000000000000000000000000000000..511a436c155551ad4ab62aba0165a60603d96b45
--- /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