VTK例子24-vtkCellPicker
本帖最后由 medimage 于 2015-12-6 12:46 编辑vtkCellPickervtkObject与vtkCommand共同完成消息的相应。一旦vtkObject的某一事件触发,vtkCommand即会执行其Execute成员函数,该函数内部会调用一个用户自定义的回调函数,这就给用户提供了的控制能力。 vtkInteractorStyleTrackballCamera负责响应键盘与鼠标的事件。该例中,vtkInteractorStyleTrackballCamera与vtkCallbackCommand共同完成了对鼠标点击的响应。一旦点击事件触发,vtkCallbackCommand调用Execute(),该函数调用自定义的回调函数PickerInteractionCallback(),该回调函数内部调用vtkCellPicker:pick(),而该函数触发了vtkCommand::EndPickEvent事件,PickCommand::Execute作出响应,输出坐标
This example demonstrates cell picking using vtkCellPicker.It displaysthe results of picking using a vtkTextMapper.
converted from TCL#include "stdafx.h"#include "vtkSphereSource.h"#include "vtkPolyDataMapper.h"#include "vtkLODActor.h"#include "vtkConeSource.h"#include "vtkGlyph3D.h"#include "vtkCellPicker.h"#include "vtkTextMapper.h"#include "vtkActor2D.h"#include "vtkInteractorStyleTrackballCamera.h"#include "vtkRenderer.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkTextProperty.h"#include "vtkCallbackCommand.h"#include "vtkCamera.h"
int MouseMotion;vtkRenderer *ren1;vtkRenderWindow *renWin;vtkRenderWindowInteractor *iren;vtkCellPicker *picker;vtkActor2D *textActor;vtkTextMapper *textMapper;class PickCommand : public vtkCommand{public: static PickCommand *New() { return new PickCommand; } void Delete() { delete this; } virtual void Execute(vtkObject *caller, unsigned long l, void *callData) { if (picker->GetCellId() < 0 ) { textActor->VisibilityOff(); } else { double selpt; picker->GetSelectionPoint(selpt); double x = selpt; double y = selpt; double pickPos; picker->GetPickPosition( pickPos ); double xp = pickPos; double yp = pickPos; double zp = pickPos; char text; sprintf( text, "(%5.5f,%5.5f,%5.5f)", xp, yp, zp ); textMapper->SetInput( text ); textActor->SetPosition(x, y); textActor->VisibilityOn(); } renWin->Render(); }};void PickerInteractionCallback( vtkObject* vtkNotUsed(object), unsigned long event, void* clientdata, void* vtkNotUsed(calldata) ){ vtkInteractorStyleTrackballCamera * style =(vtkInteractorStyleTrackballCamera*)clientdata; switch( event ) { case vtkCommand::LeftButtonPressEvent: MouseMotion = 0; style->OnLeftButtonDown(); break; case vtkCommand::LeftButtonReleaseEvent: if (MouseMotion == 0) { int *pick = iren->GetEventPosition(); picker->Pick((double)pick, (double)pick, 0.0, ren1); } style->OnLeftButtonUp(); break; case vtkCommand::MouseMoveEvent: MouseMotion = 1; style->OnMouseMove(); break; }}void main(int argc, char* argv){ MouseMotion = 0; vtkSphereSource *sphere = vtkSphereSource::New(); vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New(); sphereMapper->SetInput(sphere->GetOutput()); sphereMapper->GlobalImmediateModeRenderingOn(); vtkLODActor *sphereActor = vtkLODActor::New(); sphereActor->SetMapper(sphereMapper);// create the spikes by glyphing the sphere with a cone.Create the mapper// and actor for the glyphs. vtkConeSource *cone = vtkConeSource::New(); vtkGlyph3D *glyph = vtkGlyph3D::New(); glyph->SetInput(sphere->GetOutput()); glyph->SetSource(cone->GetOutput()); glyph->SetVectorModeToUseNormal(); glyph->SetScaleModeToScaleByVector(); glyph->SetScaleFactor(0.25); vtkPolyDataMapper *spikeMapper = vtkPolyDataMapper::New(); spikeMapper->SetInput(glyph->GetOutput()); vtkLODActor *spikeActor = vtkLODActor::New(); spikeActor->SetMapper(spikeMapper);// Create a cell picker. PickCommand* pickObserver = PickCommand::New(); picker = vtkCellPicker::New(); picker->AddObserver( vtkCommand::EndPickEvent, pickObserver );// Create a text mapper and actor to display the results of picking. textMapper = vtkTextMapper::New(); vtkTextProperty *tprop = textMapper->GetTextProperty(); tprop->SetFontFamilyToArial(); tprop->SetFontSize(12); tprop->BoldOn();// tprop->ShadowOn(); tprop->SetColor(1, 0, 0); textActor = vtkActor2D::New(); textActor->VisibilityOff(); textActor->SetMapper(textMapper);// Create the Renderer, RenderWindow, and RenderWindowInteractor
vtkInteractorStyleTrackballCamera *style =vtkInteractorStyleTrackballCamera::New(); vtkCallbackCommand * pickerCommand = vtkCallbackCommand::New(); pickerCommand->SetClientData(style); pickerCommand->SetCallback(PickerInteractionCallback); style->AddObserver(vtkCommand::LeftButtonPressEvent, pickerCommand); style->AddObserver(vtkCommand::MouseMoveEvent, pickerCommand); style->AddObserver(vtkCommand::LeftButtonReleaseEvent, pickerCommand); ren1 = vtkRenderer::New(); renWin = vtkRenderWindow::New(); renWin->AddRenderer(ren1); iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); iren->SetPicker(picker);// Add the actors to the renderer, set the background and size
ren1->AddActor2D(textActor); ren1->AddActor(sphereActor); ren1->AddActor(spikeActor); ren1->SetBackground(1, 1, 1); renWin->SetSize(300, 300);// Get the camera and zoom in closer to the image. vtkCamera *cam1 = ren1->GetActiveCamera(); cam1->Zoom(1.4); iren->Initialize(); iren->Start(); picker->RemoveObserver( pickObserver ); sphere->Delete(); sphereMapper->Delete(); sphereActor->Delete(); cone->Delete(); glyph->Delete(); spikeMapper->Delete(); spikeActor->Delete(); picker->Delete(); textMapper->Delete(); textActor->Delete(); pickerCommand->Delete(); style->Delete(); ren1->Delete(); renWin->Delete(); pickObserver->Delete();//iren->Delete();} 很不错噢 谢谢分享!
一直在摸索,还是楼主厉害! 这个东西一定要看看 好好好好哈 回复看下,!! 大哥谢了 顶 谢谢啊版主
页:
[1]