1 前言:vtkpick系列在《VTK图形图像开发进阶》一书中讲得非常详细;这里不再赘述,在实际项目中会遇到需要点选一个点标记出来,在下次选择另一个点的时候继续标记同时删除上一次的标记点。
2 代码:
class PointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
static PointPickerInteractorStyle* New();
vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleTrackballCamera)
PointPickerInteractorStyle()
{
last_picked_actor=NULL;
}
virtual ~PointPickerInteractorStyle()
{
}
virtual void OnRightButtonDown()
{
//打印鼠标左键像素位置
if(this->Interactor->GetControlKey())
{
std::cout << "Picking pixel: " << this->Interactor->GetEventPosition()[0]
<< " " << this->Interactor->GetEventPosition()[1] << std::endl;
//注册拾取点函数
this->Interactor->GetPicker()->Pick(
this->Interactor->GetEventPosition()[0],
this->Interactor->GetEventPosition()[1], 0, // always zero.
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()
);
//打印拾取点空间位置
this->Interactor->GetPicker()->GetPickPosition(picked);
std::cout << "Picked value: " << picked[0] << " " << picked[1] << " " << picked[2] << std::endl;
//如果之前选择了其他点,删除上一次的标记点
if(this->last_picked_actor)
{
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->RemoveActor(last_picked_actor);
// last_picked_actor->Delete();
// last_picked_actor=vtkActor::New();
}
//获取此次的标记点。
this->last_picked_actor=GetActor();
if(this->last_picked_actor)
{
//标记出来,
this->last_picked_actor->SetScale(0.02);
this->last_picked_actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(this->last_picked_actor);
}
vtkInteractorStyleTrackballCamera::OnRightButtonDown();
}
}
int flag;
double picked[3];//选取的点坐标
private:
vtkActor* last_picked_actor;
inline vtkActor* GetActor()
{
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
actor->SetPosition(picked);
return actor;
}
};
3 参考文献
《VTK图形图像开发进阶》
http://blog.youkuaiyun.com/webzhuce/article/details/72802322