即使不会使用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;
}