VTK Users Guide 中C++例程之annotatePick

本人将《The VTK User’s Guide 11th Edition 》中的TCL编写的例程进行了C++的转换,使用的平台是VS2015,VTK版本是8.0.1。之所以贴出来,以求方便大家使用C++来进行VTK的研究。

VTK/Examples/Annotation/Tcl/annotatePick.tcl.之 转成C++

  1 #include "vtkAutoInit.h"
  2 #include "vtkRenderer.h"
  3 #include "vtkRenderWindow.h"
  4 #include "vtkRenderWindowInteractor.h"
  5 #include "vtkSmartPointer.h"
  6 #include "vtkSphereSource.h"
  7 #include "vtkPolyDataMapper.h"
  8 #include "vtkLODActor.h"
  9 #include "vtkConeSource.h"
 10 #include "vtkGlyph3D.h"
 11 #include "vtkCallbackCommand.h"
 12 #include "vtkCommand.h"
 13 #include "vtkCellPicker.h"
 14 #include "vtkTextMapper.h"
 15 #include "vtkTextProperty.h"
 16 #include "vtkActor2D.h"
 17 #include "vtkCamera.h"
 18 #include "vtkAbstractPicker.h"
 19 #include "vtkPoints.h"
 20 #include "vtkObject.h"
 21 
 22 static vtkSmartPointer<vtkCellPicker> picker1;
 23 static vtkSmartPointer<vtkTextMapper> textMapper;
 24 static vtkSmartPointer<vtkActor2D> textActor;
 25 static vtkSmartPointer<vtkPoints> pickPos;
 26 static vtkSmartPointer<vtkRenderWindow> renWin;
 27 static double *selPt;
 28 static double x;
 29 static double y;
 30 static double xp;
 31 static double yp;
 32 static double zp;
 33 
 34 void myCallbackFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData)
 35 {
 36     picker1 = (vtkCellPicker*)clientData;
 37     if (picker1->GetCellId() < 0)
 38     {
 39         textActor->VisibilityOff();
 40     } 
 41     else
 42     {
 43         selPt = picker1->GetSelectionPoint();
 44         x = *selPt;
 45         y = *(selPt + 1);
 46         pickPos = picker1->GetPickedPositions();
 47         xp = *(pickPos->GetPoint(0));
 48         yp = *(pickPos->GetPoint(0)+1);
 49         zp = *(pickPos->GetPoint(0)+2);
 50         char str[50];
 51         sprintf_s(str, "%f,%f,%f", xp, yp, zp);
 52         textMapper->SetInput(str);
 53         textActor->SetPosition(x, y);
 54         textActor->VisibilityOn();
 55     }
 56 
 57     renWin->Render();
 58 }
 59 
 60 int main()
 61 {
 62     VTK_MODULE_INIT(vtkRenderingOpenGL2);
 63     VTK_MODULE_INIT(vtkRenderingFreeType);
 64     VTK_MODULE_INIT(vtkInteractionStyle);
 65 
 66     //# create a sphere source, mapper, and actor
 67     vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();
 68     vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
 69     sphereMapper->SetInputConnection(sphere->GetOutputPort());
 70     sphereMapper->GlobalImmediateModeRenderingOn();
 71     vtkSmartPointer<vtkLODActor> sphereActor = vtkSmartPointer<vtkLODActor>::New();
 72     sphereActor->SetMapper(sphereMapper);
 73 
 74     //# create the spikes by glyphing the sphere with a cone.Create the mapper
 75     //# and actor for the glyphs.
 76     vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
 77     vtkSmartPointer<vtkGlyph3D> glyph = vtkSmartPointer<vtkGlyph3D>::New();
 78     glyph->SetInputConnection(sphere->GetOutputPort());
 79     glyph->SetSourceConnection(cone->GetOutputPort());
 80     glyph->SetVectorModeToUseNormal();
 81     glyph->SetScaleModeToScaleByVector();
 82     glyph->SetScaleFactor(0.25);
 83     vtkSmartPointer<vtkPolyDataMapper> spikeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
 84     spikeMapper->SetInputConnection(glyph->GetOutputPort());
 85     vtkSmartPointer<vtkLODActor> spikeActor = vtkSmartPointer<vtkLODActor>::New();
 86     spikeActor->SetMapper(spikeMapper);
 87 
 88     //# Create a cell picker.
 89     vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();
 90     vtkSmartPointer<vtkCallbackCommand> annotatePick = vtkSmartPointer<vtkCallbackCommand>::New();
 91     annotatePick->SetCallback(myCallbackFunction);
 92     annotatePick->SetClientData(picker);
 93     picker->AddObserver(vtkCommand::EndPickEvent, annotatePick);
 94 
 95     //# Create a text mapper and actor to display the results of picking.
 96     textMapper = vtkSmartPointer<vtkTextMapper>::New();
 97     textMapper->GetTextProperty()->SetFontFamilyToArial();
 98     textMapper->GetTextProperty()->SetFontSize(10);
 99     textMapper->GetTextProperty()->BoldOn();
100     textMapper->GetTextProperty()->ShadowOn();
101     textMapper->GetTextProperty()->SetColor(1, 0, 0);
102     textActor = vtkSmartPointer<vtkActor2D>::New();
103     textActor->VisibilityOff();
104     textActor->SetMapper(textMapper);
105 
106     //Create the Renderer, RenderWindow, RenderWindowInteractor
107     vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
108     renWin = vtkSmartPointer<vtkRenderWindow>::New();
109     renWin->AddRenderer(ren1);
110     vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
111     iren->SetRenderWindow(renWin);
112     iren->SetPicker(picker);
113 
114     //Add the actors to the renderer, set the background and size
115     ren1->AddActor2D(textActor);
116     ren1->AddActor(sphereActor);
117     ren1->AddActor(spikeActor);
118     ren1->SetBackground(1, 1, 1);
119     renWin->SetSize(300, 300);
120     ren1->ResetCamera();
121     ren1->GetActiveCamera()->Zoom(1.4);
122 
123     //# Pick the cell at this location.
124     picker->Pick(85.0, 126.0, 0, ren1);
125 
126     iren->Start();
127     return 0;
128 }

 

posted on 2017-11-28 17:00  湘水亭长  阅读(600)  评论(0编辑  收藏  举报