source: pacpussensors/trunk/Vislab/20150310_lib3dv-1.2.0/src/interactor_style_3dv.cc

Last change on this file was 136, checked in by ldecherf, 8 years ago

Doc

File size: 14.7 KB
Line 
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2010, Willow Garage, Inc.
6 * Copyright (c) 2012-, Open Perception, Inc.
7 *
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * * Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials provided
19 * with the distribution.
20 * * Neither the name of the copyright holder(s) nor the names of its
21 * contributors may be used to endorse or promote products derived
22 * from this software without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 *
37 */
38
39#include "interactor_style_3dv.h"
40
41#include <pcl/visualization/vtk/vtkVertexBufferObjectMapper.h>
42
43#include <vtkAssemblyPath.h>
44#include <vtkAbstractPicker.h>
45#include <vtkAbstractPropPicker.h>
46#include <vtkCamera.h>
47#include <vtkCellArray.h>
48#include <vtkLegendScaleActor.h>
49#include <vtkObjectFactory.h>
50#include <vtkPointData.h>
51#include <vtkPolyData.h>
52#include <vtkPolyDataMapper.h>
53#include <vtkProperty.h>
54#include <vtkRendererCollection.h>
55#include <vtkRenderWindow.h>
56
57void interactor_style_3dv::OnChar()
58{
59 // Make sure we ignore the same events we handle in OnKeyDown to avoid calling things twice
60 FindPokedRenderer (Interactor->GetEventPosition ()[0], Interactor->GetEventPosition ()[1]);
61 if (Interactor->GetKeyCode () >= '0' && Interactor->GetKeyCode () <= '9')
62 return;
63 std::string key (Interactor->GetKeySym ());
64 if (key.find ("XF86ZoomIn") != std::string::npos)
65 zoomIn ();
66 else if (key.find ("XF86ZoomOut") != std::string::npos)
67 zoomOut ();
68
69 bool keymod = false;
70 switch (modifier_)
71 {
72 case pcl::visualization::INTERACTOR_KB_MOD_ALT:
73 {
74 keymod = Interactor->GetAltKey ();
75 break;
76 }
77 case pcl::visualization::INTERACTOR_KB_MOD_CTRL:
78 {
79 keymod = Interactor->GetControlKey ();
80 break;
81 }
82 case pcl::visualization::INTERACTOR_KB_MOD_SHIFT:
83 {
84 keymod = Interactor->GetShiftKey ();
85 break;
86 }
87 }
88
89 switch (Interactor->GetKeyCode ())
90 {
91 // All of the options below simply exit
92 case 'h': case 'H':
93 case 'c': case 'C':
94 case 43: // KEY_PLUS
95 case 45: // KEY_MINUS
96 case 'f': case 'F':
97 case 'g': case 'G':
98 case 'q': case 'Q':
99 case 'r': case 'R':
100 case 'm': case 'M':
101 {
102 break;
103 }
104 default:
105 {
106 Superclass::OnChar ();
107 break;
108 }
109 }
110}
111
112void interactor_style_3dv::OnKeyDown()
113{
114 if (!init_)
115 {
116 pcl::console::print_error ("[PCLVisualizerInteractorStyle] Interactor style not initialized. Please call Initialize () before continuing.\n");
117 return;
118 }
119
120 if (!rens_)
121 {
122 pcl::console::print_error ("[PCLVisualizerInteractorStyle] No renderer collection given! Use SetRendererCollection () before continuing.\n");
123 return;
124 }
125
126 FindPokedRenderer(Interactor->GetEventPosition ()[0], Interactor->GetEventPosition ()[1]);
127
128 // Save the initial windows width/height
129 if (win_height_ == -1 || win_width_ == -1)
130 {
131 int *win_size = Interactor->GetRenderWindow ()->GetSize ();
132 win_height_ = win_size[0];
133 win_width_ = win_size[1];
134 }
135
136 // Get the status of special keys (Cltr+Alt+Shift)
137 bool shift = Interactor->GetShiftKey ();
138 bool ctrl = Interactor->GetControlKey ();
139 bool alt = Interactor->GetAltKey ();
140
141 bool keymod = false;
142 switch (modifier_)
143 {
144 case pcl::visualization::INTERACTOR_KB_MOD_ALT:
145 {
146 keymod = alt;
147 break;
148 }
149 case pcl::visualization::INTERACTOR_KB_MOD_CTRL:
150 {
151 keymod = ctrl;
152 break;
153 }
154 case pcl::visualization::INTERACTOR_KB_MOD_SHIFT:
155 {
156 keymod = shift;
157 break;
158 }
159 }
160
161 // ---[ Check the rest of the key codes
162
163 std::string key (Interactor->GetKeySym ());
164 if (key.find ("XF86ZoomIn") != std::string::npos)
165 zoomIn ();
166 else if (key.find ("XF86ZoomOut") != std::string::npos)
167 zoomOut ();
168
169 switch (Interactor->GetKeyCode ())
170 {
171 case 'h': case 'H':
172 {
173 pcl::console::print_info ("\n\r[II] 3dv-client: 3D visualization window shortcuts\n\n\r"
174 " p, P : toggle point cloud visualization\n\r"
175 " o, O : toggle obstacles visualization\n\r"
176 " t, T : toggle terrain visualization\n\r"
177 " m, M : toggle terrain grid map visualization\n\r"
178 " v, V : toggle orientation rate visualization\n\r"
179 "\n\r"
180 " c, C : display current camera/window parameters\n\r"
181 " f, F : fly to point mode\n\r"
182 "\n\r"
183 " q, Q : stop and call VTK's TerminateApp\n\r"
184 "\n\r"
185 " +/- : increment/decrement overall point size\n\r"
186 " +/- [+ ALT] : zoom in/out \n\r"
187 "\n\r"
188 " g, G : display scale grid (on/off)\n\r"
189 "\n\r"
190 " r, R [+ ALT] : reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}]\n\r"
191 "\n\r"
192 " ALT + f, F : switch between maximized window mode and original size\n\r"
193 );
194 break;
195 }
196
197 // display current camera settings/parameters
198 case 'c': case 'C':
199 {
200 vtkSmartPointer<vtkCamera> cam = Interactor->GetRenderWindow ()->GetRenderers ()->GetFirstRenderer ()->GetActiveCamera ();
201 double clip[2], focal[3], pos[3], view[3];
202 cam->GetClippingRange (clip);
203 cam->GetFocalPoint (focal);
204 cam->GetPosition (pos);
205 cam->GetViewUp (view);
206 int *win_pos = Interactor->GetRenderWindow ()->GetPosition ();
207 int *win_size = Interactor->GetRenderWindow ()->GetSize ();
208 std::cerr << clip[0] << "," << clip[1] << "/" << focal[0] << "," << focal[1] << "," << focal[2] << "/" <<
209 pos[0] << "," << pos[1] << "," << pos[2] << "/" << view[0] << "," << view[1] << "," << view[2] << "/" <<
210 cam->GetViewAngle () / 180.0 * M_PI << "/" << win_size[0] << "," << win_size[1] << "/" << win_pos[0] << "," << win_pos[1]
211 << endl;
212 break;
213 }
214 case '=':
215 {
216 zoomIn();
217 break;
218 }
219 case 43: // KEY_PLUS
220 {
221 if(alt)
222 zoomIn ();
223 else
224 {
225 vtkSmartPointer<vtkActorCollection> ac = CurrentRenderer->GetActors ();
226 vtkCollectionSimpleIterator ait;
227 for (ac->InitTraversal (ait); vtkActor* actor = ac->GetNextActor (ait); )
228 {
229 for (actor->InitPathTraversal (); vtkAssemblyPath* path = actor->GetNextPath (); )
230 {
231 vtkSmartPointer<vtkActor> apart = reinterpret_cast <vtkActor*> (path->GetLastNode ()->GetViewProp ());
232 float psize = apart->GetProperty ()->GetPointSize ();
233 if (psize < 63.0f)
234 apart->GetProperty ()->SetPointSize (psize + 1.0f);
235 }
236 }
237 }
238 break;
239 }
240 case 45: // KEY_MINUS
241 {
242 if(alt)
243 zoomOut ();
244 else
245 {
246 vtkSmartPointer<vtkActorCollection> ac = CurrentRenderer->GetActors ();
247 vtkCollectionSimpleIterator ait;
248 for (ac->InitTraversal (ait); vtkActor* actor = ac->GetNextActor (ait); )
249 {
250 for (actor->InitPathTraversal (); vtkAssemblyPath* path = actor->GetNextPath (); )
251 {
252 vtkSmartPointer<vtkActor> apart = static_cast<vtkActor*> (path->GetLastNode ()->GetViewProp ());
253 float psize = apart->GetProperty ()->GetPointSize ();
254 if (psize > 1.0f)
255 apart->GetProperty ()->SetPointSize (psize - 1.0f);
256 }
257 }
258 }
259 break;
260 }
261 // Switch between maximize and original window size
262 case 'f': case 'F':
263 {
264 if (keymod)
265 {
266 // Get screen size
267 int *temp = Interactor->GetRenderWindow ()->GetScreenSize ();
268 int scr_size[2]; scr_size[0] = temp[0]; scr_size[1] = temp[1];
269
270 // Get window size
271 temp = Interactor->GetRenderWindow ()->GetSize ();
272 int win_size[2]; win_size[0] = temp[0]; win_size[1] = temp[1];
273 // Is window size = max?
274 if (win_size[0] == max_win_height_ && win_size[1] == max_win_width_)
275 {
276 // Set the previously saved 'current' window size
277 Interactor->GetRenderWindow ()->SetSize (win_height_, win_width_);
278 // Set the previously saved window position
279 Interactor->GetRenderWindow ()->SetPosition (win_pos_x_, win_pos_y_);
280 Interactor->GetRenderWindow ()->Render ();
281 Interactor->Render ();
282 }
283 // Set to max
284 else
285 {
286 int *win_pos = Interactor->GetRenderWindow ()->GetPosition ();
287 // Save the current window position
288 win_pos_x_ = win_pos[0];
289 win_pos_y_ = win_pos[1];
290 // Save the current window size
291 win_height_ = win_size[0];
292 win_width_ = win_size[1];
293 // Set the maximum window size
294 Interactor->GetRenderWindow ()->SetSize (scr_size[0], scr_size[1]);
295 Interactor->GetRenderWindow ()->Render ();
296 Interactor->Render ();
297 int *win_size = Interactor->GetRenderWindow ()->GetSize ();
298 // Save the maximum window size
299 max_win_height_ = win_size[0];
300 max_win_width_ = win_size[1];
301 }
302 }
303 else
304 {
305 AnimState = VTKIS_ANIM_ON;
306 vtkAssemblyPath *path = NULL;
307 Interactor->GetPicker ()->Pick (Interactor->GetEventPosition ()[0], Interactor->GetEventPosition ()[1], 0.0, CurrentRenderer);
308 vtkAbstractPropPicker *picker;
309 if ((picker = vtkAbstractPropPicker::SafeDownCast (Interactor->GetPicker ())))
310 path = picker->GetPath ();
311 if (path != NULL)
312 Interactor->FlyTo (CurrentRenderer, picker->GetPickPosition ());
313 AnimState = VTKIS_ANIM_OFF;
314 }
315 break;
316 }
317
318 // Display a grid/scale over the screen
319 case 'g': case 'G':
320 {
321 if (!grid_enabled_)
322 {
323 grid_actor_->TopAxisVisibilityOn ();
324 CurrentRenderer->AddViewProp (grid_actor_);
325 grid_enabled_ = true;
326 }
327 else
328 {
329 CurrentRenderer->RemoveViewProp (grid_actor_);
330 grid_enabled_ = false;
331 }
332 break;
333 }
334 case 'm': case 'M':
335 {
336 break;
337 }
338
339
340 // Overwrite the camera reset
341 case 'r': case 'R':
342 {
343 vtkSmartPointer<vtkCamera> cam = CurrentRenderer->GetActiveCamera ();
344 /*
345 if (!keymod)
346 {
347 FindPokedRenderer(Interactor->GetEventPosition ()[0], Interactor->GetEventPosition ()[1]);
348 if(CurrentRenderer != 0)
349 CurrentRenderer->ResetCamera ();
350 else
351 PCL_WARN ("no current renderer on the interactor style.");
352
353 CurrentRenderer->Render ();
354 break;
355 }
356
357
358
359 static pcl::visualization::CloudActorMap::iterator it = actors_->begin ();
360 // it might be that some actors don't have a valid transformation set -> we skip them to avoid a seg fault.
361 bool found_transformation = false;
362 for (unsigned idx = 0; idx < actors_->size (); ++idx, ++it)
363 {
364 if (it == actors_->end ())
365 it = actors_->begin ();
366
367 const pcl::visualization::CloudActor& actor = it->second;
368 if (actor.viewpoint_transformation_.GetPointer ())
369 {
370 found_transformation = true;
371 break;
372 }
373 }
374
375 // if a valid transformation was found, use it otherwise fall back to default view point.
376 if (found_transformation)
377 {
378 const pcl::visualization::CloudActor& actor = it->second;
379 cam->SetPosition (actor.viewpoint_transformation_->GetElement (0, 3),
380 actor.viewpoint_transformation_->GetElement (1, 3),
381 actor.viewpoint_transformation_->GetElement (2, 3));
382
383 cam->SetFocalPoint (actor.viewpoint_transformation_->GetElement (0, 3) - actor.viewpoint_transformation_->GetElement (0, 2),
384 actor.viewpoint_transformation_->GetElement (1, 3) - actor.viewpoint_transformation_->GetElement (1, 2),
385 actor.viewpoint_transformation_->GetElement (2, 3) - actor.viewpoint_transformation_->GetElement (2, 2));
386
387 cam->SetViewUp (actor.viewpoint_transformation_->GetElement (0, 1),
388 actor.viewpoint_transformation_->GetElement (1, 1),
389 actor.viewpoint_transformation_->GetElement (2, 1));
390 }
391 else
392 {
393 //, 0.715357, 0.012124, 0.698653
394 cam->SetPosition (0.5, 0.0, 0.5);
395 cam->SetFocalPoint (0, 0, 1);
396 cam->SetViewUp (1.03093, -0.140037, 1.86098);
397 }
398
399 // go to the next actor for the next key-press event.
400 if (it != actors_->end ())
401 ++it;
402 else
403 it = actors_->begin ();
404 */
405 cam->SetPosition (-3.0, 0.0, 6.0);
406 cam->SetFocalPoint (0, 0, 1);
407 cam->SetViewUp (1.03093, -0.140037, 1.86098);
408
409 CurrentRenderer->SetActiveCamera (cam);
410 CurrentRenderer->ResetCameraClippingRange ();
411 CurrentRenderer->Render ();
412 break;
413 }
414
415 case 'q': case 'Q':
416 {
417 Interactor->ExitCallback ();
418 return;
419 }
420 default:
421 {
422 Superclass::OnKeyDown ();
423 break;
424 }
425 }
426
427 pcl::visualization::KeyboardEvent event (true, Interactor->GetKeySym (), Interactor->GetKeyCode (), Interactor->GetAltKey (), Interactor->GetControlKey (), Interactor->GetShiftKey ());
428 keyboard_signal_ (event);
429
430 rens_->Render ();
431 Interactor->Render ();
432}
433
434vtkStandardNewMacro(interactor_style_3dv);
Note: See TracBrowser for help on using the repository browser.