This example shows how to select a face of a surface mesh by clicking the mouse.
The header file of the viewer class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef EASY3D_TUTORIAL_PICKER_VIEWER_H
28#define EASY3D_TUTORIAL_PICKER_VIEWER_H
29
30#include <easy3d/viewer/viewer.h>
31
32
33
34
36 class Model;
37}
38
40public:
41 explicit TutorialFacePicker(const std::string &title);
42
44
45protected:
46 bool mouse_press_event(int x, int y, int button, int modifiers) override;
47};
48
49
50#endif
The base class of renderable 3D models.
Definition model.h:50
The built-in Easy3D viewer.
Definition viewer.h:63
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:1242
Definition collider.cpp:182
The source file of the viewer class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include "viewer.h"
28#include <easy3d/gui/picker_surface_mesh.h>
29#include <easy3d/core/surface_mesh.h>
30#include <easy3d/renderer/drawable_lines.h>
31#include <easy3d/renderer/drawable_triangles.h>
32#include <easy3d/renderer/renderer.h>
33#include <easy3d/util/logging.h>
34
35
37
38
39
40TutorialFacePicker::TutorialFacePicker(const std::string &title)
42 camera()->setUpVector(
vec3(0, 1, 0));
43 camera()->setViewDirection(
vec3(0, 0, -1));
44
45 hint_ = "Click the left button on a face to pick it";
46}
47
48
49bool TutorialFacePicker::mouse_press_event(int x, int y, int button, int modifiers) {
50 auto model =
dynamic_cast<SurfaceMesh *
>(current_model());
51 if (model) {
53 auto face = picker.pick_face(model, x, y);
54 if (face.is_valid())
55 std::cout << "picked face " << face << std::endl;
56
57
58
59 auto drawable = model->renderer()->get_triangles_drawable("faces");
60 auto triangle_range = model->get_face_property<std::pair<int, int> >("f:triangle_range");
61 if (triangle_range && face.is_valid()) {
62 const auto& range = triangle_range[face];
63 drawable->set_highlight_range(range);
64 drawable->set_highlight(true);
65 }
66 else {
67 drawable->set_highlight_range(std::make_pair(-1, -1));
68 drawable->set_highlight(false);
69 }
70
71 LOG_IF(!triangle_range, ERROR) << "face property 'f:triangle_range' not defined";
72 }
73
74 return Viewer::mouse_press_event(x, y, button, modifiers);
75}
76
77
78Model* TutorialFacePicker::add_model(
const std::string& file_name) {
80
81
82 model->renderer()->get_lines_drawable("edges")->set_visible(true);
83
84 return model;
85}
86
87
A halfedge data structure for polygonal meshes of 2-manifold.
Definition surface_mesh.h:51
Implementation of picking elements (i.e, vertices, faces, edges) from a surface mesh.
Definition picker_surface_mesh.h:44
Vec< 3, float > vec3
A 3D point/vector of float type.
Definition types.h:44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include "viewer.h"
28#include <easy3d/util/resource.h>
29#include <easy3d/util/initializer.h>
30
41
43
44
45int main(int argc, char **argv) {
46
48
50
51 TutorialFacePicker viewer(EXAMPLE_TITLE);
52 if (!viewer.add_model(file_name)) {
53 LOG(ERROR) << "failed to load model. Please make sure the file exists and format is correct.";
54 return EXIT_FAILURE;
55 }
56
57
58 return viewer.run();
59}
60
std::string directory()
Returns the resource directory (containing color maps, shaders, textures, fonts, etc....
void initialize(bool info_to_stdout, bool use_log_file, bool use_setting_file, const std::string &resource_dir)
Initialization of Easy3D.
Definition initializer.cpp:39