- 三维图像编程实验
- 周振环 郑小中 赵明编著
- 8字
- 2020-08-28 15:50:58
第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的后续章节将不再对重复的操作及注释加以解释,请读者认真阅读该过程及注释。