第2章 VTK数据操作

2.1 入门范例——渲染一个圆柱体

本范例主要是为了阐述VTK程序代码的数据流及VTK的调试。首先为程序添加入代码中需要的头文件,这些头文件里面定义了在代码中要使用的VTK类,头文件名和代码中用到的VTK类名相同;其次创建一个简单的圆柱体对象cylinder,设置其分别率为8(分别率决定了圆柱体的面数),并将该对象添加到创建好的多边形映射器cylinderMapper中,将其映射为VTK类库中可以识别的几何图元,再将该映射器对象添加到角色对象cylinderActor中,以实例化该角色的具体几何图形;最后通过渲染器对角色进行渲染,并通过VTK的交换窗口对渲染后的角色进行交互。该操作过程可以采用数据流的形式表达,如图2-1所示。

图2-1 渲染圆柱体的对象数据流

VTK的每个范例所包含的头文件又被包含在相应的类库中,如vtkCylinderSource.h是vtkGraphics.lib中的头文件,vtkPolyDataMapper.h,vtkActor.h,vtkRenderer.h,vtkRen-derWindow.h和vtkRenderWindowInteractor.h是vtkRendering.lib中的头文件。这些类库在程序编译过程中需要被调用来对相关头文件进行解析,因此应将这些类库添加到附加依赖项中,具体操作为单击“项目→属性→配置属性→链接器→输入→附加依赖项”,如图2-2所示。

图2-2 添加附加依赖项

添加完类库后,单击“生成解决方案”按钮,发现仍有无法解析的类或函数“无法解析的外部符号"__declspec(dllimport)public:classvtkAlgorithmOutput* __thiscallvtkAlgo-rithm::GetOutputPort(void)"”。GetOutPort()是类vtkAlgorithOutput的方法,而这里的连接过程中无法找到该方法,因此需要将vtkAlgorithOutput的类库(vtkFiltering.lib)添加进去。再次单击“生成解决方案”,此时不会再出现上述问题。总结VTK在VisualStudio2008上的调试步骤为:

(1)书写正确的VTK代码;

(2)将头文件相关的类库添加到项目的附加依赖项中;

(3)再次生成解决方案,将特殊及遗漏的类库再次添加到附加依赖项中。

本范例的运行结果如图2-3所示。用鼠标单击角色(这里指圆柱体),可以对窗口中的角色进行交互。本范例的完整代码如下:

图2-3 入门范例的运行结果

#include"vtkCylinderSource.h"
#include"vtkPolyDataMapper.h"
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkProperty.h"
#include"vtkCamera.h"
intmain()
{
//创建一个多边形的圆柱体对象
  vtkCylinderSource*cylinder=vtkCylinderSource::New();
    cylinder->SetResolution(8);      //设置其分辨率,决定柱体的面数
//创建一个映射器,用于将几何数据映射到图像库中,映射器还可以根据标量值和属性的定义做
颜色映射
  vtkPolyDataMapper*cylinderMapper=vtkPolyDataMapper::New();
    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
//创建一个角色,它具有设置属性、矩阵转换、质地映射及同mapper联系的功能
  vtkActor*cylinderActor=vtkActor::New();
    cylinderActor->SetMapper(cylinderMapper);
    cylinderActor->GetProperty()->SetColor(1.0000,0.3882,0.2784);
    cylinderActor->RotateX(30.0);
    cylinderActor->RotateY(-45.0);
//创建一个渲染器,它将渲染对象存放在渲染窗口中
//交互渲染窗口还可以捕捉鼠标事件、操作摄像机及根据事件的性质对角色进行交互
  vtkRenderer*ren1=vtkRenderer::New();
  vtkRenderWindow*renWin=vtkRenderWindow::New();
    renWin->AddRenderer(ren1);
  vtkRenderWindowInteractor*iren=vtkRenderWindowInteractor::New();
    iren->SetRenderWindow(renWin);
  //将角色加入到渲染器中,并设置渲染的背景色
    ren1->AddActor(cylinderActor);
    ren1->SetBackground(0.1,0.2,0.4);
    renWin->SetSize(200,200);
  //重置摄像机的拍照,并移动摄像机
    ren1->ResetCamera();
    ren1->GetActiveCamera()->Zoom(1.5);
  //开始渲染
    renWin->Render();
  //启动事件进入循环状态进行渲染操作
    iren->Start();
  //释放创建是所有对象,这一步也可以省去,VTK到最后具有自动回收的功能
    cylinder->Delete();
    cylinderMapper->Delete();
    cylinderActor->Delete();
    ren1->Delete();
    renWin->Delete();
    iren->Delete();
  return0;
}

注:入门范例再次详细地阐述了VTK在VisualStudio2008上的调试方法;在添加.lib时,每个类库间要以空格隔开,VTK的后续章节将不再对重复的操作及注释加以解释,请读者认真阅读该过程及注释。