Easy3D 2.5.3
Tutorial_310_TextMesher
1/********************************************************************
2 * Copyright (C) 2015 Liangliang Nan <liangliang.nan@gmail.com>
3 * https://3d.bk.tudelft.nl/liangliang/
4 *
5 * This file is part of Easy3D. If it is useful in your research/work,
6 * I would be grateful if you show your appreciation by citing it:
7 * ------------------------------------------------------------------
8 * Liangliang Nan.
9 * Easy3D: a lightweight, easy-to-use, and efficient C++ library
10 * for processing and rendering 3D data.
11 * Journal of Open Source Software, 6(64), 3255, 2021.
12 * ------------------------------------------------------------------
13 *
14 * Easy3D is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License Version 3
16 * as published by the Free Software Foundation.
17 *
18 * Easy3D is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 ********************************************************************/
26
27#include <easy3d/core/surface_mesh.h>
28#include <easy3d/viewer/viewer.h>
29#include <easy3d/renderer/camera.h>
30#include <easy3d/renderer/drawable_lines.h>
31#include <easy3d/algo/text_mesher.h>
32#include <easy3d/util/resource.h>
33#include <easy3d/util/initializer.h>
34
35
36// This example shows how to
37// - generate a surface mesh models from texts
38
39using namespace easy3d;
40
41int main(int argc, char **argv) {
42 // initialize Easy3D.
43 initialize();
44
45 // Create an Easy3D viewer.
46 Viewer viewer(EXAMPLE_TITLE);
47
48 // Create an instance of the mesher by specifying a font file.
49 const std::string font_file = resource::directory() + "/fonts/en_Earth-Normal.ttf";
50 TextMesher mesher(font_file);
51
52#if 1 // extract and visualize the mesh model of the text
53 // Generate a surface mesh for "Easy3D".
54 SurfaceMesh* mesh = mesher.generate("Easy3D", 0, 0, 48, 15, true);
55 if (mesh)
56 viewer.add_model(mesh); // Add the mesh to the viewer.
57
58 // Generate surface for "Makes 3D Easy!".
59 mesher.set_font(resource::directory() + "/fonts/en_Roboto-Regular.ttf");
60 mesher.generate(mesh,"Makes 3D Easy!", 350, 0, 25, 15, true);
61
62#else // extract and visualize the 2D contours of the text
63 std::vector< std::vector<Polygon2> > contours;
64 mesher.set_font(font_file);
65 mesher.generate("Easy3D", 0, -60, 48, contours, true);
66 mesher.set_font(resource::directory() + "/fonts/en_Roboto-Regular.ttf");
67 mesher.generate("Makes 3D Easy!", 350, -60, 25, contours, true);
68 std::vector<vec3> points, colors;
69 std::vector<unsigned int> indices;
70 int offset = 0;
71 for (auto &cha : contours) {
72 for (auto &con : cha) {
73 vec3 c = con.is_clockwise() ? vec3(1, 0, 0) : vec3(0, 1, 0);
74 for (int i = 0; i < con.size(); ++i) {
75 points.push_back(vec3(con[i], 0.0f));
76 colors.push_back(c);
77 indices.push_back(offset + i);
78 indices.push_back(offset + (i + 1) % con.size());
79 }
80 offset += con.size();
81 }
82 }
84 d->update_vertex_buffer(points);
85 d->update_color_buffer(colors);
86 d->update_element_buffer(indices);
87 d->set_impostor_type(LinesDrawable::CONE);
88 d->set_line_width(2);
89 d->set_property_coloring(easy3d::State::VERTEX);
90 viewer.add_drawable(d);
91#endif
92
93 // We always want to look at the front of the meshed text.
94 viewer.camera()->setViewDirection(vec3(0, 0, -1));
95 viewer.camera()->setUpVector(vec3(0, 1, 0));
96
97 // Go...
98 return viewer.run();
99}
void setUpVector(const vec3 &up, bool noMove=true) const
Definition: camera.cpp:837
void setViewDirection(const vec3 &direction) const
Definition: camera.cpp:879
void update_vertex_buffer(const std::vector< vec3 > &vertices, bool dynamic=false)
Creates/Updates a single buffer.
Definition: drawable.cpp:142
The drawable for rendering a set of line segments, e.g., edges of a mesh, vector fields.
Definition: drawable_lines.h:40
void set_property_coloring(Location color_location, const std::string &color_name="")
Definition: state.cpp:97
A halfedge data structure for polygonal meshes of 2-manifold.
Definition: surface_mesh.h:52
Generate a 3D surface mesh from a text string.
Definition: text_mesher.h:42
SurfaceMesh * generate(const std::string &text, float x, float y, int font_size, float extrude, bool collision_free=false)
Generate a 3D surface mesh of a text.
Definition: text_mesher.cpp:283
void set_font(const std::string &font_file)
Change the font.
Definition: text_mesher.cpp:63
The built-in Easy3D viewer.
Definition: viewer.h:61
bool add_drawable(Drawable *drawable)
Add a drawable to the viewer to be visualized. After a drawable being added to the viewer,...
Definition: viewer.cpp:1302
virtual Model * add_model(const std::string &file_name, bool create_default_drawables=true)
Add a model from a file to the viewer to be visualized. On success, the viewer will be in charge of t...
Definition: viewer.cpp:1204
Camera * camera()
Returns the camera used by the viewer. See Camera.
Definition: viewer.h:177
int run(bool see_all=true)
Run the viewer.
Definition: viewer.cpp:1090
Definition: collider.cpp:182
void initialize(bool use_log_file, bool use_setting_file, const std::string &resource_dir)
Initialization of Easy3D.
Definition: initializer.cpp:35