VTK教程之一:可视化管线

VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG、OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的东西,如地质构造、地层分布、矿床分布、三维空间应力场的状态变化等等,而OSG、OGRE是基于场景的可视化,更强调视觉感官的感受,所以OSG主要应用于虚拟现实领域,而VTK主要应用于科学计算可视化领域,本教程主要介绍VTK的可视化应用。

VTK的可视化设计是基于管线流的设计模式,将要处理的数据作为流动介质在管线中流动,不同的阶段对数据有不同的处理方式,VTK的可视化管线主要由图形模型和可视化模型组成,如下图所示:



可视化模型主要对数据进行处理,生成可被绘制的几何体,而图形模型主要对生成的几何体进行绘制,在VTK的可视化管线中所包含的对象一般包括:源对象、过滤器对象(可选)、映射器对象、Props对象、绘制器对象、绘制窗口,其中源对象、过滤器对象(可选)、映射器对象、绘制器对象、绘制窗口为处理对象,Props对象为数据对象,映射器对象是可视化模型和图形模型的接口。

有了可视化管线,VTK的可视化过程就可以用数据在可视化管线流动的过程来描述(数据在管线中流动过程中,被管线不同的对象处理,最终以图形的方式表现数据信息),VTK的可视化管线具有如下特点:

1、变换

数据从原始的形式变换成图元的形式,最终以图形的形式显示。

2、表现

用VTK内部定义的数据结构描述数据,形成数据集,用图形的方式表现数据。

3、是基于面向对象的

用面向对象的观点描述可视化管线,表现是数据对象,变换是处理对象。

下面我们对VTK可视化管线的各个对象分别介绍,在可视化管线中,按对数据处理方式的不同,分为数据对象和处理对象,其中数据对象主要作用是表现数据信息,并对表现的信息进行维护(创建、访问、删除),处理对象主要是对输入的数据进行处理后生成输出新的数据,处理对象主要包括:

1、源对象

数据生成的源头,数据来源主要包括从磁盘读取数据文件,如VTK所支持的各种格式文件生成数据源对象,这种源对象被称为读源对象,或者利用数学方法生成源对象,如利用多个四边形构建一个圆柱体,这种对象被称为程序源对象。

2、过滤器对象

对源对象进行处理,生成新的数据集输出。

3、映射器对象

映射器对象主要作用是将可视化模型生成的数据转换到图形模型进行绘制,或者以磁盘文件的形式进行输出。

以上对VTK可视化管线做了一个简单的介绍,下面通过一个示例程序来说明数据是如何在可视化管线中流动的。

#include "stdafx.h"
#include "vtkCamera.h"
#include "vtkGenericRenderWindowInteractor.h"
#include "vtkInteractorStyleJoystickCamera.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkLODActor.h"
#include "vtkLight.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkPropPicker.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkSTLReader.h"
#include "vtkShrinkPolyData.h"

int main( int argc, char *argv[] ) {
//创建绘制器对象
vtkRenderer *ren1 = vtkRenderer::New();
//设置相机
ren1->GetActiveCamera()->SetClippingRange(0.294421, 29.4421);
ren1->GetActiveCamera()->SetDistance(7.94348);
ren1->GetActiveCamera()->SetFocalPoint(-66.9367, -49.4539 , 258.453);
ren1->GetActiveCamera()->SetPosition(-67.8091, -57.3489 , 258.377);
ren1->GetActiveCamera()->SetViewAngle(20);
ren1->GetActiveCamera()->SetViewUp(-0.82718, 0.0860684 , 0.555306);
ren1->GetActiveCamera()->SetParallelProjection(0);
ren1->GetActiveCamera()->SetUseHorizontalViewAngle(0);
ren1->SetBackground(0.1 , 0.2 , 0.4);
ren1->SetLightFollowCamera(1);
//创建绘制窗口
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
renWin->SetSize(1134 , 624);
//创建交互器
vtkRenderWindowInteractor *iren =vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->SetLightFollowCamera(1);
//读源对象读取stl数据文件
vtkSTLReader *part = vtkSTLReader::New();
part->SetOutput(part->GetOutput());
part->SetFileName("42400-IDGH.stl");
//创建过滤器对象,该对象将输入数据集的每个单元向单元质心收缩
//将会导致相邻单元之间出现裂缝
vtkShrinkPolyData *shrink = vtkShrinkPolyData::New();
//将源对象和过滤器连接
shrink->SetInput((vtkPolyData *)part->GetOutput());
//设置收缩系数,如果为1,不收缩
shrink->SetShrinkFactor(0.9);
//创建映射器对象
vtkPolyDataMapper *partMapper = vtkPolyDataMapper::New();
partMapper->SetInput((vtkPolyData *)shrink->GetOutput());
partMapper->SetNumberOfPieces(1);
partMapper->SetScalarRange(0 , 1);
partMapper->SetColorMode(0);
partMapper->SetResolveCoincidentTopology(0);
partMapper->SetScalarMode(0);
partMapper->SetImmediateModeRendering(0);
partMapper->SetScalarVisibility(1);
partMapper->SetUseLookupTableScalarRange(0);
//创建Props对象(Actor)
vtkLODActor *partActor = vtkLODActor::New();
partActor->SetMapper(partMapper);
partActor->GetProperty()->SetAmbientColor(0.8275, 0.8275 , 0.8275);
partActor->GetProperty()->SetColor(0.8275, 0.8275 , 0.8275);
partActor->GetProperty()->SetDiffuseColor(0.8275, 0.8275 , 0.8275);
partActor->GetProperty()->SetOpacity(1);
partActor->GetProperty()->SetInterpolation(1);
partActor->GetProperty()->SetRepresentation(2);
partActor->GetProperty()->SetBackfaceCulling(0);
partActor->GetProperty()->SetEdgeVisibility(0);
partActor->GetProperty()->SetFrontfaceCulling(0);
partActor->SetOrigin(0 , 0 , 0);
partActor->SetPosition(0 , 0 , 0);
partActor->SetScale(1 , 1 , 1);
partActor->SetVisibility(1);
//将Actor对象添加到绘制器中
ren1->AddActor( partActor );
//绘制
ren1->ResetCamera();
ren1->ResetCameraClippingRange();
renWin->Render();
iren->Initialize();
iren->Start();
//删除对象
iren->Delete();
part->Delete();
partActor->Delete();
partMapper->Delete();
ren1->Delete();
renWin->Delete();
shrink->Delete();
return 0;
}
转自:http://lzchenheng.blog.163.com/blog/static/8383353620107161131013/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章