VTK的可视化技术是基于管线流(data pipeline)的设计模式(数据传递模式):
数据源(Source)-->过滤器(Filters)-->映射(Mappers)-->Props对象(Actor/Volume) --> 绘制对象(Renderer)-->绘制窗口(RenderWindow)
渲染窗口(RenderWindow): 基类为vtkRenderWindow,管理显示设备上的窗口, 一个或多个绘制方法可在渲染窗口上创建一个场景。渲染窗口是用户图形界面, 其中包括了设置渲染窗口的大小, 产生立体显示效果等的方法, 一共控制控制两个缓存;
渲染器(Renderer): 基类为vtkRenderer,作用是管理光源、照相机和绘制对象等的位置、属性等。 提供 世界坐标系, 观察坐标系及显示坐标系之间的转换;
角色(Actor): vtkActor代表渲染场景中的绘制对象实体。通过参数的调节可以设置角色的位置方向, 渲染特性(Property),引用(renference),纹理影射(Texture)等属性,并可对Actor进行放缩。角色的改变是通过一个4*4的变换矩阵实现的;
映射(Mapper): vtkMapper指定了渲染数据和图形库中基本图元之间的联系。VtkMapper的一些派生类通过LookupTable映射数据并控制图形库中相应Actor 图元的生成。一个或多个Actor可以使用相同的Mapper。Mapper有多个参数对其进行控制, 如ScalarVisibility 标志 可以设置scalar的数据是否影响相关的Actor 的颜色; ScalarMode 可以控制Actor的颜 色是scalar point还是cell的值; 渲染方式可以通过 ( ImmediateModeRenderingOn)和( ImmediateModeRenderingOff) 控制, 前一项表示立即渲染, 后一 项表示将渲染放于渲染列表中, 一般选择ImmediateModeRenderingOn方式进行, 选择后者将会占用较多的系统资源, 影响系统的性能;
实例:
// 因为项目是直接在vs中新建的,所以需要加两种不同宏其中的一个,注意我的VTK版本为7.0.0
// 宏一
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
// 宏二
// #define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2)
// #define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2)
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkCylinderSource.h>
#include <vtkRenderWindowInteractor.h>
int main(int, char *[])
{
// 数据源
vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetResolution(8);
//Mapper
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
// Actor
vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(1.0, 0.3882, 0.2784);
cylinderActor->RotateX(30.0);
cylinderActor->RotateY(-45.0);
// Render
vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
render->AddActor(cylinderActor);
render->SetBackground(0.1, 0.2, 0.4);
render->ResetCamera();
render->GetActiveCamera()->Zoom(1.5);
// RenderWindow
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetSize(200, 200);
renderWindow->AddRenderer(render);
// RenderWindowInteractor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
实验结果:
【个人觉得头文件好多好麻烦,因为是新手所以继续努力吧。。。】