VTK系列教程二:绘制流程

前一篇文章我们简单介绍了VTK,从这篇文章开始,我们以一个3D医疗影像后处理的例子来逐步深入理解VTK。
VTK系列教程二:绘制流程_第1张图片
在VTK的渲染流程中,主要涉及到”物体”、“相机”、“过滤器”、“视网膜”、“用户交互”这几个主要角色,下面分别进行分析。
”物体”
在本示例程序中,”物体”基本就是医疗影像设备例如CT、MR、PET、Xray等扫描出来的数据,不同的应用场景”物体”来源也不同,但无外乎就这么几种类型:从文件读取到内存、在内存中创建数据对象并填充、来自其他模块传递过来的数据指针;即使是医疗影像数据,也有很多种格式:DICOM、XML、VTK、Meta等,针对不同类型的数据,有不同的解析方法,所幸的是VTK的IO模块中已经集成了多种文件类型的解析方法,下面就是针对DICOM文件的解析方式:
vtkSmartPointer reader=vtkDICOMImageReader::New();
reader ->SetDirectoryName(path);
reader ->Update();
vtkImageData imgdata=reader ->GetOutput();
在VTK中继承自vtkProp类的都代表一个物体,构造”物体”是绘制流水线的第一步,也是必须的一步,imgdata会传递到后面的模块中。
“视网膜”
第一步我们构造了物体,但要将物体画到什么上呢?这就是VTK中vtkRenderWindow类负责的事情,通过名字可以看出来这个一个窗口,也就是画布,这也是绘制过程中所必须的,但vtkRenderWindow只是一个基类,真正的绘制操作并不在这里,而是利用了C++的多态特性将绘制操作动态的绑定到了子类中,VTK是基于OpenGL的,所以默认在vtkOpenGLRenderWindow类中,如果基于Windows开发,那么真正的绘制逻辑会在vtkWin32OpenGLRenderWindow类中,最终就是在一个控制台中进行绘制,但一般情况下,我们都会选择VTK和某种GUI框架进行组合,VTK擅长绘制,也就是根据输入图像生成一张效果图,GUI能提供丰富的控件,让合适的人干合适的事,但这并不是说VTK不能提供控件,在VTK中封装了大量的常用控件,例如按钮、文本、方向、颜色条、滑动条、边框等,也可以通过继承去实现自己的控件,但相较于GUI框架,VTK控件过于复杂,且不灵活。也很难实现高精尖的动画等效果,所以VTK中提供了集成到Python、QT、Web的接口,但为了兼容现有的程序,我们的例子会将VTK集成到WPF中。
vtkRenderWindow renwin= vtkRenderWindow::New();
“相机”
相机也是绘制过程中所必须的,但创建它的过程并没有太多需要用户考虑的,所以默认情况下,当我们创建Render时会创建一个默认的相机,相机很重要,很多操作都是通过设置相机的参数来改变绘制结果,例如,生成MPR三个视图、图像平移、旋转、缩放等,在VTK中图像操作有两种形式,第一种就是刚才所说的通过改变相机去实现用户交互、还有一种就是通过操作物体,后续我们会详细讲解。
“过滤器”
这里的过滤器指的是filter和Mapper,过滤器并不是必须的,要根据我们的需求来判断是否要加入某种过滤器到我们的绘制流水线中,可以在流水线中加入多种过滤器,如果我们只是想显示原始图像,那就不需要过滤器,VTK中有多种过滤器,例如,VR图像中用于生成体绘制效果的vtkFixedPointVolumeRayCastMapper,用户也可以实现自己的过滤器。
在我们的例子中,为了兼顾绘制效率,我们选择vtkSmartVolumeMapper,相较于vtkFixedPointVolumeRayCastMapper,他会根据当前计算机配置来自动选择是使用CPU绘制还是GPU。
vtkSmartVolumeMapper
mapper = vtkSmartVolumeMapper::New();
“组织者”
上面这些角色是如何组织起来的呢?这就涉及到VTK中一个非常重要的角色vtkRenderer,根据上面截图我们可以看到在一个vtkRenderWindow显示了四个绘制效果图,每一个效果图就是一个vtkRenderer,在VTK中我们称之为ViewPort,为了提高效率,每个viewport可以单独绘制。
vtkRenderer
render =vtkRenderer::New();
renwin->AddRenderer(this->m_render);//将render加入到renderwindow中
render ->SetViewport(x1,y1,x2,y2);//设置viewport的坐标
我们也可以将每个视图单独用一个vtkRenderWindow,根据自己的需要进行选择就行。
“用户交互”
前面只是实现了图像的显示,还不能实现于用户的交互,这就失去了应用的灵魂,在VTK中vtkInteractorStyle类实现了用户的交互,同样,他也是个基类,真正的逻辑在子类中,VTK中提供了多种子类:
VTK系列教程二:绘制流程_第2张图片
交互的本质就是:应用中有不同的操作按钮:图像平移按钮、旋转按钮、翻页按钮、缩放按钮、窗宽窗位按钮等,当我们按下不同的按钮,代表当前操作类型,在不同操作类型下,鼠标操作代表不同的效果,幸运的是VTK不仅提供了各种图像操作,还提供了不同的Style,我们往往只需要添加一个代表当前操作类型的变量即可。

你可能感兴趣的:(VTK实战教程,c++)