Open3D (C++ API)  0.19.0
TriangleMesh.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.open3d.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <Eigen/Core>
11 #include <memory>
12 #include <numeric>
13 #include <tuple>
14 #include <unordered_map>
15 #include <unordered_set>
16 #include <vector>
17 
18 #include "open3d/geometry/Image.h"
20 #include "open3d/utility/Helper.h"
21 
22 namespace open3d {
23 namespace geometry {
24 
25 class PointCloud;
26 class TetraMesh;
27 
35 class TriangleMesh : public MeshBase {
36 public:
43  TriangleMesh(const std::vector<Eigen::Vector3d> &vertices,
44  const std::vector<Eigen::Vector3i> &triangles)
46  triangles_(triangles) {}
47  ~TriangleMesh() override {}
48 
49 public:
50  virtual TriangleMesh &Clear() override;
51  virtual TriangleMesh &Transform(
52  const Eigen::Matrix4d &transformation) override;
53  virtual TriangleMesh &Rotate(const Eigen::Matrix3d &R,
54  const Eigen::Vector3d &center) override;
55 
56 public:
57  TriangleMesh &operator+=(const TriangleMesh &mesh);
58  TriangleMesh operator+(const TriangleMesh &mesh) const;
59 
61  bool HasTriangles() const {
62  return vertices_.size() > 0 && triangles_.size() > 0;
63  }
64 
66  bool HasTriangleNormals() const {
67  return HasTriangles() && triangles_.size() == triangle_normals_.size();
68  }
69 
71  bool HasAdjacencyList() const {
72  return vertices_.size() > 0 &&
73  adjacency_list_.size() == vertices_.size();
74  }
75 
76  bool HasTriangleUvs() const {
77  return HasTriangles() && triangle_uvs_.size() == 3 * triangles_.size();
78  }
79 
81  bool HasTextures() const {
82  bool is_all_texture_valid = std::accumulate(
83  textures_.begin(), textures_.end(), true,
84  [](bool a, const Image &b) { return a && !b.IsEmpty(); });
85  return !textures_.empty() && is_all_texture_valid;
86  }
87 
88  bool HasMaterials() const { return !materials_.empty(); }
89 
90  bool HasTriangleMaterialIds() const {
91  return HasTriangles() &&
92  triangle_material_ids_.size() == triangles_.size();
93  }
94 
98  for (size_t i = 0; i < triangle_normals_.size(); i++) {
99  triangle_normals_[i].normalize();
100  if (std::isnan(triangle_normals_[i](0))) {
101  triangle_normals_[i] = Eigen::Vector3d(0.0, 0.0, 1.0);
102  }
103  }
104  return *this;
105  }
106 
109  TriangleMesh &ComputeTriangleNormals(bool normalized = true);
110 
113  TriangleMesh &ComputeVertexNormals(bool normalized = true);
114 
118 
122 
127 
131 
137 
143 
150  TriangleMesh &MergeCloseVertices(double eps);
151 
161  std::shared_ptr<TriangleMesh> FilterSharpen(
162  int number_of_iterations,
163  double strength,
164  FilterScope scope = FilterScope::All) const;
165 
174  std::shared_ptr<TriangleMesh> FilterSmoothSimple(
175  int number_of_iterations,
176  FilterScope scope = FilterScope::All) const;
177 
189  std::shared_ptr<TriangleMesh> FilterSmoothLaplacian(
190  int number_of_iterations,
191  double lambda_filter,
192  FilterScope scope = FilterScope::All) const;
193 
204  std::shared_ptr<TriangleMesh> FilterSmoothTaubin(
205  int number_of_iterations,
206  double lambda_filter = 0.5,
207  double mu = -0.53,
208  FilterScope scope = FilterScope::All) const;
209 
213  int EulerPoincareCharacteristic() const;
214 
218  std::vector<Eigen::Vector2i> GetNonManifoldEdges(
219  bool allow_boundary_edges = true) const;
220 
225  bool IsEdgeManifold(bool allow_boundary_edges = true) const;
226 
230  std::vector<int> GetNonManifoldVertices() const;
231 
235  bool IsVertexManifold() const;
236 
239  std::vector<Eigen::Vector2i> GetSelfIntersectingTriangles() const;
240 
243  bool IsSelfIntersecting() const;
244 
247  bool IsBoundingBoxIntersecting(const TriangleMesh &other) const;
248 
251  bool IsIntersecting(const TriangleMesh &other) const;
252 
256  bool IsOrientable() const;
257 
261  bool IsWatertight() const;
262 
266  bool OrientTriangles();
267 
270  std::unordered_map<Eigen::Vector2i,
271  std::vector<int>,
273  GetEdgeToTrianglesMap() const;
274 
277  std::unordered_map<Eigen::Vector2i,
278  std::vector<int>,
280  GetEdgeToVerticesMap() const;
281 
283  static double ComputeTriangleArea(const Eigen::Vector3d &p0,
284  const Eigen::Vector3d &p1,
285  const Eigen::Vector3d &p2);
286 
289  double GetTriangleArea(size_t triangle_idx) const;
290 
291  static inline Eigen::Vector3i GetOrderedTriangle(int vidx0,
292  int vidx1,
293  int vidx2) {
294  if (vidx0 > vidx2) {
295  std::swap(vidx0, vidx2);
296  }
297  if (vidx0 > vidx1) {
298  std::swap(vidx0, vidx1);
299  }
300  if (vidx1 > vidx2) {
301  std::swap(vidx1, vidx2);
302  }
303  return Eigen::Vector3i(vidx0, vidx1, vidx2);
304  }
305 
308  double GetSurfaceArea() const;
309 
312  double GetSurfaceArea(std::vector<double> &triangle_areas) const;
313 
318  double GetVolume() const;
319 
323  static Eigen::Vector4d ComputeTrianglePlane(const Eigen::Vector3d &p0,
324  const Eigen::Vector3d &p1,
325  const Eigen::Vector3d &p2);
326 
329  Eigen::Vector4d GetTrianglePlane(size_t triangle_idx) const;
330 
332  static inline Eigen::Vector2i GetOrderedEdge(int vidx0, int vidx1) {
333  return Eigen::Vector2i(std::min(vidx0, vidx1), std::max(vidx0, vidx1));
334  }
335 
338  std::shared_ptr<PointCloud> SamplePointsUniformlyImpl(
339  size_t number_of_points,
340  const std::vector<double> &triangle_areas,
341  bool use_triangle_normal);
342 
349  std::shared_ptr<PointCloud> SamplePointsUniformly(
350  size_t number_of_points, bool use_triangle_normal = false);
351 
364  std::shared_ptr<PointCloud> SamplePointsPoissonDisk(
365  size_t number_of_points,
366  double init_factor = 5,
367  const std::shared_ptr<PointCloud> pcl_init = nullptr,
368  bool use_triangle_normal = false);
369 
375  std::shared_ptr<TriangleMesh> SubdivideMidpoint(
376  int number_of_iterations) const;
377 
383  std::shared_ptr<TriangleMesh> SubdivideLoop(int number_of_iterations) const;
384 
391  std::shared_ptr<TriangleMesh> SimplifyVertexClustering(
392  double voxel_size,
393  SimplificationContraction contraction =
395 
405  std::shared_ptr<TriangleMesh> SimplifyQuadricDecimation(
406  int target_number_of_triangles,
407  double maximum_error,
408  double boundary_weight) const;
409 
419  std::shared_ptr<TriangleMesh> SelectByIndex(
420  const std::vector<size_t> &indices, bool cleanup = true) const;
421 
426  std::shared_ptr<TriangleMesh> Crop(
427  const AxisAlignedBoundingBox &bbox) const;
428 
433  std::shared_ptr<TriangleMesh> Crop(const OrientedBoundingBox &bbox) const;
434 
441  std::tuple<std::vector<int>, std::vector<size_t>, std::vector<double>>
443 
450  void RemoveTrianglesByIndex(const std::vector<size_t> &triangle_indices);
451 
458  void RemoveTrianglesByMask(const std::vector<bool> &triangle_mask);
459 
466  void RemoveVerticesByIndex(const std::vector<size_t> &vertex_indices);
467 
474  void RemoveVerticesByMask(const std::vector<bool> &vertex_mask);
475 
489  std::shared_ptr<TriangleMesh> DeformAsRigidAsPossible(
490  const std::vector<int> &constraint_vertex_indices,
491  const std::vector<Eigen::Vector3d> &constraint_vertex_positions,
492  size_t max_iter,
495  double smoothed_alpha = 0.01) const;
496 
508  static std::shared_ptr<TriangleMesh> CreateFromPointCloudAlphaShape(
509  const PointCloud &pcd,
510  double alpha,
511  std::shared_ptr<TetraMesh> tetra_mesh = nullptr,
512  std::vector<size_t> *pt_map = nullptr);
513 
527  static std::shared_ptr<TriangleMesh> CreateFromPointCloudBallPivoting(
528  const PointCloud &pcd, const std::vector<double> &radii);
529 
552  static std::tuple<std::shared_ptr<TriangleMesh>, std::vector<double>>
554  size_t depth = 8,
555  float width = 0.0f,
556  float scale = 1.1f,
557  bool linear_fit = false,
558  int n_threads = -1);
559 
565  static std::shared_ptr<TriangleMesh> CreateTetrahedron(
566  double radius = 1.0, bool create_uv_map = false);
567 
573  static std::shared_ptr<TriangleMesh> CreateOctahedron(
574  double radius = 1.0, bool create_uv_map = false);
575 
580  static std::shared_ptr<TriangleMesh> CreateIcosahedron(
581  double radius = 1.0, bool create_uv_map = false);
582 
587  static std::shared_ptr<TriangleMesh> CreateFromOrientedBoundingBox(
588  const OrientedBoundingBox &obox,
589  const Eigen::Vector3d &scale = Eigen::Vector3d::Ones(),
590  bool create_uv_map = false);
591 
598  static std::shared_ptr<TriangleMesh> CreateFromOrientedBoundingEllipsoid(
599  const OrientedBoundingEllipsoid &obel,
600  const Eigen::Vector3d &scale = Eigen::Vector3d::Ones(),
601  int resolution = 20,
602  bool create_uv_map = false);
603 
612  static std::shared_ptr<TriangleMesh> CreateBox(
613  double width = 1.0,
614  double height = 1.0,
615  double depth = 1.0,
616  bool create_uv_map = false,
617  bool map_texture_to_each_face = false);
618 
629  static std::shared_ptr<TriangleMesh> CreateSphere(
630  double radius = 1.0,
631  int resolution = 20,
632  bool create_uv_map = false);
633 
641  static std::shared_ptr<TriangleMesh> CreateEllipsoid(
642  double radius_x = 1.0,
643  double radius_y = 1.0,
644  double radius_z = 1.0,
645  int resolution = 20,
646  bool create_uv_map = false);
647 
659  static std::shared_ptr<TriangleMesh> CreateCylinder(
660  double radius = 1.0,
661  double height = 2.0,
662  int resolution = 20,
663  int split = 4,
664  bool create_uv_map = false);
665 
676  static std::shared_ptr<TriangleMesh> CreateCone(double radius = 1.0,
677  double height = 2.0,
678  int resolution = 20,
679  int split = 1,
680  bool create_uv_map = false);
681 
695  static std::shared_ptr<TriangleMesh> CreateTorus(
696  double torus_radius = 1.0,
697  double tube_radius = 0.5,
698  int radial_resolution = 30,
699  int tubular_resolution = 20);
700 
711  //
725  static std::shared_ptr<TriangleMesh> CreateArrow(
726  double cylinder_radius = 1.0,
727  double cone_radius = 1.5,
728  double cylinder_height = 5.0,
729  double cone_height = 4.0,
730  int resolution = 20,
731  int cylinder_split = 4,
732  int cone_split = 1);
733 
739  static std::shared_ptr<TriangleMesh> CreateCoordinateFrame(
740  double size = 1.0,
741  const Eigen::Vector3d &origin = Eigen::Vector3d(0.0, 0.0, 0.0));
742 
753  static std::shared_ptr<TriangleMesh> CreateMobius(int length_split = 70,
754  int width_split = 15,
755  int twists = 1,
756  double radius = 1,
757  double flatness = 1,
758  double width = 1,
759  double scale = 1);
760 
761 protected:
762  // Forward child class type to avoid indirect nonvirtual base
764 
766  std::shared_ptr<TriangleMesh> &mesh,
767  const std::vector<Eigen::Vector3d> &prev_vertices,
768  const std::vector<Eigen::Vector3d> &prev_vertex_normals,
769  const std::vector<Eigen::Vector3d> &prev_vertex_colors,
770  const std::vector<std::unordered_set<int>> &adjacency_list,
771  double lambda_filter,
772  bool filter_vertex,
773  bool filter_normal,
774  bool filter_color) const;
775 
784  std::unordered_map<Eigen::Vector2i,
785  double,
788  const std::unordered_map<Eigen::Vector2i,
789  std::vector<int>,
791  &edges_to_vertices,
792  double min_weight = std::numeric_limits<double>::lowest()) const;
793 
794 public:
796  std::vector<Eigen::Vector3i> triangles_;
798  std::vector<Eigen::Vector3d> triangle_normals_;
801  std::vector<std::unordered_set<int>> adjacency_list_;
803  std::vector<Eigen::Vector2d> triangle_uvs_;
804 
805  struct Material {
807  float f4[4] = {0};
808 
810  f4[0] = 0;
811  f4[1] = 0;
812  f4[2] = 0;
813  f4[3] = 0;
814  }
815 
816  MaterialParameter(const float v1,
817  const float v2,
818  const float v3,
819  const float v4) {
820  f4[0] = v1;
821  f4[1] = v2;
822  f4[2] = v3;
823  f4[3] = v4;
824  }
825 
826  MaterialParameter(const float v1, const float v2, const float v3) {
827  f4[0] = v1;
828  f4[1] = v2;
829  f4[2] = v3;
830  f4[3] = 1;
831  }
832 
833  MaterialParameter(const float v1, const float v2) {
834  f4[0] = v1;
835  f4[1] = v2;
836  f4[2] = 0;
837  f4[3] = 0;
838  }
839 
840  explicit MaterialParameter(const float v1) {
841  f4[0] = v1;
842  f4[1] = 0;
843  f4[2] = 0;
844  f4[3] = 0;
845  }
846 
847  static MaterialParameter CreateRGB(const float r,
848  const float g,
849  const float b) {
850  return {r, g, b, 1.f};
851  }
852 
853  float r() const { return f4[0]; }
854  float g() const { return f4[1]; }
855  float b() const { return f4[2]; }
856  float a() const { return f4[3]; }
857  };
858 
860  float baseMetallic = 0.f;
861  float baseRoughness = 1.f;
862  float baseReflectance = 0.5f;
863  float baseClearCoat = 0.f;
865  float baseAnisotropy = 0.f;
866 
867  std::shared_ptr<Image> albedo;
868  std::shared_ptr<Image> normalMap;
869  std::shared_ptr<Image> ambientOcclusion;
870  std::shared_ptr<Image> metallic;
871  std::shared_ptr<Image> roughness;
872  std::shared_ptr<Image> reflectance;
873  std::shared_ptr<Image> clearCoat;
874  std::shared_ptr<Image> clearCoatRoughness;
875  std::shared_ptr<Image> anisotropy;
876 
877  std::unordered_map<std::string, MaterialParameter> floatParameters;
878  std::unordered_map<std::string, Image> additionalMaps;
879  };
880 
881  std::vector<std::pair<std::string, Material>> materials_;
882 
884  std::vector<int> triangle_material_ids_;
886  std::vector<Image> textures_;
887 };
888 
889 } // namespace geometry
890 } // namespace open3d
A bounding box that is aligned along the coordinate axes and defined by the min_bound and max_bound.
Definition: BoundingVolume.h:285
The base geometry class.
Definition: Geometry.h:18
GeometryType
Specifies possible geometry types.
Definition: Geometry.h:23
The Image class stores image with customizable width, height, num of channels and bytes per channel.
Definition: Image.h:34
MeshBash Class.
Definition: MeshBase.h:33
std::vector< Eigen::Vector3d > vertices_
Vertex coordinates.
Definition: MeshBase.h:158
DeformAsRigidAsPossibleEnergy
Definition: MeshBase.h:58
SimplificationContraction
Indicates the method that is used for mesh simplification if multiple vertices are combined to a sing...
Definition: MeshBase.h:43
MeshBase & NormalizeNormals()
Normalize vertex normals to length 1.
Definition: MeshBase.h:127
FilterScope
Indicates the scope of filter operations.
Definition: MeshBase.h:52
A bounding box oriented along an arbitrary frame of reference.
Definition: BoundingVolume.h:138
Definition: BoundingVolume.h:20
A point cloud consists of point coordinates, and optionally point colors and point normals.
Definition: PointCloud.h:36
Triangle mesh contains vertices and triangles represented by the indices to the vertices.
Definition: TriangleMesh.h:35
virtual TriangleMesh & Rotate(const Eigen::Matrix3d &R, const Eigen::Vector3d &center) override
Apply rotation to the geometry coordinates and normals. Given a rotation matrix , and center ,...
Definition: TriangleMesh.cpp:46
bool IsBoundingBoxIntersecting(const TriangleMesh &other) const
Definition: TriangleMesh.cpp:1409
TriangleMesh(Geometry::GeometryType type)
Definition: TriangleMesh.h:763
TriangleMesh & RemoveNonManifoldEdges()
Function that removes all non-manifold edges, by successively deleting triangles with the smallest su...
Definition: TriangleMesh.cpp:845
std::vector< Image > textures_
Textures of the image.
Definition: TriangleMesh.h:886
static double ComputeTriangleArea(const Eigen::Vector3d &p0, const Eigen::Vector3d &p1, const Eigen::Vector3d &p2)
Function that computes the area of a mesh triangle.
Definition: TriangleMesh.cpp:1163
std::vector< std::pair< std::string, Material > > materials_
Definition: TriangleMesh.h:881
std::shared_ptr< TriangleMesh > SubdivideMidpoint(int number_of_iterations) const
Definition: TriangleMeshSubdivide.cpp:18
std::tuple< std::vector< int >, std::vector< size_t >, std::vector< double > > ClusterConnectedTriangles() const
Function that clusters connected triangles, i.e., triangles that are connected via edges are assigned...
Definition: TriangleMesh.cpp:1437
double GetVolume() const
Definition: TriangleMesh.cpp:1200
std::shared_ptr< TriangleMesh > SubdivideLoop(int number_of_iterations) const
Definition: TriangleMeshSubdivide.cpp:96
static std::shared_ptr< TriangleMesh > CreateIcosahedron(double radius=1.0, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:85
TriangleMesh & operator+=(const TriangleMesh &mesh)
Definition: TriangleMesh.cpp:53
std::shared_ptr< TriangleMesh > FilterSmoothTaubin(int number_of_iterations, double lambda_filter=0.5, double mu=-0.53, FilterScope scope=FilterScope::All) const
Function to smooth triangle mesh using method of Taubin, "Curve and Surface Smoothing Without Shrinka...
Definition: TriangleMesh.cpp:392
std::shared_ptr< PointCloud > SamplePointsUniformly(size_t number_of_points, bool use_triangle_normal=false)
Definition: TriangleMesh.cpp:515
std::vector< Eigen::Vector2i > GetSelfIntersectingTriangles() const
Definition: TriangleMesh.cpp:1360
std::shared_ptr< PointCloud > SamplePointsPoissonDisk(size_t number_of_points, double init_factor=5, const std::shared_ptr< PointCloud > pcl_init=nullptr, bool use_triangle_normal=false)
Definition: TriangleMesh.cpp:532
bool IsVertexManifold() const
Definition: TriangleMesh.cpp:1356
TriangleMesh & RemoveDuplicatedVertices()
Function that removes duplicated vertices, i.e., vertices that have identical coordinates.
Definition: TriangleMesh.cpp:677
std::vector< std::unordered_set< int > > adjacency_list_
Definition: TriangleMesh.h:801
static std::shared_ptr< TriangleMesh > CreateMobius(int length_split=70, int width_split=15, int twists=1, double radius=1, double flatness=1, double width=1, double scale=1)
Definition: TriangleMeshFactory.cpp:1041
bool IsEdgeManifold(bool allow_boundary_edges=true) const
Definition: TriangleMesh.cpp:1287
void RemoveTrianglesByIndex(const std::vector< size_t > &triangle_indices)
This function removes the triangles with index in triangle_indices. Call RemoveUnreferencedVertices t...
Definition: TriangleMesh.cpp:1503
static Eigen::Vector4d ComputeTrianglePlane(const Eigen::Vector3d &p0, const Eigen::Vector3d &p1, const Eigen::Vector3d &p2)
Definition: TriangleMesh.cpp:1234
bool HasTriangles() const
Returns true if the mesh contains triangles.
Definition: TriangleMesh.h:61
TriangleMesh & ComputeVertexNormals(bool normalized=true)
Function to compute vertex normals, usually called before rendering.
Definition: TriangleMesh.cpp:131
void RemoveVerticesByIndex(const std::vector< size_t > &vertex_indices)
This function removes the vertices with index in vertex_indices. Note that also all triangles associa...
Definition: TriangleMesh.cpp:1554
static std::shared_ptr< TriangleMesh > CreateCone(double radius=1.0, double height=2.0, int resolution=20, int split=1, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:780
static std::tuple< std::shared_ptr< TriangleMesh >, std::vector< double > > CreateFromPointCloudPoisson(const PointCloud &pcd, size_t depth=8, float width=0.0f, float scale=1.1f, bool linear_fit=false, int n_threads=-1)
Function that computes a triangle mesh from an oriented PointCloud pcd. This implements the Screened ...
Definition: SurfaceReconstructionPoisson.cpp:719
static std::shared_ptr< TriangleMesh > CreateEllipsoid(double radius_x=1.0, double radius_y=1.0, double radius_z=1.0, int resolution=20, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:398
virtual TriangleMesh & Clear() override
Clear all elements in the geometry.
Definition: TriangleMesh.cpp:27
TriangleMesh & MergeCloseVertices(double eps)
Function that will merge close by vertices to a single one. The vertex position, normal and color wil...
Definition: TriangleMesh.cpp:925
static Eigen::Vector2i GetOrderedEdge(int vidx0, int vidx1)
Helper function to get an edge with ordered vertex indices.
Definition: TriangleMesh.h:332
std::shared_ptr< PointCloud > SamplePointsUniformlyImpl(size_t number_of_points, const std::vector< double > &triangle_areas, bool use_triangle_normal)
Definition: TriangleMesh.cpp:440
static std::shared_ptr< TriangleMesh > CreateFromPointCloudAlphaShape(const PointCloud &pcd, double alpha, std::shared_ptr< TetraMesh > tetra_mesh=nullptr, std::vector< size_t > *pt_map=nullptr)
Alpha shapes are a generalization of the convex hull. With decreasing alpha value the shape schrinks ...
Definition: SurfaceReconstructionAlphaShape.cpp:25
std::shared_ptr< TriangleMesh > SimplifyVertexClustering(double voxel_size, SimplificationContraction contraction=SimplificationContraction::Average) const
Definition: TriangleMeshSimplification.cpp:72
int EulerPoincareCharacteristic() const
Definition: TriangleMesh.cpp:1258
std::shared_ptr< TriangleMesh > SelectByIndex(const std::vector< size_t > &indices, bool cleanup=true) const
Definition: TriangleMesh.cpp:1615
std::unordered_map< Eigen::Vector2i, std::vector< int >, utility::hash_eigen< Eigen::Vector2i > > GetEdgeToTrianglesMap() const
Definition: TriangleMesh.cpp:1128
bool HasTriangleMaterialIds() const
Definition: TriangleMesh.h:90
void RemoveVerticesByMask(const std::vector< bool > &vertex_mask)
This function removes the vertices that are masked in vertex_mask. Note that also all triangles assoc...
Definition: TriangleMesh.cpp:1571
static std::shared_ptr< TriangleMesh > CreateFromPointCloudBallPivoting(const PointCloud &pcd, const std::vector< double > &radii)
Definition: SurfaceReconstructionBallPivoting.cpp:739
std::vector< Eigen::Vector2d > triangle_uvs_
List of uv coordinates per triangle.
Definition: TriangleMesh.h:803
void FilterSmoothLaplacianHelper(std::shared_ptr< TriangleMesh > &mesh, const std::vector< Eigen::Vector3d > &prev_vertices, const std::vector< Eigen::Vector3d > &prev_vertex_normals, const std::vector< Eigen::Vector3d > &prev_vertex_colors, const std::vector< std::unordered_set< int >> &adjacency_list, double lambda_filter, bool filter_vertex, bool filter_normal, bool filter_color) const
Definition: TriangleMesh.cpp:299
~TriangleMesh() override
Definition: TriangleMesh.h:47
virtual TriangleMesh & Transform(const Eigen::Matrix4d &transformation) override
Apply transformation (4x4 matrix) to the geometry coordinates.
Definition: TriangleMesh.cpp:40
static std::shared_ptr< TriangleMesh > CreateTetrahedron(double radius=1.0, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:15
bool IsOrientable() const
Definition: TriangleMesh.cpp:1109
std::unordered_map< Eigen::Vector2i, double, utility::hash_eigen< Eigen::Vector2i > > ComputeEdgeWeightsCot(const std::unordered_map< Eigen::Vector2i, std::vector< int >, utility::hash_eigen< Eigen::Vector2i >> &edges_to_vertices, double min_weight=std::numeric_limits< double >::lowest()) const
Function that computes for each edge in the triangle mesh and passed as parameter edges_to_vertices t...
Definition: TriangleMesh.cpp:1705
std::vector< Eigen::Vector3i > triangles_
List of triangles denoted by the index of points forming the triangle.
Definition: TriangleMesh.h:796
bool HasTextures() const
Returns true if the mesh has texture.
Definition: TriangleMesh.h:81
bool OrientTriangles()
Definition: TriangleMesh.cpp:1118
bool HasTriangleUvs() const
Definition: TriangleMesh.h:76
std::shared_ptr< TriangleMesh > Crop(const AxisAlignedBoundingBox &bbox) const
Definition: TriangleMesh.cpp:1681
std::vector< Eigen::Vector3d > triangle_normals_
Triangle normals.
Definition: TriangleMesh.h:798
static std::shared_ptr< TriangleMesh > CreateOctahedron(double radius=1.0, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:52
TriangleMesh & RemoveDuplicatedTriangles()
Function that removes duplicated triangles, i.e., removes triangles that reference the same three ver...
Definition: TriangleMesh.cpp:720
static std::shared_ptr< TriangleMesh > CreateFromOrientedBoundingBox(const OrientedBoundingBox &obox, const Eigen::Vector3d &scale=Eigen::Vector3d::Ones(), bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:142
std::vector< Eigen::Vector2i > GetNonManifoldEdges(bool allow_boundary_edges=true) const
Definition: TriangleMesh.cpp:1273
TriangleMesh & RemoveDegenerateTriangles()
Function that removes degenerate triangles, i.e., triangles that reference a single vertex multiple t...
Definition: TriangleMesh.cpp:815
std::shared_ptr< TriangleMesh > DeformAsRigidAsPossible(const std::vector< int > &constraint_vertex_indices, const std::vector< Eigen::Vector3d > &constraint_vertex_positions, size_t max_iter, DeformAsRigidAsPossibleEnergy energy=DeformAsRigidAsPossibleEnergy::Spokes, double smoothed_alpha=0.01) const
This function deforms the mesh using the method by Sorkine and Alexa, "As-Rigid-As-Possible Surface M...
Definition: TriangleMeshDeformation.cpp:19
static std::shared_ptr< TriangleMesh > CreateArrow(double cylinder_radius=1.0, double cone_radius=1.5, double cylinder_height=5.0, double cone_height=4.0, int resolution=20, int cylinder_split=4, int cone_split=1)
Definition: TriangleMeshFactory.cpp:959
TriangleMesh & RemoveUnreferencedVertices()
This function removes vertices from the triangle mesh that are not referenced in any triangle of the ...
Definition: TriangleMesh.cpp:772
std::shared_ptr< TriangleMesh > SimplifyQuadricDecimation(int target_number_of_triangles, double maximum_error, double boundary_weight) const
Definition: TriangleMeshSimplification.cpp:246
bool HasTriangleNormals() const
Returns true if the mesh contains triangle normals.
Definition: TriangleMesh.h:66
static std::shared_ptr< TriangleMesh > CreateCylinder(double radius=1.0, double height=2.0, int resolution=20, int split=4, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:624
static std::shared_ptr< TriangleMesh > CreateFromOrientedBoundingEllipsoid(const OrientedBoundingEllipsoid &obel, const Eigen::Vector3d &scale=Eigen::Vector3d::Ones(), int resolution=20, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:153
bool IsWatertight() const
Definition: TriangleMesh.cpp:1114
bool HasAdjacencyList() const
Returns true if the mesh contains adjacency normals.
Definition: TriangleMesh.h:71
bool IsIntersecting(const TriangleMesh &other) const
Definition: TriangleMesh.cpp:1414
TriangleMesh & NormalizeNormals()
Normalize both triangle normals and vertex normals to length 1.
Definition: TriangleMesh.h:96
double GetTriangleArea(size_t triangle_idx) const
Definition: TriangleMesh.cpp:1172
static std::shared_ptr< TriangleMesh > CreateTorus(double torus_radius=1.0, double tube_radius=0.5, int radial_resolution=30, int tubular_resolution=20)
Definition: TriangleMeshFactory.cpp:907
TriangleMesh & ComputeAdjacencyList()
Function to compute adjacency list, call before adjacency list is needed.
Definition: TriangleMesh.cpp:148
TriangleMesh(const std::vector< Eigen::Vector3d > &vertices, const std::vector< Eigen::Vector3i > &triangles)
Parameterized Constructor.
Definition: TriangleMesh.h:43
static Eigen::Vector3i GetOrderedTriangle(int vidx0, int vidx1, int vidx2)
Definition: TriangleMesh.h:291
std::shared_ptr< TriangleMesh > FilterSharpen(int number_of_iterations, double strength, FilterScope scope=FilterScope::All) const
Function to sharpen triangle mesh.
Definition: TriangleMesh.cpp:162
std::vector< int > triangle_material_ids_
List of material ids.
Definition: TriangleMesh.h:884
std::unordered_map< Eigen::Vector2i, std::vector< int >, utility::hash_eigen< Eigen::Vector2i > > GetEdgeToVerticesMap() const
Definition: TriangleMesh.cpp:1147
Eigen::Vector4d GetTrianglePlane(size_t triangle_idx) const
Definition: TriangleMesh.cpp:1250
std::shared_ptr< TriangleMesh > FilterSmoothSimple(int number_of_iterations, FilterScope scope=FilterScope::All) const
Function to smooth triangle mesh with simple neighbour average.
Definition: TriangleMesh.cpp:233
TriangleMesh operator+(const TriangleMesh &mesh) const
Definition: TriangleMesh.cpp:112
TriangleMesh()
Default Constructor.
Definition: TriangleMesh.h:38
bool IsSelfIntersecting() const
Definition: TriangleMesh.cpp:1405
static std::shared_ptr< TriangleMesh > CreateBox(double width=1.0, double height=1.0, double depth=1.0, bool create_uv_map=false, bool map_texture_to_each_face=false)
Definition: TriangleMeshFactory.cpp:169
std::shared_ptr< TriangleMesh > FilterSmoothLaplacian(int number_of_iterations, double lambda_filter, FilterScope scope=FilterScope::All) const
Function to smooth triangle mesh using Laplacian.
Definition: TriangleMesh.cpp:351
TriangleMesh & ComputeTriangleNormals(bool normalized=true)
Function to compute triangle normals, usually called before rendering.
Definition: TriangleMesh.cpp:116
double GetSurfaceArea() const
Definition: TriangleMesh.cpp:1180
std::vector< int > GetNonManifoldVertices() const
Definition: TriangleMesh.cpp:1300
void RemoveTrianglesByMask(const std::vector< bool > &triangle_mask)
This function removes the triangles that are masked in triangle_mask. Call RemoveUnreferencedVertices...
Definition: TriangleMesh.cpp:1520
static std::shared_ptr< TriangleMesh > CreateCoordinateFrame(double size=1.0, const Eigen::Vector3d &origin=Eigen::Vector3d(0.0, 0.0, 0.0))
Definition: TriangleMeshFactory.cpp:1002
static std::shared_ptr< TriangleMesh > CreateSphere(double radius=1.0, int resolution=20, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:231
bool HasMaterials() const
Definition: TriangleMesh.h:88
int width
Definition: FilePCD.cpp:52
int size
Definition: FilePCD.cpp:40
int height
Definition: FilePCD.cpp:53
char type
Definition: FilePCD.cpp:41
Definition: PinholeCameraIntrinsic.cpp:16
void swap(open3d::core::SmallVectorImpl< T > &LHS, open3d::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
Definition: SmallVector.h:1371
float b() const
Definition: TriangleMesh.h:855
float g() const
Definition: TriangleMesh.h:854
float r() const
Definition: TriangleMesh.h:853
MaterialParameter(const float v1, const float v2, const float v3, const float v4)
Definition: TriangleMesh.h:816
static MaterialParameter CreateRGB(const float r, const float g, const float b)
Definition: TriangleMesh.h:847
MaterialParameter(const float v1, const float v2, const float v3)
Definition: TriangleMesh.h:826
MaterialParameter(const float v1, const float v2)
Definition: TriangleMesh.h:833
MaterialParameter(const float v1)
Definition: TriangleMesh.h:840
float a() const
Definition: TriangleMesh.h:856
Definition: TriangleMesh.h:805
std::shared_ptr< Image > anisotropy
Definition: TriangleMesh.h:875
std::shared_ptr< Image > normalMap
Definition: TriangleMesh.h:868
std::shared_ptr< Image > clearCoatRoughness
Definition: TriangleMesh.h:874
std::shared_ptr< Image > roughness
Definition: TriangleMesh.h:871
float baseAnisotropy
Definition: TriangleMesh.h:865
std::unordered_map< std::string, Image > additionalMaps
Definition: TriangleMesh.h:878
float baseClearCoat
Definition: TriangleMesh.h:863
float baseRoughness
Definition: TriangleMesh.h:861
std::unordered_map< std::string, MaterialParameter > floatParameters
Definition: TriangleMesh.h:877
std::shared_ptr< Image > reflectance
Definition: TriangleMesh.h:872
MaterialParameter baseColor
Definition: TriangleMesh.h:859
std::shared_ptr< Image > metallic
Definition: TriangleMesh.h:870
std::shared_ptr< Image > ambientOcclusion
Definition: TriangleMesh.h:869
std::shared_ptr< Image > albedo
Definition: TriangleMesh.h:867
float baseReflectance
Definition: TriangleMesh.h:862
float baseMetallic
Definition: TriangleMesh.h:860
std::shared_ptr< Image > clearCoat
Definition: TriangleMesh.h:873
float baseClearCoatRoughness
Definition: TriangleMesh.h:864
Definition: Helper.h:71
const core::Tensor * indices
Definition: TriangleMesh.cpp:2092
const core::Tensor * vertices
Definition: TriangleMesh.cpp:2089