Open3D (C++ API)  0.15.1
TriangleMesh.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// The MIT License (MIT)
5//
6// Copyright (c) 2018-2021 www.open3d.org
7//
8// Permission is hereby granted, free of charge, to any person obtaining a copy
9// of this software and associated documentation files (the "Software"), to deal
10// in the Software without restriction, including without limitation the rights
11// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12// copies of the Software, and to permit persons to whom the Software is
13// furnished to do so, subject to the following conditions:
14//
15// The above copyright notice and this permission notice shall be included in
16// all copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24// IN THE SOFTWARE.
25// ----------------------------------------------------------------------------
26
27#pragma once
28
29#include <Eigen/Core>
30#include <memory>
31#include <numeric>
32#include <tuple>
33#include <unordered_map>
34#include <unordered_set>
35#include <vector>
36
40
41namespace open3d {
42namespace geometry {
43
44class PointCloud;
45class TetraMesh;
46
54class TriangleMesh : public MeshBase {
55public:
62 TriangleMesh(const std::vector<Eigen::Vector3d> &vertices,
63 const std::vector<Eigen::Vector3i> &triangles)
65 triangles_(triangles) {}
66 ~TriangleMesh() override {}
67
68public:
69 virtual TriangleMesh &Clear() override;
70 virtual TriangleMesh &Transform(
71 const Eigen::Matrix4d &transformation) override;
72 virtual TriangleMesh &Rotate(const Eigen::Matrix3d &R,
73 const Eigen::Vector3d &center) override;
74
75public:
77 TriangleMesh operator+(const TriangleMesh &mesh) const;
78
80 bool HasTriangles() const {
81 return vertices_.size() > 0 && triangles_.size() > 0;
82 }
83
85 bool HasTriangleNormals() const {
86 return HasTriangles() && triangles_.size() == triangle_normals_.size();
87 }
88
90 bool HasAdjacencyList() const {
91 return vertices_.size() > 0 &&
92 adjacency_list_.size() == vertices_.size();
93 }
94
95 bool HasTriangleUvs() const {
96 return HasTriangles() && triangle_uvs_.size() == 3 * triangles_.size();
97 }
98
100 bool HasTextures() const {
101 bool is_all_texture_valid = std::accumulate(
102 textures_.begin(), textures_.end(), true,
103 [](bool a, const Image &b) { return a && !b.IsEmpty(); });
104 return !textures_.empty() && is_all_texture_valid;
105 }
106
107 bool HasMaterials() const { return !materials_.empty(); }
108
110 return HasTriangles() &&
111 triangle_material_ids_.size() == triangles_.size();
112 }
113
117 for (size_t i = 0; i < triangle_normals_.size(); i++) {
118 triangle_normals_[i].normalize();
119 if (std::isnan(triangle_normals_[i](0))) {
120 triangle_normals_[i] = Eigen::Vector3d(0.0, 0.0, 1.0);
121 }
122 }
123 return *this;
124 }
125
128 TriangleMesh &ComputeTriangleNormals(bool normalized = true);
129
132 TriangleMesh &ComputeVertexNormals(bool normalized = true);
133
137
141
146
150
156
162
169 TriangleMesh &MergeCloseVertices(double eps);
170
180 std::shared_ptr<TriangleMesh> FilterSharpen(
181 int number_of_iterations,
182 double strength,
183 FilterScope scope = FilterScope::All) const;
184
193 std::shared_ptr<TriangleMesh> FilterSmoothSimple(
194 int number_of_iterations,
195 FilterScope scope = FilterScope::All) const;
196
208 std::shared_ptr<TriangleMesh> FilterSmoothLaplacian(
209 int number_of_iterations,
210 double lambda_filter,
211 FilterScope scope = FilterScope::All) const;
212
223 std::shared_ptr<TriangleMesh> FilterSmoothTaubin(
224 int number_of_iterations,
225 double lambda_filter = 0.5,
226 double mu = -0.53,
227 FilterScope scope = FilterScope::All) const;
228
232 int EulerPoincareCharacteristic() const;
233
237 std::vector<Eigen::Vector2i> GetNonManifoldEdges(
238 bool allow_boundary_edges = true) const;
239
244 bool IsEdgeManifold(bool allow_boundary_edges = true) const;
245
249 std::vector<int> GetNonManifoldVertices() const;
250
254 bool IsVertexManifold() const;
255
258 std::vector<Eigen::Vector2i> GetSelfIntersectingTriangles() const;
259
262 bool IsSelfIntersecting() const;
263
266 bool IsBoundingBoxIntersecting(const TriangleMesh &other) const;
267
270 bool IsIntersecting(const TriangleMesh &other) const;
271
275 bool IsOrientable() const;
276
280 bool IsWatertight() const;
281
285 bool OrientTriangles();
286
289 std::unordered_map<Eigen::Vector2i,
290 std::vector<int>,
292 GetEdgeToTrianglesMap() const;
293
296 std::unordered_map<Eigen::Vector2i,
297 std::vector<int>,
299 GetEdgeToVerticesMap() const;
300
302 static double ComputeTriangleArea(const Eigen::Vector3d &p0,
303 const Eigen::Vector3d &p1,
304 const Eigen::Vector3d &p2);
305
308 double GetTriangleArea(size_t triangle_idx) const;
309
310 static inline Eigen::Vector3i GetOrderedTriangle(int vidx0,
311 int vidx1,
312 int vidx2) {
313 if (vidx0 > vidx2) {
314 std::swap(vidx0, vidx2);
315 }
316 if (vidx0 > vidx1) {
317 std::swap(vidx0, vidx1);
318 }
319 if (vidx1 > vidx2) {
320 std::swap(vidx1, vidx2);
321 }
322 return Eigen::Vector3i(vidx0, vidx1, vidx2);
323 }
324
327 double GetSurfaceArea() const;
328
331 double GetSurfaceArea(std::vector<double> &triangle_areas) const;
332
337 double GetVolume() const;
338
342 static Eigen::Vector4d ComputeTrianglePlane(const Eigen::Vector3d &p0,
343 const Eigen::Vector3d &p1,
344 const Eigen::Vector3d &p2);
345
348 Eigen::Vector4d GetTrianglePlane(size_t triangle_idx) const;
349
351 static inline Eigen::Vector2i GetOrderedEdge(int vidx0, int vidx1) {
352 return Eigen::Vector2i(std::min(vidx0, vidx1), std::max(vidx0, vidx1));
353 }
354
357 std::shared_ptr<PointCloud> SamplePointsUniformlyImpl(
358 size_t number_of_points,
359 std::vector<double> &triangle_areas,
360 double surface_area,
361 bool use_triangle_normal,
362 int seed);
363
372 std::shared_ptr<PointCloud> SamplePointsUniformly(
373 size_t number_of_points,
374 bool use_triangle_normal = false,
375 int seed = -1);
376
391 std::shared_ptr<PointCloud> SamplePointsPoissonDisk(
392 size_t number_of_points,
393 double init_factor = 5,
394 const std::shared_ptr<PointCloud> pcl_init = nullptr,
395 bool use_triangle_normal = false,
396 int seed = -1);
397
403 std::shared_ptr<TriangleMesh> SubdivideMidpoint(
404 int number_of_iterations) const;
405
411 std::shared_ptr<TriangleMesh> SubdivideLoop(int number_of_iterations) const;
412
419 std::shared_ptr<TriangleMesh> SimplifyVertexClustering(
420 double voxel_size,
421 SimplificationContraction contraction =
423
433 std::shared_ptr<TriangleMesh> SimplifyQuadricDecimation(
434 int target_number_of_triangles,
435 double maximum_error,
436 double boundary_weight) const;
437
447 std::shared_ptr<TriangleMesh> SelectByIndex(
448 const std::vector<size_t> &indices, bool cleanup = true) const;
449
454 std::shared_ptr<TriangleMesh> Crop(
455 const AxisAlignedBoundingBox &bbox) const;
456
461 std::shared_ptr<TriangleMesh> Crop(const OrientedBoundingBox &bbox) const;
462
469 std::tuple<std::vector<int>, std::vector<size_t>, std::vector<double>>
471
478 void RemoveTrianglesByIndex(const std::vector<size_t> &triangle_indices);
479
486 void RemoveTrianglesByMask(const std::vector<bool> &triangle_mask);
487
494 void RemoveVerticesByIndex(const std::vector<size_t> &vertex_indices);
495
502 void RemoveVerticesByMask(const std::vector<bool> &vertex_mask);
503
517 std::shared_ptr<TriangleMesh> DeformAsRigidAsPossible(
518 const std::vector<int> &constraint_vertex_indices,
519 const std::vector<Eigen::Vector3d> &constraint_vertex_positions,
520 size_t max_iter,
523 double smoothed_alpha = 0.01) const;
524
536 static std::shared_ptr<TriangleMesh> CreateFromPointCloudAlphaShape(
537 const PointCloud &pcd,
538 double alpha,
539 std::shared_ptr<TetraMesh> tetra_mesh = nullptr,
540 std::vector<size_t> *pt_map = nullptr);
541
555 static std::shared_ptr<TriangleMesh> CreateFromPointCloudBallPivoting(
556 const PointCloud &pcd, const std::vector<double> &radii);
557
580 static std::tuple<std::shared_ptr<TriangleMesh>, std::vector<double>>
582 size_t depth = 8,
583 float width = 0.0f,
584 float scale = 1.1f,
585 bool linear_fit = false,
586 int n_threads = -1);
587
593 static std::shared_ptr<TriangleMesh> CreateTetrahedron(
594 double radius = 1.0, bool create_uv_map = false);
595
601 static std::shared_ptr<TriangleMesh> CreateOctahedron(
602 double radius = 1.0, bool create_uv_map = false);
603
608 static std::shared_ptr<TriangleMesh> CreateIcosahedron(
609 double radius = 1.0, bool create_uv_map = false);
610
619 static std::shared_ptr<TriangleMesh> CreateBox(
620 double width = 1.0,
621 double height = 1.0,
622 double depth = 1.0,
623 bool create_uv_map = false,
624 bool map_texture_to_each_face = false);
625
636 static std::shared_ptr<TriangleMesh> CreateSphere(
637 double radius = 1.0,
638 int resolution = 20,
639 bool create_uv_map = false);
640
652 static std::shared_ptr<TriangleMesh> CreateCylinder(
653 double radius = 1.0,
654 double height = 2.0,
655 int resolution = 20,
656 int split = 4,
657 bool create_uv_map = false);
658
669 static std::shared_ptr<TriangleMesh> CreateCone(double radius = 1.0,
670 double height = 2.0,
671 int resolution = 20,
672 int split = 1,
673 bool create_uv_map = false);
674
688 static std::shared_ptr<TriangleMesh> CreateTorus(
689 double torus_radius = 1.0,
690 double tube_radius = 0.5,
691 int radial_resolution = 30,
692 int tubular_resolution = 20);
693
704 //
718 static std::shared_ptr<TriangleMesh> CreateArrow(
719 double cylinder_radius = 1.0,
720 double cone_radius = 1.5,
721 double cylinder_height = 5.0,
722 double cone_height = 4.0,
723 int resolution = 20,
724 int cylinder_split = 4,
725 int cone_split = 1);
726
732 static std::shared_ptr<TriangleMesh> CreateCoordinateFrame(
733 double size = 1.0,
734 const Eigen::Vector3d &origin = Eigen::Vector3d(0.0, 0.0, 0.0));
735
746 static std::shared_ptr<TriangleMesh> CreateMobius(int length_split = 70,
747 int width_split = 15,
748 int twists = 1,
749 double radius = 1,
750 double flatness = 1,
751 double width = 1,
752 double scale = 1);
753
754protected:
755 // Forward child class type to avoid indirect nonvirtual base
757
759 std::shared_ptr<TriangleMesh> &mesh,
760 const std::vector<Eigen::Vector3d> &prev_vertices,
761 const std::vector<Eigen::Vector3d> &prev_vertex_normals,
762 const std::vector<Eigen::Vector3d> &prev_vertex_colors,
763 const std::vector<std::unordered_set<int>> &adjacency_list,
764 double lambda_filter,
765 bool filter_vertex,
766 bool filter_normal,
767 bool filter_color) const;
768
777 std::unordered_map<Eigen::Vector2i,
778 double,
781 const std::unordered_map<Eigen::Vector2i,
782 std::vector<int>,
784 &edges_to_vertices,
785 double min_weight = std::numeric_limits<double>::lowest()) const;
786
787public:
789 std::vector<Eigen::Vector3i> triangles_;
791 std::vector<Eigen::Vector3d> triangle_normals_;
794 std::vector<std::unordered_set<int>> adjacency_list_;
796 std::vector<Eigen::Vector2d> triangle_uvs_;
797
798 struct Material {
800 float f4[4] = {0};
801
803 f4[0] = 0;
804 f4[1] = 0;
805 f4[2] = 0;
806 f4[3] = 0;
807 }
808
809 MaterialParameter(const float v1,
810 const float v2,
811 const float v3,
812 const float v4) {
813 f4[0] = v1;
814 f4[1] = v2;
815 f4[2] = v3;
816 f4[3] = v4;
817 }
818
819 MaterialParameter(const float v1, const float v2, const float v3) {
820 f4[0] = v1;
821 f4[1] = v2;
822 f4[2] = v3;
823 f4[3] = 1;
824 }
825
826 MaterialParameter(const float v1, const float v2) {
827 f4[0] = v1;
828 f4[1] = v2;
829 f4[2] = 0;
830 f4[3] = 0;
831 }
832
833 explicit MaterialParameter(const float v1) {
834 f4[0] = v1;
835 f4[1] = 0;
836 f4[2] = 0;
837 f4[3] = 0;
838 }
839
840 static MaterialParameter CreateRGB(const float r,
841 const float g,
842 const float b) {
843 return {r, g, b, 1.f};
844 }
845
846 float r() const { return f4[0]; }
847 float g() const { return f4[1]; }
848 float b() const { return f4[2]; }
849 float a() const { return f4[3]; }
850 };
851
853 float baseMetallic = 0.f;
854 float baseRoughness = 1.f;
855 float baseReflectance = 0.5f;
856 float baseClearCoat = 0.f;
858 float baseAnisotropy = 0.f;
859
860 std::shared_ptr<Image> albedo;
861 std::shared_ptr<Image> normalMap;
862 std::shared_ptr<Image> ambientOcclusion;
863 std::shared_ptr<Image> metallic;
864 std::shared_ptr<Image> roughness;
865 std::shared_ptr<Image> reflectance;
866 std::shared_ptr<Image> clearCoat;
867 std::shared_ptr<Image> clearCoatRoughness;
868 std::shared_ptr<Image> anisotropy;
869
870 std::unordered_map<std::string, MaterialParameter> floatParameters;
871 std::unordered_map<std::string, Image> additionalMaps;
872 };
873
874 std::unordered_map<std::string, Material> materials_;
875
877 std::vector<int> triangle_material_ids_;
879 std::vector<Image> textures_;
880};
881
882} // namespace geometry
883} // namespace open3d
A bounding box that is aligned along the coordinate axes.
Definition: BoundingVolume.h:155
The base geometry class.
Definition: Geometry.h:37
GeometryType
Specifies possible geometry types.
Definition: Geometry.h:42
The Image class stores image with customizable width, height, num of channels and bytes per channel.
Definition: Image.h:53
MeshBash Class.
Definition: MeshBase.h:51
std::vector< Eigen::Vector3d > vertices_
Vertex coordinates.
Definition: MeshBase.h:149
MeshBase & NormalizeNormals()
Normalize vertex normals to length 1.
Definition: MeshBase.h:118
DeformAsRigidAsPossibleEnergy
Definition: MeshBase.h:76
SimplificationContraction
Indicates the method that is used for mesh simplification if multiple vertices are combined to a sing...
Definition: MeshBase.h:61
FilterScope
Indicates the scope of filter operations.
Definition: MeshBase.h:70
A bounding box oriented along an arbitrary frame of reference.
Definition: BoundingVolume.h:44
A point cloud consists of point coordinates, and optionally point colors and point normals.
Definition: PointCloud.h:55
Triangle mesh contains vertices and triangles represented by the indices to the vertices.
Definition: TriangleMesh.h:54
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:65
bool IsBoundingBoxIntersecting(const TriangleMesh &other) const
Definition: TriangleMesh.cpp:1423
TriangleMesh(Geometry::GeometryType type)
Definition: TriangleMesh.h:756
TriangleMesh & RemoveNonManifoldEdges()
Function that removes all non-manifold edges, by successively deleting triangles with the smallest su...
Definition: TriangleMesh.cpp:860
std::vector< Image > textures_
Textures of the image.
Definition: TriangleMesh.h:879
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:1178
std::shared_ptr< TriangleMesh > SubdivideMidpoint(int number_of_iterations) const
Definition: TriangleMeshSubdivide.cpp:37
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:1451
std::shared_ptr< PointCloud > SamplePointsUniformlyImpl(size_t number_of_points, std::vector< double > &triangle_areas, double surface_area, bool use_triangle_normal, int seed)
Definition: TriangleMesh.cpp:453
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, int seed=-1)
Definition: TriangleMesh.cpp:546
double GetVolume() const
Definition: TriangleMesh.cpp:1215
std::shared_ptr< TriangleMesh > SubdivideLoop(int number_of_iterations) const
Definition: TriangleMeshSubdivide.cpp:115
static std::shared_ptr< TriangleMesh > CreateIcosahedron(double radius=1.0, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:103
TriangleMesh & operator+=(const TriangleMesh &mesh)
Definition: TriangleMesh.cpp:72
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:405
std::vector< Eigen::Vector2i > GetSelfIntersectingTriangles() const
Definition: TriangleMesh.cpp:1374
bool IsVertexManifold() const
Definition: TriangleMesh.cpp:1370
TriangleMesh & RemoveDuplicatedVertices()
Function that removes duplicated verties, i.e., vertices that have identical coordinates.
Definition: TriangleMesh.cpp:692
std::vector< std::unordered_set< int > > adjacency_list_
Definition: TriangleMesh.h:794
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:806
bool IsEdgeManifold(bool allow_boundary_edges=true) const
Definition: TriangleMesh.cpp:1301
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:1517
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:312
static Eigen::Vector4d ComputeTrianglePlane(const Eigen::Vector3d &p0, const Eigen::Vector3d &p1, const Eigen::Vector3d &p2)
Definition: TriangleMesh.cpp:1248
bool HasTriangles() const
Returns true if the mesh contains triangles.
Definition: TriangleMesh.h:80
TriangleMesh & ComputeVertexNormals(bool normalized=true)
Function to compute vertex normals, usually called before rendering.
Definition: TriangleMesh.cpp:146
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:1568
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:545
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:740
virtual TriangleMesh & Clear() override
Clear all elements in the geometry.
Definition: TriangleMesh.cpp:46
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:940
static Eigen::Vector2i GetOrderedEdge(int vidx0, int vidx1)
Helper function to get an edge with ordered vertex indices.
Definition: TriangleMesh.h:351
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:40
std::shared_ptr< TriangleMesh > SimplifyVertexClustering(double voxel_size, SimplificationContraction contraction=SimplificationContraction::Average) const
Definition: TriangleMeshSimplification.cpp:91
int EulerPoincareCharacteristic() const
Definition: TriangleMesh.cpp:1272
std::shared_ptr< TriangleMesh > SelectByIndex(const std::vector< size_t > &indices, bool cleanup=true) const
Definition: TriangleMesh.cpp:1629
std::unordered_map< Eigen::Vector2i, std::vector< int >, utility::hash_eigen< Eigen::Vector2i > > GetEdgeToTrianglesMap() const
Definition: TriangleMesh.cpp:1143
bool HasTriangleMaterialIds() const
Definition: TriangleMesh.h:109
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:1585
static std::shared_ptr< TriangleMesh > CreateFromPointCloudBallPivoting(const PointCloud &pcd, const std::vector< double > &radii)
Definition: SurfaceReconstructionBallPivoting.cpp:756
std::vector< Eigen::Vector2d > triangle_uvs_
List of uv coordinates per triangle.
Definition: TriangleMesh.h:796
~TriangleMesh() override
Definition: TriangleMesh.h:66
virtual TriangleMesh & Transform(const Eigen::Matrix4d &transformation) override
Apply transformation (4x4 matrix) to the geometry coordinates.
Definition: TriangleMesh.cpp:59
static std::shared_ptr< TriangleMesh > CreateTetrahedron(double radius=1.0, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:33
bool IsOrientable() const
Definition: TriangleMesh.cpp:1124
std::vector< Eigen::Vector3i > triangles_
List of triangles denoted by the index of points forming the triangle.
Definition: TriangleMesh.h:789
bool HasTextures() const
Returns true if the mesh has texture.
Definition: TriangleMesh.h:100
bool OrientTriangles()
Definition: TriangleMesh.cpp:1133
bool HasTriangleUvs() const
Definition: TriangleMesh.h:95
std::shared_ptr< TriangleMesh > Crop(const AxisAlignedBoundingBox &bbox) const
Definition: TriangleMesh.cpp:1689
std::vector< Eigen::Vector3d > triangle_normals_
Triangle normals.
Definition: TriangleMesh.h:791
static std::shared_ptr< TriangleMesh > CreateOctahedron(double radius=1.0, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:70
TriangleMesh & RemoveDuplicatedTriangles()
Function that removes duplicated triangles, i.e., removes triangles that reference the same three ver...
Definition: TriangleMesh.cpp:735
std::vector< Eigen::Vector2i > GetNonManifoldEdges(bool allow_boundary_edges=true) const
Definition: TriangleMesh.cpp:1287
std::unordered_map< std::string, Material > materials_
Definition: TriangleMesh.h:874
TriangleMesh & RemoveDegenerateTriangles()
Function that removes degenerate triangles, i.e., triangles that reference a single vertex multiple t...
Definition: TriangleMesh.cpp:830
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:38
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:724
TriangleMesh & RemoveUnreferencedVertices()
This function removes vertices from the triangle mesh that are not referenced in any triangle of the ...
Definition: TriangleMesh.cpp:787
std::shared_ptr< TriangleMesh > SimplifyQuadricDecimation(int target_number_of_triangles, double maximum_error, double boundary_weight) const
Definition: TriangleMeshSimplification.cpp:265
bool HasTriangleNormals() const
Returns true if the mesh contains triangle normals.
Definition: TriangleMesh.h:85
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:389
bool IsWatertight() const
Definition: TriangleMesh.cpp:1129
bool HasAdjacencyList() const
Returns true if the mesh contains adjacency normals.
Definition: TriangleMesh.h:90
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:1713
bool IsIntersecting(const TriangleMesh &other) const
Definition: TriangleMesh.cpp:1428
double GetTriangleArea(size_t triangle_idx) const
Definition: TriangleMesh.cpp:1187
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:672
TriangleMesh & ComputeAdjacencyList()
Function to compute adjacency list, call before adjacency list is needed.
Definition: TriangleMesh.cpp:161
TriangleMesh(const std::vector< Eigen::Vector3d > &vertices, const std::vector< Eigen::Vector3i > &triangles)
Parameterized Constructor.
Definition: TriangleMesh.h:62
static Eigen::Vector3i GetOrderedTriangle(int vidx0, int vidx1, int vidx2)
Definition: TriangleMesh.h:310
TriangleMesh & NormalizeNormals()
Normalize both triangle normals and vertex normals to length 1.
Definition: TriangleMesh.h:115
std::shared_ptr< TriangleMesh > FilterSharpen(int number_of_iterations, double strength, FilterScope scope=FilterScope::All) const
Function to sharpen triangle mesh.
Definition: TriangleMesh.cpp:175
std::vector< int > triangle_material_ids_
List of material ids.
Definition: TriangleMesh.h:877
std::unordered_map< Eigen::Vector2i, std::vector< int >, utility::hash_eigen< Eigen::Vector2i > > GetEdgeToVerticesMap() const
Definition: TriangleMesh.cpp:1162
Eigen::Vector4d GetTrianglePlane(size_t triangle_idx) const
Definition: TriangleMesh.cpp:1264
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:246
TriangleMesh operator+(const TriangleMesh &mesh) const
Definition: TriangleMesh.cpp:127
TriangleMesh()
Default Constructor.
Definition: TriangleMesh.h:57
bool IsSelfIntersecting() const
Definition: TriangleMesh.cpp:1419
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:160
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:364
TriangleMesh & ComputeTriangleNormals(bool normalized=true)
Function to compute triangle normals, usually called before rendering.
Definition: TriangleMesh.cpp:131
double GetSurfaceArea() const
Definition: TriangleMesh.cpp:1195
std::vector< int > GetNonManifoldVertices() const
Definition: TriangleMesh.cpp:1314
void RemoveTrianglesByMask(const std::vector< bool > &triangle_mask)
This function removes the triangles that are masked in triangle_mask. Call RemoveUnreferencedVertices...
Definition: TriangleMesh.cpp:1534
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:767
std::shared_ptr< PointCloud > SamplePointsUniformly(size_t number_of_points, bool use_triangle_normal=false, int seed=-1)
Definition: TriangleMesh.cpp:526
static std::shared_ptr< TriangleMesh > CreateSphere(double radius=1.0, int resolution=20, bool create_uv_map=false)
Definition: TriangleMeshFactory.cpp:222
bool HasMaterials() const
Definition: TriangleMesh.h:107
int width
Definition: FilePCD.cpp:71
int size
Definition: FilePCD.cpp:59
int height
Definition: FilePCD.cpp:72
char type
Definition: FilePCD.cpp:60
void swap(optional< T > &x, optional< T > &y) noexcept(noexcept(x.swap(y)))
Definition: Optional.h:920
Definition: PinholeCameraIntrinsic.cpp:35
float b() const
Definition: TriangleMesh.h:848
float g() const
Definition: TriangleMesh.h:847
float r() const
Definition: TriangleMesh.h:846
MaterialParameter(const float v1, const float v2, const float v3, const float v4)
Definition: TriangleMesh.h:809
static MaterialParameter CreateRGB(const float r, const float g, const float b)
Definition: TriangleMesh.h:840
MaterialParameter(const float v1, const float v2, const float v3)
Definition: TriangleMesh.h:819
MaterialParameter(const float v1, const float v2)
Definition: TriangleMesh.h:826
MaterialParameter(const float v1)
Definition: TriangleMesh.h:833
float a() const
Definition: TriangleMesh.h:849
Definition: TriangleMesh.h:798
std::shared_ptr< Image > anisotropy
Definition: TriangleMesh.h:868
std::shared_ptr< Image > normalMap
Definition: TriangleMesh.h:861
std::shared_ptr< Image > clearCoatRoughness
Definition: TriangleMesh.h:867
std::shared_ptr< Image > roughness
Definition: TriangleMesh.h:864
float baseAnisotropy
Definition: TriangleMesh.h:858
std::unordered_map< std::string, Image > additionalMaps
Definition: TriangleMesh.h:871
float baseClearCoat
Definition: TriangleMesh.h:856
float baseRoughness
Definition: TriangleMesh.h:854
std::unordered_map< std::string, MaterialParameter > floatParameters
Definition: TriangleMesh.h:870
std::shared_ptr< Image > reflectance
Definition: TriangleMesh.h:865
MaterialParameter baseColor
Definition: TriangleMesh.h:852
std::shared_ptr< Image > metallic
Definition: TriangleMesh.h:863
std::shared_ptr< Image > ambientOcclusion
Definition: TriangleMesh.h:862
std::shared_ptr< Image > albedo
Definition: TriangleMesh.h:860
float baseReflectance
Definition: TriangleMesh.h:855
float baseMetallic
Definition: TriangleMesh.h:853
std::shared_ptr< Image > clearCoat
Definition: TriangleMesh.h:866
float baseClearCoatRoughness
Definition: TriangleMesh.h:857
Definition: Helper.h:87