This example shows how to triangulate a general polygonal meshes (e.g., meshes with concave faces, selfâintersecting faces, and faces with holes) using the tessellator of Easy3D.
Note: For general rendering purposes, you can use the tessellator to create a TrianglesDrawable for the model without explicitly triangulating the mesh.
27#include <easy3d/viewer/viewer.h>
28#include <easy3d/renderer/camera.h>
29#include <easy3d/core/surface_mesh.h>
30#include <easy3d/renderer/drawable_points.h>
31#include <easy3d/renderer/drawable_lines.h>
32#include <easy3d/renderer/renderer.h>
33#include <easy3d/algo/tessellator.h>
34#include <easy3d/util/initializer.h>
49typedef std::vector<vec3> Hole;
56 mesh->update_face_normals();
57 auto normals = mesh->face_property<
vec3>(
"f:normal");
58 auto holes = mesh->get_face_property<Hole>(
"f:holes");
61 for (
auto f : mesh->faces()) {
64 tessellator.set_winding_rule(Tessellator::WINDING_NONZERO);
65 tessellator.begin_contour();
66 for (
auto h : mesh->halfedges(f)) {
68 tessellator.add_vertex(mesh->position(v), v.
idx());
70 tessellator.end_contour();
72 if (holes && holes[f].size() >= 3) {
73 tessellator.set_winding_rule(Tessellator::WINDING_ODD);
74 tessellator.begin_contour();
75 for (
const auto& p : holes[f])
76 tessellator.add_vertex(p);
77 tessellator.end_contour();
80 tessellator.end_polygon();
88 const auto& triangles = tessellator.elements();
89 if (triangles.empty())
92 const auto &vts = tessellator.vertices();
94 mesh->add_vertex(
vec3(v->data()));
96 for (
const auto &t: triangles) {
106int main(
int argc,
char **argv) {
112 Viewer viewer(EXAMPLE_TITLE);
113 viewer.camera()->setUpVector(
vec3(0, 1, 0));
114 viewer.camera()->setViewDirection(
vec3(0, 0, -1));
121 auto v0 = mesh->add_vertex(
vec3(0, 0, 0));
122 auto v1 = mesh->add_vertex(
vec3(800, 0, 0));
123 auto v2 = mesh->add_vertex(
vec3(800, 800, 0));
124 auto v3 = mesh->add_vertex(
vec3(600, 300, 0));
125 mesh->add_quad(v0, v1, v2, v3);
130 mesh->add_vertex(
vec3(1500, 0, 0)),
131 mesh->add_vertex(
vec3(1300, 800, 0)),
132 mesh->add_vertex(
vec3(1100, 0, 0)),
133 mesh->add_vertex(
vec3(1700, 500, 0)),
134 mesh->add_vertex(
vec3(900, 500, 0))
136 mesh->add_face(vertices);
141 mesh->add_vertex(
vec3(1800, 0, 0)),
142 mesh->add_vertex(
vec3(2200, 0, 0)),
143 mesh->add_vertex(
vec3(2200, 700, 0)),
144 mesh->add_vertex(
vec3(1800, 700, 0))
146 auto f = mesh->add_face(vertices);
149 auto holes = mesh->add_face_property<Hole>(
"f:holes");
165 viewer.add_model(std::shared_ptr<SurfaceMesh>(mesh),
true);
168 mesh->renderer()->get_points_drawable(
"vertices")->set_visible(
true);
170 mesh->renderer()->get_points_drawable(
"vertices")->set_point_size(12);
172 mesh->renderer()->get_lines_drawable(
"edges")->set_visible(
true);
174 mesh->renderer()->get_lines_drawable(
"borders")->set_visible(
true);
@ SPHERE
The points will be drawn as spheres.
Definition drawable_points.h:62
int idx() const
Get the underlying index of this handle.
Definition surface_mesh.h:72
A halfedge data structure for polygonal meshes of 2-manifold.
Definition surface_mesh.h:51
Tessellator subdivides concave planar polygons, polygons with holes, or polygons with intersecting ed...
Definition tessellator.h:55
void begin_polygon(const vec3 &normal)
Begin the tessellation of a complex polygon.
Definition tessellator.cpp:145
The built-in Easy3D viewer.
Definition viewer.h:63
Definition collider.cpp:182
This type represents a vertex (internally it is basically an index).
Definition surface_mesh.h:135