Easy3D 2.6.1
Loading...
Searching...
No Matches
Tutorial_701_Cloud_NormalEstimation/main.cpp

This example shows how to

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/viewer/viewer.h>
28#include <easy3d/core/model.h>
29#include <easy3d/renderer/drawable_points.h>
30#include <easy3d/renderer/renderer.h>
31#include <easy3d/renderer/camera.h>
32#include <easy3d/algo/point_cloud_normals.h>
33#include <easy3d/util/resource.h>
34#include <easy3d/util/initializer.h>
35
44using namespace easy3d;
45
46
47bool estimate(Viewer* viewer, Model* model) {
48 if (!viewer || !model)
49 return false;
50
51 auto cloud = dynamic_cast<PointCloud *>(model);
52 if (PointCloudNormals::estimate(cloud)) {
53 auto normals = cloud->get_vertex_property<vec3>("v:normal");
54 auto drawable = cloud->renderer()->get_points_drawable("vertices");
55 // Upload the vertex normals to the GPU.
56 drawable->update_normal_buffer(normals.vector());
57 viewer->update();
58 return true;
59 }
60 else
61 return false;
62}
63
64bool reorient(Viewer* viewer, Model* model) {
65 if (!viewer || !model)
66 return false;
67
68 auto cloud = dynamic_cast<PointCloud *>(model);
69 auto normals = cloud->get_vertex_property<vec3>("v:normal");
70 if (!normals) {
71 LOG(WARNING) << "normal information does not exist";
72 return false;
73 }
74
75 if (PointCloudNormals::reorient(cloud)) {
76 auto drawable = cloud->renderer()->get_points_drawable("vertices");
77 // Upload the vertex normals to the GPU.
78 drawable->update_normal_buffer(normals.vector());
79 viewer->update();
80 return true;
81 }
82 else
83 return false;
84}
85
86int main(int argc, char **argv) {
87 // initialize Easy3D.
88 initialize();
89
90 const std::string file = resource::directory() + "/data/bunny.bin";
91
92 // create the viewer.
93 Viewer viewer(EXAMPLE_TITLE);
94
95 auto model = viewer.add_model(file, true);
96 if (!model) {
97 LOG(ERROR) << "failed to load model. Please make sure the file exists and format is correct.";
98 return EXIT_FAILURE;
99 }
100 // to view the bunny from its front
101 viewer.camera()->setUpVector(vec3(0, 1, 0));
102 viewer.camera()->setViewDirection(vec3(1, 0, 0));
103
104 // setup rendering parameters
105 auto drawable = model->renderer()->get_points_drawable("vertices");
106 drawable->set_uniform_coloring(vec4(0.6f, 0.6f, 1.0f, 1.0f));
107 drawable->set_point_size(3.0f);
108 drawable->set_distinct_back_color(true);
109
110 // set up the functions to be executed and their corresponding shortcuts
111 viewer.bind(estimate, model, Viewer::KEY_E, Viewer::MODIF_CTRL);
112 viewer.bind(reorient, model, Viewer::KEY_R, Viewer::MODIF_CTRL);
113 // usage
114 viewer.set_usage("",
115 "Ctrl + e: estimate normals\n"
116 "Ctrl + r: reorient normals");
117
118 // run the viewer
119 return viewer.run();
120}
121
The base class of renderable 3D models.
Definition model.h:50
A data structure for point clouds.
Definition point_cloud.h:45
VertexProperty< T > get_vertex_property(const std::string &name) const
Get the vertex property named name of type T.
Definition point_cloud.h:513
The built-in Easy3D viewer.
Definition viewer.h:63
Definition collider.cpp:182
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