vtkRenderWindowInteractor
vtkRenderWindowInteractor能与平台无关的渲染窗口交互,包括拾取和帧速率控制。
也就是说vtkRenderWindowInteractor能捕捉渲染窗口中的鼠标和键盘事件,并将这些事件转变为对相机、演员和属性对象的相应操作,具体的转变由交互方式确定;
vtkRenderWindowInteractor为鼠标/键计时器事件提供独立于平台的交互机制。它作为平台相关实现的基类,处理将鼠标/键/计时器消息交给vtkInteractorObserver 及其子类进行处理。vtkRenderWindowInteractor还提供了拾取、渲染帧速率和前照灯的控件。
vtkRenderWindowInteractor与以前的实现不同,现在只作为一个shell来保存用户首选项并将消息路由到vtkInteractorStyle。回调可用于许多事件。特定于平台的子类应提供操作计时器、终止APP的方法,如果需要,还应通过Initialize/Start/Enable/Disable提供事件循环。
注意:vtkRenderWindowInteractor通过VTK的命令/观察者设计模式路由事件。也就是说,当vtkRenderWindowInteractor(实际上是它在平台上的具体一个子类,比如在Windows平台下会使用vtkWin32RenderWindowInteractor)看到依赖于平台的事件时,它会使用InvokeEvent()方法将其转换为VTK事件;然后,为该事件注册的任何vtkInteractorObserver 都将视情况作出响应。
具体的使用流程:
1.创建一个交互器vtkRenderWindowInteractor对象iren;
2.给对象iren设定SetRenderWindow()需要交互的窗口;
3.给对象iren指定SetInteractorStyle()特定的交互方式,如果没有指定,交互器会使用默认交互方式;
4.对对象iren初始化Initialize,调用Start开始进行交互;
接口
渲染窗口
vtkRenderWindowInteractor内部使用了一个vtkRenderWindow*指针记录需要交互的窗口对象RenderWindow;
使用SetRenderWindow()设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须给交互器对象设置渲染窗口;
vtkRenderWindow* RenderWindow;
void SetRenderWindow(vtkRenderWindow* aren);
vtkGetObjectMacro(RenderWindow, vtkRenderWindow);
交互器样式
vtkRenderWindowInteractor的成员变量InteractorStyle记录的是vtkInteractorObserver指针; vtkInteractorObserver是用来处理vtkRenderWindowInteractor各种事件的具体子类的父类;
使用SetInteractorStyle()设定vtkRenderWindowInteractor使用的交互器样式,默认的交互器样式为vtkInteractorStyleSwitch;
vtkInteractorObserver* InteractorStyle;
virtual void SetInteractorStyle(vtkInteractorObserver*);
vtkGetObjectMacro(InteractorStyle, vtkInteractorObserver);
启动事件循环
virtual void Start();
该方法表示开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生。一般在Start()前,先调用Initialize()方法;
初始化interactior
virtual void Initialize();
准备处理事件,并将成员对象Enabled标志设置为1。
如果没有初始化interactior,Start()将自动调用它,但是如果需要在初始化和事件循环开始之间执行任何操作,则可以手动调用它。
代码
#include "pch.h"
#include <iostream>
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderer.h"
#include "vtkActor.h"
#include "vtkProperty.h"
#include "vtkLight.h"
#include "vtkRenderWindow.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace std;
int main()
{
vtkConeSource* cone = vtkConeSource::New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
vtkPolyDataMapper* coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputConnection(cone->GetOutputPort());
vtkActor* coneActor = vtkActor::New();
coneActor->SetMapper(coneMapper);
vtkRenderer* ren1 = vtkRenderer::New();
ren1->AddActor(coneActor);
ren1->SetBackground(0.1, 0.2, 0.3);
vtkRenderWindow* renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
renWin->SetSize(300, 300);
vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New();
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->SetInteractorStyle(style);
iren->Initialize();
iren->Start();
system("pause");
return 0;
}
代码中使用的交互器样式是vtkInteractorStyleTrackballCamera。该样式下,用户可以通过控制相机对物体做旋转、放大、缩小等操作。具体的使用方式在之后学习中记录下来,这里不做详细叙述;