VTK笔记-交互器-vtkRenderWindowInteractor

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。该样式下,用户可以通过控制相机对物体做旋转、放大、缩小等操作。具体的使用方式在之后学习中记录下来,这里不做详细叙述;

参考文献

1.vtkRenderWindowInteractor Class Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值