This example shows how to select a face of a surface mesh by clicking the mouse.
The header file of the viewer class:
27#ifndef EASY3D_TUTORIAL_PICKER_VIEWER_H
28#define EASY3D_TUTORIAL_PICKER_VIEWER_H
30#include <easy3d/viewer/viewer.h>
41 explicit TutorialFacePicker(
const std::string &title);
46 bool mouse_press_event(
int x,
int y,
int button,
int modifiers)
override;
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:
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>
40TutorialFacePicker::TutorialFacePicker(
const std::string &title)
42 camera()->setUpVector(
vec3(0, 1, 0));
43 camera()->setViewDirection(
vec3(0, 0, -1));
45 hint_ =
"Click the left button on a face to pick it";
49bool TutorialFacePicker::mouse_press_event(
int x,
int y,
int button,
int modifiers) {
50 auto model =
dynamic_cast<SurfaceMesh *
>(current_model());
53 auto face = picker.pick_face(model, x, y);
55 std::cout <<
"picked face " << face << std::endl;
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);
67 drawable->set_highlight_range(std::make_pair(-1, -1));
68 drawable->set_highlight(
false);
71 LOG_IF(!triangle_range, ERROR) <<
"face property 'f:triangle_range' not defined";
74 return Viewer::mouse_press_event(x, y, button, modifiers);
78Model* TutorialFacePicker::add_model(
const std::string& file_name) {
79 auto model = Viewer::add_model(file_name,
true);
82 model->renderer()->get_lines_drawable(
"edges")->set_visible(
true);
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
28#include <easy3d/util/resource.h>
29#include <easy3d/util/initializer.h>
45int main(
int argc,
char **argv) {
49 const std::string file_name = resource::directory() +
"/data/quad_mesh/P.off";
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.";