实例8:command与observe设计模式(当交互使相机变化时打印出当前相机的坐标,当发生拾取演员事件时,演员设置为红色)
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCommand.h>
#include <vtkProperty.h>
//自定义类vtkMyCallback,输出当前相机坐标(x,y,z)
class vtkMyCallback : public vtkCommand
{
public://公共成员
static vtkMyCallback *New() //静态重载New函数,提醒返回用New创建的类vtkMyCallback
{ return new vtkMyCallback; }
//重载command虚拟函数Execute
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
//将caller转型为renderer对象
vtkRenderer *renderer = reinterpret_cast<vtkRenderer*>(caller);
//输出相机位置(x,y,z)
cout << renderer->GetActiveCamera()->GetPosition()[0] << " "
<< renderer->GetActiveCamera()->GetPosition()[1] << " "
<< renderer->GetActiveCamera()->GetPosition()[2] << "\n";
}
};
//自定义类vtkMyCallback2,设置演员的颜色为红色
class vtkMyCallback2 : public vtkCommand
{
public:
static vtkMyCallback2 *New()
{
return new vtkMyCallback2;
}
//重载command虚拟函数Execute
virtual void Execute(vtkObject *caller, unsigned long eventId, void *callData)
{
//将caller转型为actor对象
vtkActor *actor = reinterpret_cast<vtkActor*>(caller);
//设置演员的颜色为红色
actor->GetProperty()->SetColor(1.0,0.0,0.0);
}
};
int main()
{
//实例化一个椎体对象cone
vtkConeSource *cone=vtkConeSource::New();
cone->SetResolution (10);
cone->SetHeight(3);
cone->SetRadius(1);
vtkPolyDataMapper *coneMapper=vtkPolyDataMapper::New();
coneMapper->SetInputConnection(cone->GetOutputPort());
vtkActor *coneActor=vtkActor::New();
coneActor->SetMapper(coneMapper);
//实例化回调函数mycallback2
vtkMyCallback2 *mycallback2 = vtkMyCallback2::New();
//监听器Observer如果发现有拾取事件PickEvent发生,则调用mycallback2对象
coneActor->AddObserver(vtkCommand::PickEvent,mycallback2);
mycallback2->Delete();
vtkRenderer *renderer=vtkRenderer::New();
renderer->AddActor(coneActor);
renderer->SetBackground(0.1,0.2,0.4);
//实例化回调函数mycallback
vtkMyCallback *mo1 = vtkMyCallback::New();
//监听器Observer如果发现renderer有交互开始事件StartEvent发生,则调用mol对象
renderer->AddObserver(vtkCommand::StartEvent,mo1);
mo1->Delete();
vtkRenderWindow *renWin=vtkRenderWindow::New();
renWin->SetSize(400,400);
renWin->AddRenderer(renderer);
vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New();
interactor->SetRenderWindow(renWin);
renWin->Render();
interactor->Initialize();
interactor->Start();
cone->Delete();
coneActor->Delete();
coneMapper->Delete();
renderer->Delete();
renWin->Delete();
interactor->Delete();
return 0;
}
按下p键进行拾取