VTK002_vtk-HelloWorld

VTK_常用类:

      VTK中,有非常多的类,在实现HelloWorld程序中,主要使用几个类:

      1、vtkRenderWindow:


      vtkRenderWindow继承与vtkWindow,也有子类,vtkRenderWindow用于创建一个窗口,这个窗口将承载vtk渲染器,呈现的窗口是图形用户界面中的一个窗口。窗口需要设置大小,添加渲染器等。

      2:vtkRenderer


      vtkRenderer用于创建一个vtk渲染器,渲染器需要被添加到一个渲染窗口,才能显示出图像。渲染器本身需要添加渲染的事物(vtkActor),及向渲染器添加一个演员(画师)画师画了由渲染器渲染光线等。此外,渲染器好需要设置背景色等。

      3:vtkRenderWindowInterator


      vtkRenderWindowInterator继承于vtkObject,为vtk中的交互器,处理用户与窗口之间的交互,交互器也分为不同种,所提供的交互方式也有所不同。交互器需要设置一个交互窗口,他为设置的窗口提供交互功能。

扫描二维码关注公众号,回复: 1944766 查看本文章

      4:vtkConeSource


      vtkConeSource可用于定义一个多边形锥对象(面数越多越接近圆锥),生成的数据为vtkPolyData类型,圆锥的底面圆半径以及圆锥高度都可以指定,此外,还需要指定圆锥的分辨率(精度),这是由于无法直接绘制弧面,在vtk以及OpenGL中,绘制园,球等弧面,都是通过非常多的平面组合起来得到的。

      5:vtkPolyDataMapper


      vtkPolyDataMapper用于保存所有的vtkPolyData,渲染多边形几何数据,将输入的数据转换为几何图元,进行渲染,相当于一个绘图器,里面装了什么样的vtkPolyData就能绘制什么图形。

      6:vtkActor


      vtkActor相当于vtk里面的演员/画师。用于呈现场景中的物体,需要给画师一个绘图器(vtkPolyDataMapper),画师才知道要画什么。

VTK官方文档:

      在学习VTK的过程中,会使用很多类以及VTK的东西,在VTK官方网站上,有VTK文档,里面有对VTK所有的类的详细继承关系,成员函数,作用等的介绍。

VTK_HelloWorld程序:

程序:

#include <iostream>

int main()
{
	vtkRenderWindow *renWin;			// 渲染窗口
	vtkRenderer *renderer;				// 渲染器
	vtkRenderWindowInteractor *iren;	// 独立于平台的渲染窗口交互,包括选择和帧速率控制
	vtkConeSource *cone;				// 多边形圆锥,生成PolyData数据
	vtkPolyDataMapper *coneMapper;		// 派生自类vtkMapper,渲染多边形几何数据,将输入的数据转换为几何图元(点、线、多边形)进行渲染
	vtkActor *coneActor;				// 派生自vtkProp类,渲染场景中数据的可视化表达是通过vtkProp的子类负责的

	renderer = vtkRenderer::New();		// 渲染器
	renWin = vtkRenderWindow::New();		// 渲染窗口
	renWin->AddRenderer(renderer);	// 向渲染窗口添加渲染器

	//this->renWin->SetParentId(nullptr);			// 设置vtkRenderWindow的父窗口,可以使MFC/Win32窗口的HWND
	iren = vtkRenderWindowInteractor::New();		// 交互器
	iren->SetRenderWindow(renWin);			// 将vtkRenderWindow设置到交互器

	cone = vtkConeSource::New();		// 圆锥数据源
	cone->SetHeight(8.0);				// 圆锥高度
	cone->SetRadius(4.0);				// 圆锥半径
	cone->SetResolution(12);			// 圆锥精度(多边形模拟的圆)

	coneMapper = vtkPolyDataMapper::New();	// 几何绘图器(几何原始数据)
	coneMapper->SetInputConnection(cone->GetOutputPort());		// 获取到刚才的圆锥的几何原始数据
	coneActor = vtkActor::New();		// 演员对象
	coneActor->SetMapper(coneMapper);	// 演员对象使用绘图器(里面装的圆锥数据, 所以是画圆锥)

	renderer->AddActor(coneActor);		// 渲染器添加这个演员
	renderer->SetBackground(0.2, 0.3, 0.5);	// 渲染器背景色
	renWin->SetSize(800, 600);				// 渲染窗口大小

	renWin->Render();			// 渲染窗口开始渲染


	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}


	renWin->Delete();		// 删除渲染窗口
	renderer->Delete();		// 渲染器
	iren->Delete();			// 交互对象

	cone->Delete();			// 圆锥源数据
	coneMapper->Delete();	// 绘图器(装什么画什么)
	coneActor->Delete();	// 演员(给什么绘图器,演什么(花什么)),也可以认为演员就是绘图人

	return 0;
}

效果图:



(以下部分引用于东灵工作室:https://blog.csdn.net/www_doling_net/article/details/26562595)

VTK渲染引擎:

      组成VTK渲染引擎的类主要负责接收可视化管线(Visualization Pipeline)的输出数据并将结果渲染到窗口中。该过程主要涉及到下述一些组件。注意,这些只是VTK渲染系统中比较常用的组件,并非全部。而每个子标题仅仅是代表一个对象类型的最高层VTK父类,在许多情况下,这些超类只是定义了基本API函数的抽象类,而真正的实现则由其子类来完成。

      vtkProp。渲染场景中数据的可视表达(Visible Depictions)是由vtkProp的子类负责。三维空间中渲染对象最常用的vtkProp子类是vtkActor和vtkVolume,其中vtkActor用于表示场景中的几何数据(Geometry Data),vtkVolume表示场景中的体数据(Volumetric Data)。vtkActor2D常用来表示二维空间中的数据vtkProp的子类负责确定场景中对象的位置、大小和方向信息。控制Prop位置信息的参数依赖于对象是否在渲染场景中,比如一个三维物体或者二维注释,它们的位置信息控制方式是有所区别的。三维的Prop如vtkActor和vtkVolume(vtkActor和vtkVolume都是vtkProp3D的子类,而vtkProp3D继承自vtkProp),既可以直接控制对象的位置、方向和放缩信息,也可以通过一个4×4的变换矩阵来实现。而对于二维注释功能的Props如vtkScalarBarActor,其大小和位置有许多的定义方式,其中包括指定相对于视口的位置、宽度和高度。Prop除了提供对象的位置信息控制之外,Prop内部通常还有两个对象,一个是Mapper对象,负责存放数据和渲染信息,另一个是Property(属性)对象,负责控制颜色、不透明度等参数。

VTK中定义了大量的功能细化的Prop(超过50个),如vtkImageActor(负责图像显示)vtkPieChartActor(用于创建数组数据的饼图可视表示)。其中的有些Props内部直接包括了控制显示的参数和待渲染数据的索引,因此并不需要额外的Property和Mapper对象。vtkActor的子类vtkFollower可以自动的更新方向信息保持自身始终面向一个特定的相机,这样无论如何旋转渲染场景中的对象,vtkFellower对象都是可见的,适用于三维场景中的广告板(Billboards)或者是文本。vtkActor的子类vtkLodActor可以自动改变自身的几何表示来实现所要求的交互帧率,vtkProp3D的子类vtkLODProp3D则是通过从许多Mapper中进行选择来实现不同的交互性(可以是Volumetric Mapper和GeometricMapper的集合)。vtkAssembly建立了Actor的等级结构以便在整个结构平移、旋转或者放缩时能够更合理的控制变换。

      vtkAbsractMapper。许多Props如vtkActor和vtkVolume利用vtkAbstractMapper的子类来保存输入数据的引用以及提供真正的渲染功能。vtkPolyDataMapper是渲染多边形几何数据主要的Mapper类。而对于体数据,VTK提供了多种渲染技术。例如,vtkFixedPointVolumeRayCastMapper用来渲染vtkImageData类型的数据,vtkProjectedTetrahedraMapper则是用来渲染vtkUnstructuredGrid类型的数据。

      vtkPropertyvtkVolumeProperty。某些Props采用单独的属性对象来存储控制数据外观显示的参数,这样不同的对象可以轻松的实现外观参数的共享。vtkActor利用vtkProperty对象存储外观(属性)参数,如颜色、不透明度、材质的环境光(Ambient)系数、散射光(Diffuse)系数和反射光(Specular)系数等。而vtkVolume则是采用vtkVolumeProperty对象来获取体对象的绘制参数,如将标量值映射为颜色和不透明度的传输函数(Transfer Function)【译者:也有译成“传递函数”】。另外,一些vtkMapper提供相应的函数设置裁剪面以便显示对象的内部结构。

      vtkCamera。vtkCamera存储了场景中的摄像机参数,换言之,如何来“看”渲染场景里的对象,主要参数是摄像机的位置、焦点、和场景中的上方向向量。其他参数可以控制视图变换,如平行投影或者透视投影,图像的尺度或者视角,以及视景体的远近裁剪平面等。

      vtkLight。vtkLight对象主要用于场景中的光照计算。vtkLight对象中存储了光源的位置和方向,以及颜色和强度等。另外,还需要一个类型来描述光源相对于摄像机的运动。例如,HeadLight始终位于摄像机处,并照向焦点方向;而SceneLight则始终固定在场景中的某个位置。

      vtkRenderer组成场景的对象包括Prop,Camara和Light都被集中在一个vtkRenderer对象中vtkRenderer负责管理场景的渲染过程。一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口中不同的矩形区域中(视口),甚至可以是覆盖的区域。

      vtkRendererWindowvtkRendererWindow将操作系统与VTK渲染引擎连接到一起。不同平台下的vtkRendererWindow子类负责本地计算机系统中窗口创建和渲染过程的管理。当使用VTK开发应用程序时,只需要使用平台无关的vtkRendererWindow类,程序运行时,系统会自动替换为平台相关的vtkRendererWindow子类。vtkRendererWindow中包含了vtkRenderer的集合,以及控制渲染的参数,如立体显示(Stereo)、反走样、运动模糊(Motion Blur)和焦点深度(FocalDepth)。

      vtkRenderWindowInteractorvtkRenderWindowInteractor负责监听鼠标、键盘和时钟消息,并通过VTK中的Command/Observer设计模式进行相应的处理vtkInteractorStyle监听这些消息并进行处理以完成旋转、拉伸和放缩等运动控制vtkRenderWindowInteractor自动建立一个默认的3D场景交互器样式(InteractorStyle),当然你也可以选择一个二维图像浏览的交互器样式,或者是创建自定义的交互器样式。

      vtkTransform场景中的许多对象,如Prop、光源Light、照相机Camera等都需要在场景中合理的放置,它们通过vtkTransform参数可以方便的控制对象的位置和方向vtkTransform能够描述三维空间中的线性坐标变换,其内部表示为一个4×4的齐次变换矩阵。vtkTransform对象初始化为一个单位矩阵,你可以通过管线连接的方式将变换进行组合来完成复杂的变换。管线方式能够确保当其中任一个变换被修改时,其后续的变换都会相应的进行更新

      vtkLookupTablevtkColorTransferFunctionvtkPiecewiseFunction。标量数据可视化经常需要定义一个标量数据到颜色和不透明度的映射。在几何面绘制中用不透明度定义表面的透明程度,而体绘制中不透明度表示光线穿透物体时不透明度沿着光线的累积效果,两者都需要定义不透明度的映射。对于几何渲染可以使用vtkLookupTable来创建映射,体绘制中需要使用vtkColorTransferFunction和vtkPiecewiseFunction来建立映射。

VTK-无法解析的外部符号:

      将VTK_USE_SYSTEM_FREETYPE设置为ON。在VTK8.1中,需要加上如下:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType) 

#pragma comment(lib, "vtkalglib-8.1.lib")
#pragma comment(lib, "vtkChartsCore-8.1.lib")
#pragma comment(lib, "vtkCommonColor-8.1.lib")
#pragma comment(lib, "vtkCommonComputationalGeometry-8.1.lib")
#pragma comment(lib, "vtkCommonCore-8.1.lib")
#pragma comment(lib, "vtkCommonDataModel-8.1.lib")
#pragma comment(lib, "vtkCommonExecutionModel-8.1.lib")
#pragma comment(lib, "vtkCommonMath-8.1.lib")
#pragma comment(lib, "vtkCommonMisc-8.1.lib")
#pragma comment(lib, "vtkCommonSystem-8.1.lib")
#pragma comment(lib, "vtkCommonTransforms-8.1.lib")
#pragma comment(lib, "vtkDICOMParser-8.1.lib")
#pragma comment(lib, "vtkDomainsChemistry-8.1.lib")
#pragma comment(lib, "vtkDomainsChemistryOpenGL2-8.1.lib")
#pragma comment(lib, "vtkexoIIc-8.1.lib")
#pragma comment(lib, "vtkexpat-8.1.lib")
#pragma comment(lib, "vtkFiltersAMR-8.1.lib")
#pragma comment(lib, "vtkFiltersCore-8.1.lib")
#pragma comment(lib, "vtkFiltersExtraction-8.1.lib")
#pragma comment(lib, "vtkFiltersFlowPaths-8.1.lib")
#pragma comment(lib, "vtkFiltersGeneral-8.1.lib")
#pragma comment(lib, "vtkFiltersGeneric-8.1.lib")
#pragma comment(lib, "vtkFiltersGeometry-8.1.lib")
#pragma comment(lib, "vtkFiltersHybrid-8.1.lib")
#pragma comment(lib, "vtkFiltersHyperTree-8.1.lib")
#pragma comment(lib, "vtkFiltersImaging-8.1.lib")
#pragma comment(lib, "vtkFiltersModeling-8.1.lib")
#pragma comment(lib, "vtkFiltersParallel-8.1.lib")
#pragma comment(lib, "vtkFiltersParallelImaging-8.1.lib")
#pragma comment(lib, "vtkFiltersPoints-8.1.lib")
#pragma comment(lib, "vtkFiltersProgrammable-8.1.lib")
#pragma comment(lib, "vtkFiltersSelection-8.1.lib")
#pragma comment(lib, "vtkFiltersSMP-8.1.lib")
#pragma comment(lib, "vtkFiltersSources-8.1.lib")
#pragma comment(lib, "vtkFiltersStatistics-8.1.lib")
#pragma comment(lib, "vtkFiltersTexture-8.1.lib")
#pragma comment(lib, "vtkFiltersTopology-8.1.lib")
#pragma comment(lib, "vtkFiltersVerdict-8.1.lib")
#pragma comment(lib, "vtkfreetype-8.1.lib")
#pragma comment(lib, "vtkGeovisCore-8.1.lib")
#pragma comment(lib, "vtkgl2ps-8.1.lib")
#pragma comment(lib, "vtkglew-8.1.lib")
#pragma comment(lib, "vtkhdf5-8.1.lib")
#pragma comment(lib, "vtkhdf5_hl-8.1.lib")
#pragma comment(lib, "vtkImagingColor-8.1.lib")
#pragma comment(lib, "vtkImagingCore-8.1.lib")
#pragma comment(lib, "vtkImagingFourier-8.1.lib")
#pragma comment(lib, "vtkImagingGeneral-8.1.lib")
#pragma comment(lib, "vtkImagingHybrid-8.1.lib")
#pragma comment(lib, "vtkImagingMath-8.1.lib")
#pragma comment(lib, "vtkImagingMorphological-8.1.lib")
#pragma comment(lib, "vtkImagingSources-8.1.lib")
#pragma comment(lib, "vtkImagingStatistics-8.1.lib")
#pragma comment(lib, "vtkImagingStencil-8.1.lib")
#pragma comment(lib, "vtkInfovisCore-8.1.lib")
#pragma comment(lib, "vtkInfovisLayout-8.1.lib")
#pragma comment(lib, "vtkInteractionImage-8.1.lib")
#pragma comment(lib, "vtkInteractionStyle-8.1.lib")
#pragma comment(lib, "vtkInteractionWidgets-8.1.lib")
#pragma comment(lib, "vtkIOAMR-8.1.lib")
#pragma comment(lib, "vtkIOCore-8.1.lib")
#pragma comment(lib, "vtkIOEnSight-8.1.lib")
#pragma comment(lib, "vtkIOExodus-8.1.lib")
#pragma comment(lib, "vtkIOExport-8.1.lib")
#pragma comment(lib, "vtkIOExportOpenGL2-8.1.lib")
#pragma comment(lib, "vtkIOGeometry-8.1.lib")
#pragma comment(lib, "vtkIOImage-8.1.lib")
#pragma comment(lib, "vtkIOImport-8.1.lib")
#pragma comment(lib, "vtkIOInfovis-8.1.lib")
#pragma comment(lib, "vtkIOLegacy-8.1.lib")
#pragma comment(lib, "vtkIOLSDyna-8.1.lib")
#pragma comment(lib, "vtkIOMINC-8.1.lib")
#pragma comment(lib, "vtkIOMovie-8.1.lib")
#pragma comment(lib, "vtkIONetCDF-8.1.lib")
#pragma comment(lib, "vtkIOParallel-8.1.lib")
#pragma comment(lib, "vtkIOParallelXML-8.1.lib")
#pragma comment(lib, "vtkIOPLY-8.1.lib")
#pragma comment(lib, "vtkIOSQL-8.1.lib")
#pragma comment(lib, "vtkIOTecplotTable-8.1.lib")
#pragma comment(lib, "vtkIOVideo-8.1.lib")
#pragma comment(lib, "vtkIOXML-8.1.lib")
#pragma comment(lib, "vtkIOXMLParser-8.1.lib")
#pragma comment(lib, "vtkjpeg-8.1.lib")
#pragma comment(lib, "vtkjsoncpp-8.1.lib")
#pragma comment(lib, "vtklibharu-8.1.lib")
#pragma comment(lib, "vtklibxml2-8.1.lib")
#pragma comment(lib, "vtkLocalExample-8.1.lib")
#pragma comment(lib, "vtklz4-8.1.lib")
#pragma comment(lib, "vtkmetaio-8.1.lib")
#pragma comment(lib, "vtkNetCDF-8.1.lib")
#pragma comment(lib, "vtknetcdfcpp-8.1.lib")
#pragma comment(lib, "vtkoggtheora-8.1.lib")
#pragma comment(lib, "vtkParallelCore-8.1.lib")
#pragma comment(lib, "vtkpng-8.1.lib")
#pragma comment(lib, "vtkproj4-8.1.lib")
#pragma comment(lib, "vtkRenderingAnnotation-8.1.lib")
#pragma comment(lib, "vtkRenderingContext2D-8.1.lib")
#pragma comment(lib, "vtkRenderingContextOpenGL2-8.1.lib")
#pragma comment(lib, "vtkRenderingCore-8.1.lib")
#pragma comment(lib, "vtkRenderingFreeType-8.1.lib")
#pragma comment(lib, "vtkRenderingGL2PSOpenGL2-8.1.lib")
#pragma comment(lib, "vtkRenderingImage-8.1.lib")
#pragma comment(lib, "vtkRenderingLabel-8.1.lib")
#pragma comment(lib, "vtkRenderingLOD-8.1.lib")
#pragma comment(lib, "vtkRenderingOpenGL2-8.1.lib")
#pragma comment(lib, "vtkRenderingVolume-8.1.lib")
#pragma comment(lib, "vtkRenderingVolumeOpenGL2-8.1.lib")
#pragma comment(lib, "vtksqlite-8.1.lib")
#pragma comment(lib, "vtksys-8.1.lib")
#pragma comment(lib, "vtkTestingGenericBridge-8.1.lib")
#pragma comment(lib, "vtkTestingIOSQL-8.1.lib")
#pragma comment(lib, "vtkTestingRendering-8.1.lib")
#pragma comment(lib, "vtktiff-8.1.lib")
#pragma comment(lib, "vtkverdict-8.1.lib")
#pragma comment(lib, "vtkViewsContext2D-8.1.lib")
#pragma comment(lib, "vtkViewsCore-8.1.lib")
#pragma comment(lib, "vtkViewsInfovis-8.1.lib")
#pragma comment(lib, "vtkzlib-8.1.lib")
      对于添加引用lib文件比较麻烦的问题,可以自己写一个脚本自动将lib文件夹下所有lib文件按规则打印出来,如需要此脚本,可在这里下载: python自动加载lib



猜你喜欢

转载自blog.csdn.net/qq_31622605/article/details/80875260
今日推荐