最近在做医学图像的相关处理,其中用到了可视化程序包 VTK,在学习过程中,准备写一系列相关教程,一方面用于巩固自己所学,主要自己太笨,另一方面加强一下知识理解。
利用 VTK 进行绘制物体时,常用到的组件有下面几种,为了加深理解,VTK 把一个物体的渲染过程比喻成了一场演出(真的很形象):
vtkRenderWindow
: 绘制窗口,相当于用于表演的舞台场地;vtkRenderer
— 涉及灯光,相机,actor 的绘制过程;相当于舞台上的整体表演效果;vtkLight
— 灯源用于照明场景;vtkCamera
— 定义视角,焦距,及场景的视觉属性,相当于观众的视野范围;vtkActor
— 场景中渲染的对象,属性以及它在场景中的位置,绘制中展示的道具;相当于演出的演员和道具;vtkProperty
修饰vtkActor
的属性,包括颜色、透明度及灯光的属性(反射、折射效果),演出用到的灯光vtkMapper
—vtkActor
的几何映射,绘制时需要把vtkAcor
转化为几何属性才能进行绘制;多个vtkActor
可以设置相同的mapper
下图是对 VTK 在绘制效果中对各组件的标注:
进行物体绘制时,需要先提供源数据,对数据进行一系列操作(读取、格式转换、Filter图像处理),再转化为vtkMapper
,vtkActor
进行设置`vtkMapper
后,传入vtkRendener (
绘制器)中。
在进行代码实现时,如果没有定义vtkLight、vtkCamera
两个组件时,程序会自动创建这两个组件。
整体来说,VTK 的数据管道流向如下:
下面就利用代码来实现一个圆锥体的绘制,借助于 VTK 提供的一个类 vtkConeSource.h
#include<vtkActor.h> #include<vtkSmartPointer.h> #include<vtkPolyDataMapper.h> #include<vtkConeSource.h> #include<vtkRenderer.h> #include<vtkRenderWindow.h> #include<vtkCamera.h> #include<vtkNamedColors.h> #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INIT(vtkInteractionStyle); int main() { vtkSmartPointer<vtkConeSource> Cone = vtkSmartPointer<vtkConeSource>::New(); vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New(); Cone->SetHeight(3.0);//Cone Height Cone->SetRadius(1.0);//Cone Radius Cone->SetResolution(9);//Cone faces vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); coneMapper->SetInputConnection(Cone->GetOutputPort());//Mapper data vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New(); coneActor->SetMapper(coneMapper); vtkSmartPointer<vtkRenderer> coneRender = vtkSmartPointer<vtkRenderer>::New(); coneRender->AddActor(coneActor); coneRender->SetBackground(colors->GetColor3d("MidnightBlue").GetData());//Bachground color vtkSmartPointer<vtkRenderWindow> renWindow = vtkSmartPointer<vtkRenderWindow>::New(); renWindow->AddRenderer(coneRender); renWindow->SetSize(300, 300);//Size of Window; for (auto i = 0; i < 360; ++i) { //render the image; renWindow->Render(); //rotate the active camera by one degree coneRender->GetActiveCamera()->Azimuth(1); } getchar(); return EXIT_SUCCESS; }
最终的效果如下:
代码中对圆锥设置了几个参数:高度,底部半径,及包含面的个数(圆锥涉及的面的总个数);
VTK 除了头文件 vtkConeSource.h
提供圆锥数据以外,还有椭圆,正方体,圆环等数据对象。