转载自:http://blog.sina.com.cn/s/blog_63f6ddae010126de.html
http://blog.csdn.net/jayxbja/article/details/5701084
仅作学习用途
VTK有两个子系统组成:一个是编译生成的C++类库,一个是通过Java、Tcl、Python语言来使用这些类的解释包。
VTK通过数据流实现变信息为图形数据的。
数据流一般为:source—filter——mapper——actor——render——renderwindow——interactor。
Actor用来在场景中表现一个可视化实体,也可以成为3D图形的描绘实现,主要用足对图形的绘制。它还包含一些属性,用来对显示对象的设置;如Actor->GetProperty()->SetColor(1,1,1)表示白色,也就是将绘制的对象着色为白色。
Camera在VTK中可以理解为视点(FocalPoint),即观察者的位置,或者称为虚拟照相机实现3D视图。
操作方法比较简单,强调的使另外两个重要的方法:
Azimuth(150)表示Camera的视点位置沿着顺时针旋转150角度;
Elevation(60)表示Camera的视点位置沿着向上方向旋转60角度。
Filter是一种数据处理机制,有个或者多个输入,但仅有一个输出。其目的是对图形图像数据进行处理,以便得到我们期望的数据。
要理解工作原理,首先明确几个类型:
1.vtkSource(数据源) 这个就好比一个剧本里面的角色,让演员知道要演的是什么人物。数据源有:vtkConeSourcevtkSphereSource,vtkOutlineSource…等等。
它们都继承与vtkPolyDataAlgorithm类,该类用于提供不同的类型的数据源
2.vtkMapper(映射器) 它就像是一个剧本,应该如何塑造角色的装扮
映射器有:vtkDataSetMapper,vtkMultiGroupPolyDataMapper,vtkPolyDataMapper。
它们都继承于vtkMapper类。所有的数据对象都要通过映射器Mapper映射到vtkActor中。
3.vtkActor(演员) 有了剧本,有了角色,得找个真人来演出这个剧本了。
4.vtkRenderer(渲染器) 这个过程就相当于对演员进行化妆并布置场景;
该类继承于vtkViewport,有2个子类:vtkMesaRender,vtkOpenGLRender.
该类另外一个作用是设置窗口vtkRenderWindow的背景.
5.vtkRenderWindow(窗口) 这个就相当于个舞台 ,把准备好的演员放进去,准备表演了;
6.vtkRenderWindowInteractor(窗口交互器) 这个像摄像机,用于捕捉演员的动作,然后传给导演看
该类的继承关系在vtkRenderWindowInteractor文章中已给出。
7.vtkInteractorObserver(观察者) 有点导演的意思,导演通过观看录像后,做出一系列调整
该类的继承关系在vtkRenderWindowInteractor文章中已给出
Example:
vtkConeSource * s=vtkConeSource::New(); //棱锥数据源,用于构造描述棱锥的点、线、面
vtkPolyDataMapper * m=vtkPolyDataMapper::New(); //映射器,可以根据点、线、面构造图形
m->SetInput(s->GetOutput()); //完成点、线、面的传递
vtkActor * a=vtkActor::New(); //创建一个物体(演员)
a->SetMapper(m); //设置描述物体的图形
vtkRenderer * r=vtkRenderer::New(); //绘制器,能够绘制物体
r->AddActor(a); //把物体交给绘制器绘制
vtkRenderWindow * w=vtkRenderWindow::New(); //绘制窗,提供绘制的平面
w->AddRenderer(r); //设置绘制器工作的平面
for (int i=0;i<65535;i++) //循环绘制
w->Render();
vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();//交互器
iren->SetRenderWindow(w);
vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();//观察者
iren->SetInteractorStyle(style);
vtkMyCallback *callback = vtkMyCallback::New(); //对观察到的事件响应
iren->AddObserver(vtkCommand::InteractionEvent, callback);
iren->Initialize();
iren->Start();