VTK学习笔记:使用VTK交互功能

即使不会使用VTK交互功能,不要紧。先从概念入手。

一般一个舞台上,有这么几个元素:

演员;灯光; 照相机; 观众; 和观众交互的行为;

再来看看VTK图形模型主要对象,你会发现很类似这个实际生活的舞台。

1. VTK图形模型主要对象

1、演员(Actor)代表场景中绘制的实体。

通过参数的调节可以设置角色的位置,方向,渲染特性(property),引用(reference),纹理映射(texture)等属性,并可对Actor进行缩放。演员中封装了一个4*4的变换矩阵来实现对演员的位置,方向,大小(缩放)等的操控

2、灯光(lights)由vtkLight类实现,可在场景中照亮绘制对象。

vtkLight可通过调用参数的改变控制灯光的状态(开/关)、照射角度、照射强度、颜色等,并支持点光源和平行光源。创建好后加入到Renderer中即可。

3、照相机(Camera)由vtkCamera类实现。

可以定义观察着的位置、焦点和其他相关属性;可以实现旋转,平移,滚动等动作。

4、属性(Property)主要由vtkProperty实现。

要使三维物体具有真实感,必须说明几何物体的一些特性,例如:光照特性(泛光,漫反射,镜面反射,边缘颜色),反射强度,物体的灰度,物体的绘制样式(点,线框,表面),着色模式(flat,gourand,phong)等。

5、映射(vtkMapper)指定了渲染数据和图形库中基本图元之间的关系。

vtkMapper的一些派生类通过LookupTable映射数据并控制图形库中相应的Actor吐艳的生成。一个或多个Actor可以使用相同的Mapper。Mapper有多个参数对其进行控制,如ScalarVisibility标志可以设置scalar的数据是否影响相关的Actor的颜色;ScalarMode可以控制Actor的颜色是scalar point还是cell的值;渲染方式可以通过(ImmediateModeRenderingOn)和( ImmediateModeRenderingOff)控制,前一项表示立即渲染,后一项表示将渲染放于渲染列表中,一般选择ImmediateModeRenderingOn方式进行, 因为如果选择ImmediateModeRenderingOff方式, 将会占用较多的系统资源, 影响系统的性能。

6、变换(vtkTransform)时一个方式4*4变换矩阵的堆栈,可对这一堆栈进行各种操作。

如:平移,缩放,旋转等,一般在栈的顶部进行。

7、查找表(vtkLookupTable,vtkColorTransferFunction)

8、渲染器(vtkRenderer)基类为vtkRenderer, 作用是管理光源、照相机和绘制对象等的位置、属性等; 提供了世界坐标系, 观察坐标系及显示坐标系之间的转换。建立好一个Renderer 后将其加入到RenderWindow中即可将场景显示出来。

9、渲染窗口(vtkRenderWindow)其基类为vtkRenderWindow, 管理显示设备上的窗口, 一个或多个绘制方法可在渲染窗口上创建一个场景。渲染窗口是用户图形界面, 其中包括了设置渲染窗口的大小, 产生立体显示效果等的方法, 一共控制控制两个缓存。

10、窗口互动(vtkRenderWindowInteractor)当演员(actor)在窗口中渲染之后,可以使用窗口互动操纵照相机,选择演员,调用自定义消息函数等。


VTK 提供了两种交互方法,第一种是使用vtkInteractorStyle 类的子类,第二种是使用系统提供的交互方法(如windows系统的事件)或者用户自己定义交互类型,如果使用第二种,需要用户必须直接管理事件循环(不推荐,有点麻烦)。


代码示例:

#include "vtkConeSource.h" 
#include "vtkPolyDataMapper.h" 
#include "vtkRenderWindow.h" 
#include "vtkCamera.h" 
#include "vtkActor.h" 
#include "vtkRenderer.h" 
#include "vtkProperty.h" 
int main() 

//首先new出一个要显示的数据对象,个人理解相当于演员的道具
       vtkConeSource *cone = vtkConeSource::New(); 
       cone->SetHeight( 3.0 ); 
       cone->SetRadius( 1.0 ); 
       cone->SetResolution( 10 ); 
       //渲染数据和图形库中基本图元之间的关系
       vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); 
       coneMapper->SetInputConnection( cone->GetOutputPort() ); 
       
  // 拿出演员actor,演员上了有表演的道具
       vtkActor *coneActor = vtkActor::New(); 
       coneActor->SetMapper( coneMapper ); 
       //把演员化个妆什么的
       vtkRenderer *ren1= vtkRenderer::New(); 
       ren1->AddActor( coneActor ); 
       ren1->SetBackground( 0.1, 0.2, 0.4 ); 
       //把演员交给舞台
       vtkRenderWindow *renWin = vtkRenderWindow::New(); 
       renWin->AddRenderer( ren1 ); 
       renWin->SetSize( 300, 300 ); 
       
       int i; 
       for (i = 0; i < 360; ++i) 
       { 
              renWin->Render(); 
              ren1->GetActiveCamera()->Azimuth( i ); 
    } 
       
  //销毁资源
       cone->Delete(); 
       coneMapper->Delete(); 
       coneActor->Delete(); 
       ren1->Delete(); 
       renWin->Delete(); 
       
       return 0; 

你可能感兴趣的:(ITK/VTK_重建)