VTK图形图像开发进阶-学习笔记 02 VTK的基本概念

2.1 一个稍微复杂的VTK程序

创建VTK程序的步骤可以参考上一篇,这里直接列出CMakeLists.txt 和2.1_RenderCylinder.cpp内容

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.13.4)
PROJECT(Chap02)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(2.1_RenderCylinder 2.1_RenderCylinder.cpp)
TARGET_LINK_LIBRARIES(2.1_RenderCylinder ${VTK_LIBRARIES} )

2.1_RenderCylinder.cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(){
	vtkSmartPointer cyLinder=
	 vtkSmartPointer::New();
	 cyLinder->SetHeight(3.0);
	 cyLinder->SetRadius(1.0);
	 cyLinder->SetResolution(10);
	 
	 vtkSmartPointer cyLinderMapper=
	  vtkSmartPointer::New();
	  cyLinderMapper->SetInputConnection(cyLinder->GetOutputPort());
	  
	  vtkSmartPointer cyLinderActor=
	  vtkSmartPointer::New();
	  cyLinderActor->SetMapper(cyLinderMapper);
	  
	  vtkSmartPointer renderer=
	  vtkSmartPointer::New();
	  //renderer->AddActor(cyLinderActor);
	  renderer->SetBackground(0.1,0.2,0.4);
	    
	  vtkSmartPointer renWin=
	  vtkSmartPointer::New();
	  renWin->AddRenderer(renderer);
	  renWin->SetSize(300,300);
	  
	  vtkSmartPointer iren=
	  vtkSmartPointer::New();
	  iren->SetRenderWindow(renWin);
	
	vtkSmartPointer style=
	vtkSmartPointer::New();
	iren->SetInteractorStyle(style);
	
	iren->Initialize();
	iren->Start();
	
	return 0;
	
}

运行效果:

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第1张图片

详解:

(1)vtkCylinderSource

生成的数据类型是vtkPolyData,柱体。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第2张图片
(2)vtkPolyDataMapper

将输入的数据转换为几何图元(点、线、多边形)进行渲染。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第3张图片
(3)vtkActor

a.派生自vtkProp,渲染场景中数据的可视化表达通过vtkProp的子类负责。

b.数据要在场景中渲染时,不是直接把数据加入渲染场景,而是以vtkProp的形式存在于渲染场景中。

c.三维空间中渲染对象最常用的vtkProp子类有vtkActor(表达场景中的几何数据)和vtkVolume(表达场景中的体数据)

d.二维空间中的数据用vtkActor2D表达

e.vtkProp子类负责确定渲染场景中对象的位置、大小和方向等信息

f.Prop依赖两个对象:Mapper(vtkMapper)对象,负责存放对象和渲染信息

                                   属性( vtkProperty)对象,负责控制颜色、不透明度等参数

g.vtkActor中还可以设置纹理(vtkTexture)对象,用于纹理贴图

h.vtkActor子类vtkFollower可以自动更新方向信息使其始终面向一个特定的相机,这样无论怎样旋转该对象都是可见的,例如三维场景中的广告板或者文本。

i.vtkActor子类vtkLODActor可以自动改变自身的几何表达形式来实现所需的交互帧率。

j.vtkAssembly建立了各个Actor的层次结构以便在整个结构平移,旋转或缩放等变换时能更合理的控制

 

 

 

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第4张图片

(4)vtkRenderWindow

vtkRenderWindow平台无关类,将操作系统与VTK渲染引擎连接到一起。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第5张图片
(5)vtkRenderer

a.负责管理场景的渲染过程。组成场景的对象包括:Prop,照相机(vtkCamera)和光照(vtkLight)

b.一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口不同的矩形区域中(即视口)或者覆盖整个窗口区域。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第6张图片
(6)vtkRenderWindowInteractor 交互器

a.提供平台独立的响应鼠标、键盘和时钟事件的交互机制,通过VTK的观察者/命令模式将监听到的特定平台的鼠标、键盘和时钟事件交由vtkinteractorObserver或其子类,如vtkInteractorStyle进行处理。

vtkInteractorStyle监听这些消息并进行处理以完成旋转、拉伸和缩放等运动控制。

b.vtkRenderWindowInteractor::SetRenderWindow():该方法用于设置渲染窗口

c.vtkRenderWindowInteractor::SeInteractorStyle():该方法用于定义交互器样式,默认交互样式为vtkInteractorStyleSwitch.

 

 

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第7张图片

(7)vtkInteractorStyleTrackballCamera

交互器样式的一种

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第8张图片

总结:经典比喻,加深理解。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第9张图片

2.2  三维场景的基本要素

2.2.1 灯光

a三维渲染场景中可以有多个灯光存在,灯光和相机是三维渲染场景中必备的要素,会自动创建默认的灯光和相机。

b.VTK中的vtkLight实例可以打开、关闭,设置灯光颜色,照射位置(焦点),灯光所在位置、强度等。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第10张图片

示例:

          vtkSmartPointer myLight =
		  vtkSmartPointer::New();
	  myLight->SetColor(0, 1, 0);
	  myLight->SetPosition(0, 0, 1);
	  myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
	  renderer->AddLight(myLight);

	  vtkSmartPointer myLight2 =
		  vtkSmartPointer::New();
	  myLight2->SetColor(1, 0, 0);
	  myLight2->SetPosition(0, 0, -1);
	  myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
	  renderer->AddLight(myLight2);

效果图:

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第11张图片

2.2.2 相机

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第12张图片

 

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第13张图片

示例:

          vtkSmartPointer myCamera =
		  vtkSmartPointer::New();
	  myCamera->SetClippingRange(0.0475, 2.3786);
	  myCamera->SetFocalPoint(0.0573, -0.2134, -0.0523);
	  myCamera->SetPosition(0.3245, -0.1139, -0.2932);
	  myCamera->SetViewUp(-0.2234, 0.9983, 0.0345);
	  renderer->SetActiveCamera(myCamera);

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第14张图片

2.2.3 颜色

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第15张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第16张图片

2.2.4 纹理映射

纹理映射是创建逼真效果的强大的图形工具,其原理是渲染时把二维的图像“贴”到物体的表面。

纹理映射三要素:待贴图的表面、纹理映射、纹理坐标。

纹理映射在VTK中就是vtkImageData的数据集。

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第17张图片

示例:

          vtkSmartPointer reader =
		  vtkSmartPointer::New();
	  reader->SetFileName("D:\\1.jpg");

	  vtkSmartPointer texture =
		  vtkSmartPointer::New();
	  texture->SetInputConnection(reader->GetOutputPort());
	  texture->InterpolateOn();

	  vtkSmartPointer plane =
		  vtkSmartPointer::New();
	  vtkSmartPointer mapper =
		  vtkSmartPointer::New();
	  mapper->SetInputConnection(plane->GetOutputPort());

	  vtkSmartPointer actor =
		  vtkSmartPointer::New();
	  actor->SetMapper(mapper);
	  actor->SetTexture(texture);
	  renderer->AddActor(actor);

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第18张图片

效果:

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第19张图片

2.3 坐标系统及空间转换

2.3.1 坐标系统

计算机图形学常用的坐标系统:Model坐标系统、World坐标系统、View坐标系统和Display坐标系统

两种表示坐标点的方式:以屏幕像素值为单位和归一化坐标值(各坐标轴取值范围为[-1,1])

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第20张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第21张图片

未完,待补充...

2.3.2 空间变换

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第22张图片

未完,待补充...

2.4VTK管线

2.4.1 VTK渲染引擎

VTK两个重要概念:

1.渲染引擎(Rendering Engine)主要负责数据的可视化表达

2.可视化管线(Visualization Pipeline)

 

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第23张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第24张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第25张图片

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


int main(int argc, char *argv[]) {
	vtkSmartPointer reader =
		vtkSmartPointer::New();
	reader->SetFileName("D:\\head.vtk");

	vtkSmartPointer marchingCubes =
		vtkSmartPointer::New();
	marchingCubes->SetInputConnection(reader->GetOutputPort());
	marchingCubes->SetValue(0, 500);

	vtkSmartPointer mapper =
		vtkSmartPointer::New();
	mapper->SetInputConnection(marchingCubes->GetOutputPort());

	vtkSmartPointer actor =
		vtkSmartPointer::New();
	actor->SetMapper(mapper);

	vtkSmartPointer renderer =
		vtkSmartPointer::New();
	vtkSmartPointer renWin =
		vtkSmartPointer::New();
	vtkSmartPointer interactor =
		vtkSmartPointer::New();

	renWin->AddRenderer(renderer);
	interactor->SetRenderWindow(renWin);
	renderer->AddActor(actor);
	renderer->Render();

	interactor->Initialize();
	interactor->Start();

	return 0;

}

2.4.2 VTK可视化管线

 

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第26张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第27张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第28张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第29张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第30张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第31张图片

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第32张图片

2.5 VTK智能指针

2.5.1引用计数

2.5.2 智能指针

2.5.3 运行时类型识别

VTK里在vtkObjectBase定义了获取对象类型的方法-GetClassName()和IsA()

基类向子类的类型转换,称为向下转型,VTK定义SafeDownCast()

VTK图形图像开发进阶-学习笔记 02 VTK的基本概念_第33张图片

你可能感兴趣的:(编程语言,可视化,vtk)