40 #ifndef PCL_PCL_VISUALIZER_IMPL_H_
41 #define PCL_PCL_VISUALIZER_IMPL_H_
43 #include <vtkCellData.h>
44 #include <vtkSmartPointer.h>
45 #include <vtkCellArray.h>
46 #include <vtkProperty2D.h>
47 #include <vtkMapper2D.h>
48 #include <vtkLeaderActor2D.h>
50 #include <vtkAlgorithmOutput.h>
53 template <
typename Po
intT>
bool
56 const std::string &
id,
int viewport)
60 return (addPointCloud<PointT> (cloud, geometry_handler,
id, viewport));
64 template <
typename Po
intT>
bool
68 const std::string &
id,
int viewport)
71 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
73 if (am_it != cloud_actor_map_->end ())
75 PCL_WARN (
"[addPointCloud] A PointCloud with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
85 template <
typename Po
intT>
bool
89 const std::string &
id,
int viewport)
92 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
94 if (am_it != cloud_actor_map_->end ())
98 am_it->second.geometry_handlers.push_back (geometry_handler);
108 template <
typename Po
intT>
bool
112 const std::string &
id,
int viewport)
115 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
117 if (am_it != cloud_actor_map_->end ())
119 PCL_WARN (
"[addPointCloud] A PointCloud with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
133 template <
typename Po
intT>
bool
137 const std::string &
id,
int viewport)
140 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
141 if (am_it != cloud_actor_map_->end ())
145 am_it->second.color_handlers.push_back (color_handler);
154 template <
typename Po
intT>
bool
159 const std::string &
id,
int viewport)
162 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
163 if (am_it != cloud_actor_map_->end ())
167 am_it->second.geometry_handlers.push_back (geometry_handler);
168 am_it->second.color_handlers.push_back (color_handler);
175 template <
typename Po
intT>
bool
180 const std::string &
id,
int viewport)
183 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
185 if (am_it != cloud_actor_map_->end ())
187 PCL_WARN (
"[addPointCloud] A PointCloud with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
199 template <
typename Po
intT>
void
200 pcl::visualization::PCLVisualizer::convertPointCloudToVTKPolyData (
202 vtkSmartPointer<vtkPolyData> &polydata,
203 vtkSmartPointer<vtkIdTypeArray> &initcells)
205 vtkSmartPointer<vtkCellArray> vertices;
208 allocVtkPolyData (polydata);
209 vertices = vtkSmartPointer<vtkCellArray>::New ();
210 polydata->SetVerts (vertices);
214 vertices = polydata->GetVerts ();
216 vertices = vtkSmartPointer<vtkCellArray>::New ();
218 vtkIdType nr_points = cloud->
points.size ();
220 vtkSmartPointer<vtkPoints> points = polydata->GetPoints ();
223 points = vtkSmartPointer<vtkPoints>::New ();
224 points->SetDataTypeToFloat ();
225 polydata->SetPoints (points);
227 points->SetNumberOfPoints (nr_points);
230 float *data = ((vtkFloatArray*)points->GetData ())->GetPointer (0);
235 for (vtkIdType i = 0; i < nr_points; ++i)
236 memcpy (&data[i * 3], &cloud->
points[i].x, 12);
241 for (vtkIdType i = 0; i < nr_points; ++i)
249 memcpy (&data[j * 3], &cloud->
points[i].x, 12);
253 points->SetNumberOfPoints (nr_points);
256 vtkSmartPointer<vtkIdTypeArray> cells = vertices->GetData ();
257 updateCells (cells, initcells, nr_points);
260 vertices->SetCells (nr_points, cells);
264 template <
typename Po
intT>
void
265 pcl::visualization::PCLVisualizer::convertPointCloudToVTKPolyData (
267 vtkSmartPointer<vtkPolyData> &polydata,
268 vtkSmartPointer<vtkIdTypeArray> &initcells)
270 vtkSmartPointer<vtkCellArray> vertices;
273 allocVtkPolyData (polydata);
274 vertices = vtkSmartPointer<vtkCellArray>::New ();
275 polydata->SetVerts (vertices);
279 vtkSmartPointer<vtkPoints> points;
281 polydata->SetPoints (points);
283 vtkIdType nr_points = points->GetNumberOfPoints ();
286 vertices = polydata->GetVerts ();
288 vertices = vtkSmartPointer<vtkCellArray>::New ();
290 vtkSmartPointer<vtkIdTypeArray> cells = vertices->GetData ();
291 updateCells (cells, initcells, nr_points);
293 vertices->SetCells (nr_points, cells);
297 template <
typename Po
intT>
bool
300 double r,
double g,
double b,
const std::string &
id,
int viewport)
303 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
304 if (am_it != shape_actor_map_->end ())
306 PCL_WARN (
"[addPolygon] A shape with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
310 vtkSmartPointer<vtkDataSet> data = createPolygon<PointT> (cloud);
313 vtkSmartPointer<vtkLODActor> actor;
314 createActorFromVTKDataSet (data, actor);
315 actor->GetProperty ()->SetRepresentationToWireframe ();
316 actor->GetProperty ()->SetColor (r, g, b);
317 actor->GetMapper ()->ScalarVisibilityOff ();
318 addActorToRenderer (actor, viewport);
321 (*shape_actor_map_)[id] = actor;
326 template <
typename Po
intT>
bool
329 const std::string &
id,
int viewport)
331 return (!addPolygon<PointT> (cloud, 0.5, 0.5, 0.5,
id, viewport));
336 template <
typename P1,
typename P2>
bool
340 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
341 if (am_it != shape_actor_map_->end ())
343 PCL_WARN (
"[addLine] A shape with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
347 vtkSmartPointer<vtkDataSet> data =
createLine (pt1.getVector4fMap (), pt2.getVector4fMap ());
350 vtkSmartPointer<vtkLODActor> actor;
351 createActorFromVTKDataSet (data, actor);
352 actor->GetProperty ()->SetRepresentationToWireframe ();
353 actor->GetProperty ()->SetColor (r, g, b);
354 actor->GetMapper ()->ScalarVisibilityOff ();
355 addActorToRenderer (actor, viewport);
358 (*shape_actor_map_)[id] = actor;
363 template <
typename P1,
typename P2>
bool
367 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
368 if (am_it != shape_actor_map_->end ())
370 PCL_WARN (
"[addArrow] A shape with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
375 vtkSmartPointer<vtkLeaderActor2D> leader = vtkSmartPointer<vtkLeaderActor2D>::New ();
376 leader->GetPositionCoordinate ()->SetCoordinateSystemToWorld ();
377 leader->GetPositionCoordinate ()->SetValue (pt1.x, pt1.y, pt1.z);
378 leader->GetPosition2Coordinate ()->SetCoordinateSystemToWorld ();
379 leader->GetPosition2Coordinate ()->SetValue (pt2.x, pt2.y, pt2.z);
380 leader->SetArrowStyleToFilled ();
381 leader->AutoLabelOn ();
383 leader->GetProperty ()->SetColor (r, g, b);
384 addActorToRenderer (leader, viewport);
387 (*shape_actor_map_)[id] = leader;
392 template <
typename P1,
typename P2>
bool
396 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
397 if (am_it != shape_actor_map_->end ())
399 PCL_WARN (
"[addArrow] A shape with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
404 vtkSmartPointer<vtkLeaderActor2D> leader = vtkSmartPointer<vtkLeaderActor2D>::New ();
405 leader->GetPositionCoordinate ()->SetCoordinateSystemToWorld ();
406 leader->GetPositionCoordinate ()->SetValue (pt1.x, pt1.y, pt1.z);
407 leader->GetPosition2Coordinate ()->SetCoordinateSystemToWorld ();
408 leader->GetPosition2Coordinate ()->SetValue (pt2.x, pt2.y, pt2.z);
409 leader->SetArrowStyleToFilled ();
410 leader->SetArrowPlacementToPoint1 ();
412 leader->AutoLabelOn ();
414 leader->AutoLabelOff ();
416 leader->GetProperty ()->SetColor (r, g, b);
417 addActorToRenderer (leader, viewport);
420 (*shape_actor_map_)[id] = leader;
425 template <
typename P1,
typename P2>
bool
428 return (!addLine (pt1, pt2, 0.5, 0.5, 0.5,
id, viewport));
477 template <
typename Po
intT>
bool
481 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
482 if (am_it != shape_actor_map_->end ())
484 PCL_WARN (
"[addSphere] A shape with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
489 vtkSmartPointer<vtkSphereSource> data = vtkSmartPointer<vtkSphereSource>::New ();
490 data->SetRadius (radius);
491 data->SetCenter (
double (center.x), double (center.y), double (center.z));
492 data->SetPhiResolution (10);
493 data->SetThetaResolution (10);
494 data->LatLongTessellationOff ();
498 vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
499 mapper->SetInputConnection (data->GetOutputPort ());
502 vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New ();
503 actor->SetMapper (mapper);
505 actor->GetProperty ()->SetRepresentationToWireframe ();
506 actor->GetProperty ()->SetInterpolationToGouraud ();
507 actor->GetMapper ()->ScalarVisibilityOff ();
508 actor->GetProperty ()->SetColor (r, g, b);
509 addActorToRenderer (actor, viewport);
512 (*shape_actor_map_)[id] = actor;
517 template <
typename Po
intT>
bool
520 return (addSphere (center, radius, 0.5, 0.5, 0.5,
id, viewport));
524 template<
typename Po
intT>
bool
528 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
529 if (am_it == shape_actor_map_->end ())
534 vtkLODActor* actor = vtkLODActor::SafeDownCast (am_it->second);
535 vtkAlgorithm *algo = actor->GetMapper ()->GetInput ()->GetProducerPort ()->GetProducer ();
536 vtkSphereSource *src = vtkSphereSource::SafeDownCast (algo);
538 src->SetCenter (
double (center.x), double (center.y), double (center.z));
539 src->SetRadius (radius);
541 actor->GetProperty ()->SetColor (r, g, b);
548 template <
typename Po
intT>
bool
550 const std::string &text,
556 const std::string &
id,
566 ShapeActorMap::iterator am_it = shape_actor_map_->find (tid);
567 if (am_it != shape_actor_map_->end ())
569 pcl::console::print_warn (
"[addText3d] A text with id <%s> already exists! Please choose a different id and retry.\n", tid.c_str ());
573 vtkSmartPointer<vtkVectorText> textSource = vtkSmartPointer<vtkVectorText>::New ();
574 textSource->SetText (text.c_str());
575 textSource->Update ();
577 vtkSmartPointer<vtkPolyDataMapper> textMapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
578 textMapper->SetInputConnection (textSource->GetOutputPort ());
581 rens_->InitTraversal ();
582 vtkRenderer* renderer = NULL;
584 while ((renderer = rens_->GetNextItem ()) != NULL)
587 if (viewport == 0 || viewport == i)
589 vtkSmartPointer<vtkFollower> textActor = vtkSmartPointer<vtkFollower>::New ();
590 textActor->SetMapper (textMapper);
591 textActor->SetPosition (position.x, position.y, position.z);
592 textActor->SetScale (textScale);
593 textActor->GetProperty ()->SetColor (r, g, b);
594 textActor->SetCamera (renderer->GetActiveCamera ());
596 renderer->AddActor (textActor);
601 std::string alternate_tid = tid;
602 alternate_tid.append(i,
'*');
604 (*shape_actor_map_)[(viewport == 0) ? tid : alternate_tid] = textActor;
614 template <
typename Po
intNT>
bool
617 int level,
double scale,
const std::string &
id,
int viewport)
619 return (addPointCloudNormals<PointNT, PointNT>(cloud, cloud, level, scale,
id, viewport));
623 template <
typename Po
intT,
typename Po
intNT>
bool
627 int level,
double scale,
628 const std::string &
id,
int viewport)
632 PCL_ERROR (
"[addPointCloudNormals] The number of points differs from the number of normals!\n");
636 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
638 if (am_it != cloud_actor_map_->end ())
640 PCL_WARN (
"[addPointCloudNormals] A PointCloud with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
644 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
645 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
647 points->SetDataTypeToFloat ();
648 vtkSmartPointer<vtkFloatArray> data = vtkSmartPointer<vtkFloatArray>::New ();
649 data->SetNumberOfComponents (3);
651 vtkIdType nr_normals = (cloud->
points.size () - 1) / level + 1 ;
652 float* pts =
new float[2 * nr_normals * 3];
654 for (vtkIdType i = 0, j = 0; j < nr_normals; j++, i = j * level)
657 p.x += normals->
points[i].normal[0] * scale;
658 p.y += normals->
points[i].normal[1] * scale;
659 p.z += normals->
points[i].normal[2] * scale;
661 pts[2 * j * 3 + 0] = cloud->
points[i].x;
662 pts[2 * j * 3 + 1] = cloud->
points[i].y;
663 pts[2 * j * 3 + 2] = cloud->
points[i].z;
664 pts[2 * j * 3 + 3] = p.x;
665 pts[2 * j * 3 + 4] = p.y;
666 pts[2 * j * 3 + 5] = p.z;
668 lines->InsertNextCell(2);
669 lines->InsertCellPoint(2*j);
670 lines->InsertCellPoint(2*j+1);
673 data->SetArray (&pts[0], 2 * nr_normals * 3, 0);
674 points->SetData (data);
676 vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
677 polyData->SetPoints(points);
678 polyData->SetLines(lines);
680 vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New ();
681 mapper->SetInput (polyData);
682 mapper->SetColorModeToMapScalars();
683 mapper->SetScalarModeToUsePointData();
686 vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New ();
687 actor->SetMapper (mapper);
690 addActorToRenderer (actor, viewport);
693 (*cloud_actor_map_)[id].actor = actor;
698 template <
typename Po
intT>
bool
702 const std::vector<int> &correspondences,
703 const std::string &
id,
707 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
708 if (am_it != shape_actor_map_->end ())
710 PCL_WARN (
"[addCorrespondences] A set of correspondences with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
714 vtkSmartPointer<vtkAppendPolyData> polydata = vtkSmartPointer<vtkAppendPolyData>::New ();
716 vtkSmartPointer<vtkUnsignedCharArray> line_colors = vtkSmartPointer<vtkUnsignedCharArray>::New ();
717 line_colors->SetNumberOfComponents (3);
718 line_colors->SetName (
"Colors");
720 unsigned char rgb[3];
726 for (
size_t i = 0; i < source_points->
size (); ++i)
729 const PointT &p_tgt = target_points->
points[correspondences[i]];
732 vtkSmartPointer<vtkLineSource> line = vtkSmartPointer<vtkLineSource>::New ();
733 line->SetPoint1 (p_src.x, p_src.y, p_src.z);
734 line->SetPoint2 (p_tgt.x, p_tgt.y, p_tgt.z);
736 polydata->AddInput (line->GetOutput ());
737 line_colors->InsertNextTupleValue (rgb);
740 vtkSmartPointer<vtkPolyData> line_data = polydata->GetOutput ();
741 line_data->GetCellData ()->SetScalars (line_colors);
744 vtkSmartPointer<vtkLODActor> actor;
745 createActorFromVTKDataSet (line_data, actor);
746 actor->GetProperty ()->SetRepresentationToWireframe ();
747 actor->GetProperty ()->SetOpacity (0.5);
748 addActorToRenderer (actor, viewport);
751 (*shape_actor_map_)[id] = actor;
757 template <
typename Po
intT>
bool
762 const std::string &
id,
766 ShapeActorMap::iterator am_it = shape_actor_map_->find (
id);
767 if (am_it != shape_actor_map_->end ())
769 PCL_WARN (
"[addCorrespondences] A set of correspondences with id <%s> already exists! Please choose a different id and retry.\n",
id.c_str ());
773 vtkSmartPointer<vtkAppendPolyData> polydata = vtkSmartPointer<vtkAppendPolyData>::New ();
775 vtkSmartPointer<vtkUnsignedCharArray> line_colors = vtkSmartPointer<vtkUnsignedCharArray>::New ();
776 line_colors->SetNumberOfComponents (3);
777 line_colors->SetName (
"Colors");
778 unsigned char rgb[3];
785 for (
size_t i = 0; i < correspondences.size (); ++i)
787 const PointT &p_src = source_points->
points[correspondences[i].index_query];
788 const PointT &p_tgt = target_points->
points[correspondences[i].index_match];
791 vtkSmartPointer<vtkLineSource> line = vtkSmartPointer<vtkLineSource>::New ();
792 line->SetPoint1 (p_src.x, p_src.y, p_src.z);
793 line->SetPoint2 (p_tgt.x, p_tgt.y, p_tgt.z);
795 polydata->AddInput (line->GetOutput ());
796 line_colors->InsertNextTupleValue (rgb);
799 vtkSmartPointer<vtkPolyData> line_data = polydata->GetOutput ();
800 line_data->GetCellData ()->SetScalars (line_colors);
803 vtkSmartPointer<vtkLODActor> actor;
804 createActorFromVTKDataSet (line_data, actor);
805 actor->GetProperty ()->SetRepresentationToWireframe ();
806 actor->GetProperty ()->SetOpacity (0.5);
807 addActorToRenderer (actor, viewport);
810 (*shape_actor_map_)[id] = actor;
816 template <
typename Po
intT>
bool
817 pcl::visualization::PCLVisualizer::fromHandlersToScreen (
820 const std::string &
id,
822 const Eigen::Vector4f& sensor_origin,
823 const Eigen::Quaternion<float>& sensor_orientation)
827 PCL_WARN (
"[fromHandlersToScreen] PointCloud <%s> requested with an invalid geometry handler (%s)!\n",
id.c_str (), geometry_handler.
getName ().c_str ());
833 PCL_WARN (
"[fromHandlersToScreen] PointCloud <%s> requested with an invalid color handler (%s)!\n",
id.c_str (), color_handler.
getName ().c_str ());
837 vtkSmartPointer<vtkPolyData> polydata;
838 vtkSmartPointer<vtkIdTypeArray> initcells;
840 convertPointCloudToVTKPolyData<PointT> (geometry_handler, polydata, initcells);
845 vtkSmartPointer<vtkDataArray> scalars;
847 polydata->GetPointData ()->SetScalars (scalars);
849 scalars->GetRange (minmax);
852 vtkSmartPointer<vtkLODActor> actor;
853 createActorFromVTKDataSet (polydata, actor);
854 actor->GetMapper ()->SetScalarRange (minmax);
857 addActorToRenderer (actor, viewport);
860 (*cloud_actor_map_)[id].actor = actor;
861 (*cloud_actor_map_)[id].cells = initcells;
864 vtkSmartPointer<vtkMatrix4x4> transformation = vtkSmartPointer<vtkMatrix4x4>::New();
865 convertToVtkMatrix (sensor_origin, sensor_orientation, transformation);
866 (*cloud_actor_map_)[id].viewpoint_transformation_ = transformation;
872 template <
typename Po
intT>
bool
873 pcl::visualization::PCLVisualizer::fromHandlersToScreen (
874 const PointCloudGeometryHandler<PointT> &geometry_handler,
875 const ColorHandlerConstPtr &color_handler,
876 const std::string &
id,
878 const Eigen::Vector4f& sensor_origin,
879 const Eigen::Quaternion<float>& sensor_orientation)
881 if (!geometry_handler.isCapable ())
883 PCL_WARN (
"[fromHandlersToScreen] PointCloud <%s> requested with an invalid geometry handler (%s)!\n",
id.c_str (), geometry_handler.getName ().c_str ());
887 if (!color_handler->isCapable ())
889 PCL_WARN (
"[fromHandlersToScreen] PointCloud <%s> requested with an invalid color handler (%s)!\n",
id.c_str (), color_handler->getName ().c_str ());
893 vtkSmartPointer<vtkPolyData> polydata;
894 vtkSmartPointer<vtkIdTypeArray> initcells;
896 convertPointCloudToVTKPolyData<PointT> (geometry_handler, polydata, initcells);
901 vtkSmartPointer<vtkDataArray> scalars;
902 color_handler->getColor (scalars);
903 polydata->GetPointData ()->SetScalars (scalars);
905 scalars->GetRange (minmax);
908 vtkSmartPointer<vtkLODActor> actor;
909 createActorFromVTKDataSet (polydata, actor);
910 actor->GetMapper ()->SetScalarRange (minmax);
913 addActorToRenderer (actor, viewport);
916 (*cloud_actor_map_)[id].actor = actor;
917 (*cloud_actor_map_)[id].cells = initcells;
918 (*cloud_actor_map_)[id].color_handlers.push_back (color_handler);
922 vtkSmartPointer<vtkMatrix4x4> transformation = vtkSmartPointer<vtkMatrix4x4>::New();
923 convertToVtkMatrix (sensor_origin, sensor_orientation, transformation);
924 (*cloud_actor_map_)[id].viewpoint_transformation_ = transformation;
930 template <
typename Po
intT>
bool
931 pcl::visualization::PCLVisualizer::fromHandlersToScreen (
932 const GeometryHandlerConstPtr &geometry_handler,
933 const PointCloudColorHandler<PointT> &color_handler,
934 const std::string &
id,
936 const Eigen::Vector4f& sensor_origin,
937 const Eigen::Quaternion<float>& sensor_orientation)
939 if (!geometry_handler->isCapable ())
941 PCL_WARN (
"[fromHandlersToScreen] PointCloud <%s> requested with an invalid geometry handler (%s)!\n",
id.c_str (), geometry_handler->getName ().c_str ());
945 if (!color_handler.isCapable ())
947 PCL_WARN (
"[fromHandlersToScreen] PointCloud <%s> requested with an invalid color handler (%s)!\n",
id.c_str (), color_handler.getName ().c_str ());
951 vtkSmartPointer<vtkPolyData> polydata;
952 vtkSmartPointer<vtkIdTypeArray> initcells;
954 convertPointCloudToVTKPolyData (geometry_handler, polydata, initcells);
959 vtkSmartPointer<vtkDataArray> scalars;
960 color_handler.getColor (scalars);
961 polydata->GetPointData ()->SetScalars (scalars);
963 scalars->GetRange (minmax);
966 vtkSmartPointer<vtkLODActor> actor;
967 createActorFromVTKDataSet (polydata, actor);
968 actor->GetMapper ()->SetScalarRange (minmax);
971 addActorToRenderer (actor, viewport);
974 (*cloud_actor_map_)[id].actor = actor;
975 (*cloud_actor_map_)[id].cells = initcells;
976 (*cloud_actor_map_)[id].geometry_handlers.push_back (geometry_handler);
979 vtkSmartPointer<vtkMatrix4x4> transformation = vtkSmartPointer<vtkMatrix4x4>::New();
980 convertToVtkMatrix (sensor_origin, sensor_orientation, transformation);
981 (*cloud_actor_map_)[id].viewpoint_transformation_ = transformation;
987 template <
typename Po
intT>
bool
989 const std::string &
id)
992 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
994 if (am_it == cloud_actor_map_->end ())
997 vtkSmartPointer<vtkPolyData> polydata =
reinterpret_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->GetInput ();
999 convertPointCloudToVTKPolyData<PointT> (cloud, polydata, am_it->second.cells);
1000 polydata->Update ();
1003 vtkSmartPointer<vtkDataArray> scalars;
1004 polydata->GetPointData ()->SetScalars (scalars);
1005 polydata->Update ();
1007 minmax[0] = std::numeric_limits<double>::min ();
1008 minmax[1] = std::numeric_limits<double>::max ();
1009 am_it->second.actor->GetMapper ()->ImmediateModeRenderingOff ();
1010 am_it->second.actor->GetMapper ()->SetScalarRange (minmax);
1013 reinterpret_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->SetInput (polydata);
1018 template <
typename Po
intT>
bool
1021 const std::string &
id)
1024 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
1026 if (am_it == cloud_actor_map_->end ())
1029 vtkSmartPointer<vtkPolyData> polydata =
reinterpret_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->GetInput ();
1033 convertPointCloudToVTKPolyData (geometry_handler, polydata, am_it->second.cells);
1036 vtkSmartPointer<vtkDataArray> scalars;
1037 polydata->GetPointData ()->SetScalars (scalars);
1038 polydata->Update ();
1040 minmax[0] = std::numeric_limits<double>::min ();
1041 minmax[1] = std::numeric_limits<double>::max ();
1042 am_it->second.actor->GetMapper ()->ImmediateModeRenderingOff ();
1043 am_it->second.actor->GetMapper ()->SetScalarRange (minmax);
1046 reinterpret_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->SetInput (polydata);
1052 template <
typename Po
intT>
bool
1055 const std::string &
id)
1058 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
1060 if (am_it == cloud_actor_map_->end ())
1064 vtkSmartPointer<vtkPolyData> polydata =
reinterpret_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->GetInput ();
1067 vtkSmartPointer<vtkCellArray> vertices = polydata->GetVerts ();
1068 vtkSmartPointer<vtkPoints> points = polydata->GetPoints ();
1070 vtkIdType nr_points = cloud->
points.size ();
1071 points->SetNumberOfPoints (nr_points);
1074 float *data = ((vtkFloatArray*)points->GetData ())->GetPointer (0);
1080 for (vtkIdType i = 0; i < nr_points; ++i, pts += 3)
1081 memcpy (&data[pts], &cloud->
points[i].x, 12);
1086 for (vtkIdType i = 0; i < nr_points; ++i)
1092 memcpy (&data[pts], &cloud->
points[i].x, 12);
1097 points->SetNumberOfPoints (nr_points);
1100 vtkSmartPointer<vtkIdTypeArray> cells = vertices->GetData ();
1101 updateCells (cells, am_it->second.cells, nr_points);
1104 vertices->SetCells (nr_points, cells);
1107 vtkSmartPointer<vtkDataArray> scalars;
1110 scalars->GetRange (minmax);
1112 polydata->GetPointData ()->SetScalars (scalars);
1113 polydata->Update ();
1115 am_it->second.actor->GetMapper ()->ImmediateModeRenderingOff ();
1116 am_it->second.actor->GetMapper ()->SetScalarRange (minmax);
1119 reinterpret_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->SetInput (polydata);
1124 template <
typename Po
intT>
bool
1127 const std::vector<pcl::Vertices> &vertices,
1128 const std::string &
id,
1131 if (vertices.empty () || cloud->
points.empty ())
1134 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
1135 if (am_it != cloud_actor_map_->end ())
1138 "[addPolygonMesh] A shape with id <%s> already exists! Please choose a different id and retry.\n",
1144 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New ();
1145 vtkIdType nr_points = cloud->
points.size ();
1146 points->SetNumberOfPoints (nr_points);
1147 vtkSmartPointer<vtkLODActor> actor;
1150 float *data = ((vtkFloatArray*)points->GetData ())->GetPointer (0);
1153 std::vector<int> lookup;
1157 for (vtkIdType i = 0; i < nr_points; ++i, ptr += 3)
1158 memcpy (&data[ptr], &cloud->
points[i].x, sizeof (
float) * 3);
1162 lookup.resize (nr_points);
1164 for (vtkIdType i = 0; i < nr_points; ++i)
1171 memcpy (&data[ptr], &cloud->
points[i].x, sizeof (
float) * 3);
1176 points->SetNumberOfPoints (nr_points);
1180 int max_size_of_polygon = -1;
1181 for (
size_t i = 0; i < vertices.size (); ++i)
1182 if (max_size_of_polygon < (
int)vertices[i].vertices.size ())
1183 max_size_of_polygon = vertices[i].vertices.size ();
1185 if (vertices.size () > 1)
1188 vtkSmartPointer<vtkCellArray> cell_array = vtkSmartPointer<vtkCellArray>::New ();
1189 vtkIdType *cell = cell_array->WritePointer (vertices.size (), vertices.size () * (max_size_of_polygon + 1));
1191 if (lookup.size () > 0)
1193 for (
size_t i = 0; i < vertices.size (); ++i, ++idx)
1195 size_t n_points = vertices[i].vertices.size ();
1198 for (
size_t j = 0; j < n_points; j++, ++idx)
1199 *cell++ = lookup[vertices[i].vertices[j]];
1205 for (
size_t i = 0; i < vertices.size (); ++i, ++idx)
1207 size_t n_points = vertices[i].vertices.size ();
1210 for (
size_t j = 0; j < n_points; j++, ++idx)
1211 *cell++ = vertices[i].vertices[j];
1215 vtkSmartPointer<vtkPolyData> polydata;
1216 allocVtkPolyData (polydata);
1217 cell_array->GetData ()->SetNumberOfValues (idx);
1218 cell_array->Squeeze ();
1219 polydata->SetStrips (cell_array);
1220 polydata->SetPoints (points);
1222 createActorFromVTKDataSet (polydata, actor,
false);
1226 vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New ();
1227 size_t n_points = vertices[0].vertices.size ();
1228 polygon->GetPointIds ()->SetNumberOfIds (n_points - 1);
1230 if (lookup.size () > 0)
1232 for (
size_t j = 0; j < (n_points - 1); ++j)
1233 polygon->GetPointIds ()->SetId (j, lookup[vertices[0].vertices[j]]);
1237 for (
size_t j = 0; j < (n_points - 1); ++j)
1238 polygon->GetPointIds ()->SetId (j, vertices[0].vertices[j]);
1240 vtkSmartPointer<vtkUnstructuredGrid> poly_grid;
1242 poly_grid->Allocate (1, 1);
1243 poly_grid->InsertNextCell (polygon->GetCellType (), polygon->GetPointIds ());
1244 poly_grid->SetPoints (points);
1245 poly_grid->Update ();
1247 createActorFromVTKDataSet (poly_grid, actor,
false);
1249 actor->GetProperty ()->SetRepresentationToSurface ();
1250 actor->GetProperty ()->BackfaceCullingOn ();
1251 actor->GetProperty ()->EdgeVisibilityOff ();
1252 actor->GetProperty ()->ShadingOff ();
1253 addActorToRenderer (actor, viewport);
1256 (*cloud_actor_map_)[id].actor = actor;
1263 template <
typename Po
intT>
bool
1266 const std::vector<pcl::Vertices> &verts,
1267 const std::string &
id)
1276 CloudActorMap::iterator am_it = cloud_actor_map_->find (
id);
1277 if (am_it == cloud_actor_map_->end ())
1281 vtkSmartPointer<vtkPolyData> polydata =
static_cast<vtkPolyDataMapper*
>(am_it->second.actor->GetMapper ())->GetInput ();
1284 vtkSmartPointer<vtkCellArray> cells = polydata->GetStrips ();
1287 vtkSmartPointer<vtkPoints> points = polydata->GetPoints ();
1289 vtkIdType nr_points = cloud->
points.size ();
1290 points->SetNumberOfPoints (nr_points);
1293 float *data = ((vtkFloatArray*)points->GetData ())->GetPointer (0);
1296 std::vector<int> lookup;
1300 for (vtkIdType i = 0; i < nr_points; ++i, ptr += 3)
1301 memcpy (&data[ptr], &cloud->
points[i].x, sizeof (
float) * 3);
1305 lookup.resize (nr_points);
1307 for (vtkIdType i = 0; i < nr_points; ++i)
1314 memcpy (&data[ptr], &cloud->
points[i].x, sizeof (
float) * 3);
1319 points->SetNumberOfPoints (nr_points);
1323 int max_size_of_polygon = -1;
1324 for (
size_t i = 0; i < verts.size (); ++i)
1325 if (max_size_of_polygon < (
int)verts[i].vertices.size ())
1326 max_size_of_polygon = verts[i].vertices.size ();
1329 cells = vtkSmartPointer<vtkCellArray>::New ();
1330 vtkIdType *cell = cells->WritePointer (verts.size (), verts.size () * (max_size_of_polygon + 1));
1332 if (lookup.size () > 0)
1334 for (
size_t i = 0; i < verts.size (); ++i, ++idx)
1336 size_t n_points = verts[i].vertices.size ();
1338 for (
size_t j = 0; j < n_points; j++, cell++, ++idx)
1339 *cell = lookup[verts[i].vertices[j]];
1344 for (
size_t i = 0; i < verts.size (); ++i, ++idx)
1346 size_t n_points = verts[i].vertices.size ();
1348 for (
size_t j = 0; j < n_points; j++, cell++, ++idx)
1349 *cell = verts[i].vertices[j];
1352 cells->GetData ()->SetNumberOfValues (idx);
1355 polydata->SetStrips (cells);
1356 polydata->Update ();
1389 am_it->second.actor->GetProperty ()->BackfaceCullingOn ();