VTK进阶笔记

VTK是一个开源的三维图形处理和可视化库,支持多种编程语言,包括Java、C++和Python。它通过可视化管线和渲染引擎将数据转化为图形,涉及数据对象、过滤器、映射器、演员、渲染器和窗口交互器等核心概念。一个简单的VTK示例展示了如何创建和显示一个圆锥模型。文章还介绍了三维场景中的灯光、相机、颜色和纹理映射等基本要素。
摘要由CSDN通过智能技术生成

一、VTK 基础知识

我的理解是VTK可以将不可视的数据以图形学和模型的可视化方式呈现在使用者面前,可以进行模拟、仿真、推演等方式进行实验性或者辅助性的工作;

1.VTK基本介绍

VTK 独立于系统的图形界面接口(GUI),可方便的嵌入到其他的相关软件中。同时开发人员可以基于 VTK 独立的基础类库开发自己的库函数,拓展 VTK 的应用范围。

VTK 采用面向对象思想,基于 OpenGL 开发出目标函数库。它将将一些常用的算法封装为类的形式,用户在开发过程中可以直接调用其函数库进行开发,而不必纠结函数内部具体的实现过程。

2.VTK基本组成

VTK 包含图形图像处理与可视化领域内的上百种算法,支持跨平台,可在 Java、C/C++、Tcl/Tk 与 Python 等高级编程语言环境下使用。

VTK 由两大部分构成,其核心层(Compiled Core,C++类库)是基于 C/C++语言编写的,上层部分是依据特定规则编写的支持脚本语言(如 Java、Tcl/Tk 与 Python)的解释层(Interpreted Interface),如图 1-1 所示

在 VTK 编译层中,VTK 其它的类或相关程序可调用集成了图像处理相关数据结构与算法的 C++对象。解释层部分是脚本语言与编译后的 VTK 动态链接库进行绑定而生成的相应解释型语言的接口。

VTK 的拥有特别庞大的类库,可根据各个类在类库中的具体作用将各类分成如下模块:图像处理模块(Imaging)、文件读写模块(IO Interface)、图形处理模块(Graphics)、绘制模块(Rendering)、公共模块(Common)、数据转换模(Filtering),每个模块被编译成相应的动态连接库。

3.VTK 的工作原理

VTK中两个比较重要的概念就是:1.可视化管线;2.渲染引擎;

可视化管线是指用于获取或创建数据、处理数据以及把数据写入文件或者把数据传递给渲染引擎进行显示;可视化管线的三个基本要素是:数据对象(Data Object)、处理对象(Process Object)和数据流方向(Direction of Data Flow);

VTK通过数据流实现变信息为图形数据的。

数据流一般为:source—filter——mapper——actor——render——renderwindow——interactor。

输入数据(Source)对数据进行滤波操作(Filter),然后对数据进行映射(vtkMapper),将其封装成一个对象(vtkActor),再将这个对象添加到渲染场景(vtkRenderer)中,再利用渲染窗口(vtkRenderWindow)中进行渲染展示

要理解工作原理,首先明确几个类型:

1.vtkSource(数据源) 这个就好比一个剧本里面的角色,让演员知道要演的是什么人物。

数据源有:vtkConeSource,vtkSphereSource,vtkOutlineSource…等等。

它们都继承与vtkPolyDataAlgorithm类,该类用于提供不同的类型的数据源

2.vtkMapper(映射器) 它就像是一个剧本,应该如何塑造角色的装扮

映射器有:vtkDataSetMapper,vtkMultiGroupPolyDataMapper,vtkPolyDataMapper。

它们都继承于vtkMapper类。所有的数据对象都要通过映射器Mapper映射到vtkActor中。

3.vtkActor(演员) 有了剧本,有了角色,得找个真人来演出这个剧本了。

该类继承于vtkProp3D,有4个子类:vtkFollow,vtkLODActor,vtkMesaActor,vtkOpenGLActor.

4.vtkRenderer(渲染器) 场景或者舞台,演员在其中按照剧本表演,还会有各种灯光的设置;

该类继承于vtkViewport,有2个子类:vtkMesaRender,vtkOpenGLRender.

该类另外一个作用是设置窗口vtkRenderWindow的背景.

5.vtkRenderWindow(窗口) 这个就相当于个舞台 ,把准备好的演员放进去,准备表演了;

该类继承于vtkWindow,有2个子类:vtkMesaWindow,vtkOpenGLWindow.

6.vtkRenderWindowInteractor(窗口交互器) 我觉得这个应该是导演,用于指挥调度演员和场景的切换,比如控制镜头的推出和拉近,那些地方要给个特写,是一个操控舞台的上帝之手;

该类的继承关系在vtkRenderWindowInteractor文章中已给出。

7.vtkInteractorObserver(观察者) :我觉得这里应该是观众席上的观众们,每个不同的观众关注的细节,关注的场景都不一样,有的观众或会镜头旋转时做一些记录,有的观众可能在看表演时带上偏光镜;

从上面可以看出,现在整个剧院就相当于一个vtk中渲染窗口vtkRenderWindow,舞台就是渲染场景vtkRenderer,演员就是一个个对象vtkActor,他们不同的容貌、服装等这些属性统称为vtkProperty,我们观众和演员的互动就是vtkRenderWindowInteractor,我们送花、拥抱、握手等这些就是交互的风格vtkInteractorStyle,舞台上的灯光就是vtkLight,每个观众的眼睛就是vtkCamera,由于我们每个观众看到的东西都是唯一的所以vtkCamera只有一个,但是灯光vtkLight却可以是多个的。

3.1 映射器

3.2 角色

3.3 渲染器

4.VTK 的可视化流程

VTK 的可视化流程将需要处理的数据视作流动介质在管道中流动,因此可视化的不同阶段的数据将会有不同的处理方式,图形模型与可视化模型的结合构成了 VTK的可视化管线。 可视化模型主要用来对拟合后的数据进行处理,生成可被VTK绘制的几何形体。

  • vtk可视化线管:

Source 对象的数据既可以是已知读入的,也可是程序运算得到。过滤器(Filter)将经过 Source 对象处理后数据对象(Data Object)进行处理来生成新的数据对象。新生成的数据对象进入映射器(Mapper),将三维数据映射成几何图像,然后绑定到演示对象(Actor),此时用户可以设置演示对象的属性(如文本、颜色等)。渲染器(Renderer)在设置灯光(Light)与相机(Camera)等属性后,将演示对象添加到绘制器窗口(RenderWindow)对三维体进行绘制与显示。交互器(RenderWindowInteractor)可为演示对象提供人机交互(如缩放、旋转、文本显示等)

二、VTK简单实践

1.一个简单的vtk示例

VTK示例:

//***********************************
//说明:一个简单的VTK例子
//时间:2023.03.15
//作者:Kris
//********************************
#include<vtkSmartPointer.h>

#include<vtkConeSource.h>
#include<vtkPolyDataMapper.h>
#include<vtkActor.h>
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkInteractorStyleTrackballCamera.h>

#include <vtkAutoInit.h>        
//VTK_MODULE_INIT(vtkRenderingOpenGL);  //自己的PCL1.8.0安装后产生的是OpenGL2,所以这一句需要改成OpenGL2.

VTK_MODULE_INIT(vtkRenderingOpenGL2);  

VTK_MODULE_INIT(vtkInteractionStyle); //外部依赖项添加opengl32.lib(我自己的还要添加vfw32.lib你的不知道要不要)

VTK_MODULE_INIT(vtkRenderingFreeType);
int main()
{
    //圆锥模型
    vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
    cone->SetHeight(3.0);
    cone->SetRadius(1.0);
    cone->SetResolution(10);

    //映射器
    vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    coneMapper->SetInputConnection(cone->GetOutputPort());

    //对象
    vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
    coneActor->SetMapper(coneMapper);

    //渲染
    vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(coneActor);
    renderer->SetBackground(0.0, 1.0, 1.0);

    //渲染窗口
    vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New();
    renWin->AddRenderer(renderer);
    renWin->SetSize(600, 400);

    //交互
    vtkSmartPointer<vtkRenderWindowInteractor>renderInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderInteractor->SetRenderWindow(renWin);

    //交互风格
    vtkSmartPointer<vtkInteractorStyleTrackballCamera>style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    renderInteractor->SetInteractorStyle(style);

    renderInteractor->Initialize();
    renderInteractor->Start();

    return 0;

}

一个圆锥(例子)

2.三维场景中的基本要素

(1)灯光

灯光和相机是三维渲染场景必备的要素,vtkRenderer会自动创建默认的灯光和相机。VTK里用类vtkLight来表示渲染场景中的灯光。与现实中的灯光类似,VTK中的vtkLight实例也可以打开、关闭,设置灯 光的颜色,照射位置(焦点),灯光所在的位置、强度等。


vtkLight可以分为位置灯光(Positional Light,也叫聚光灯)和方向灯光(Direction Light)。 位置灯光是光源位置在渲染场景中的某个位置,可以指定灯光的衰减值、锥角等;方向灯光 即光源位置在无穷远,可以认为光线是平行的,比如自然界中的太阳光。光源的位置和焦点 的连线定义光线的方向,默认的vtkLight为方向灯光。

(2)相机

观众的眼睛就像是VTK中的相机,每个人看到的场景都是唯一的,所以相机是唯一的。在VTK中相机用类vtkCamera表示,在电脑屏幕上显示都是二维的所以需要利用相机将三维场景投影变换到二维平面。

从上图可以看出相机的几个关键要素:

  1. 相机位置:相机的位置,SetPosition()方法设置
  2. 相机焦点:SetFocusPoint()
  3. 相机朝向:相当于正着看还是倒着看,SetViewUp()设置
  4. 投影方向:相机到焦点的向量方向
  5. 投影方法:确定Actor如何映射到像平面,VTK中提供了两种方法:正交投影和透视投影,正交投影也称平行投影,进入相机的光线是平行的;透视投影中所有的光线相交于一点
  6. 视角:SetViewAngle()设置,默认仰角30°
  7. 前后裁剪平面:裁剪平面与投影方向相交,一般是垂直的。用于评估Actor与相机距离的远近,只有在裁剪平面之间的Actor才是可见的,用SetClippingRange()设置。

相机运动

(3)颜色

颜色是每个Actor重要的属性之一。VTK中采用的是RGB和HSV两种颜色系统来描述。

RGB颜色系统

RGB颜色系统由三个颜色分量:红色(R)、绿色(G)、蓝色(B),这三个分量在VTK中的取值范围都是0~1,(0,0,0)表示黑色,(1,1,1)表示白色。可以采用vtkProperty::GetColor(double & r, double & g, double & b)设置Actor的颜色。

HSV颜色系统

HSV同样是采用三个分量来设置颜色:色相(Hue)、饱和度(Saturation)、值(Value)。色相就是颜色的基本属性也就是颜色的名称,如红色、绿色、蓝色等;饱和度就是颜色的纯度,其值越高则越纯;值也就是强度Intensity或者Bright,值为0表示黑色,值为1表示最亮的颜色。这三个分量在VTK中取值范围也是0~1。

(4)纹理映射

纹理映射是创建逼真效果的强大的图形工具,其原理是渲染时把二维的图像“”到物体的表面啥昂,根据二维图像渲染出丰富多彩的效果,所有也叫纹理贴图。纹理映射需要三个要素:待贴图的表面纹理映射以及纹理坐标。其中纹理映射在VTK中就是vtkImageData的数据集,而纹理坐标则用于控制纹理图在表面的位置,作为被贴对象数据的属性

原理:

纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。纹理生成过程实质上是将所定义的纹理映射为某种三维物体表面的属性,并参与后续的光照计算。

  实现纹理映射主要是建立纹理空间与模型空间、模型空间与屏幕空间之间的映射关系。其中纹理空间可以定义为u-v空间,每个轴坐标范围为(0,1)。其中对于一个纹理图像,其左下角uv坐标为(0, 0),右上角坐标为(1, 1)。而对于简单的参数模型,可以方便地建立模型与纹理空间的映射关系,比如球面、圆柱面等。然后根据图形学三维空间变换容易实现模型空间到屏幕空间的变换,因此最终显示在计算机屏幕的图像即是纹理映射后的结果。

三、坐标系统及空间变换

1.坐标系统

计算机图形学里常用的坐标系统主要有四种,分别是:Model坐标系统World坐标系统View坐标系统Display坐标系统,以及两种表示坐标点的方式:以屏幕像素值为单位归一化坐标值(各坐标轴取值都为[-1, 1])。

Model坐标系统是定义模型时所采用的坐标系统,通常是局部的笛卡尔坐标系。例如,我们要定义一个表示球体的Actor,一般的做法是将该球体定义在一个柱坐标系统里。

World坐标系统是放置Actor的三维空间坐标系,Actor其中的一个功能就是负责将模型从Model坐标系统变换到World坐标系统。每一个模型可以定义有自己的Model坐标系统,但World坐标系只有一个,每一个Actor必须通过放缩、旋转、平移等操作将Model坐标系变换到World坐标系。World坐标系同时也是相机和光照所在的坐标系统。

View坐标系统表示的是相机所看见的坐标系统。X、Y、Z轴取值为[-1, 1],X、Y值表示像平面上的位置,Z值表示到相机的距离。相机负责将World坐标系变换到View坐标系。

Display坐标系统跟View坐标系统类似,但是各坐标轴的取值不是[-1, 1],而是使用屏幕像素值。屏幕上显示的不同窗口的大小会影响View坐标系的坐标值[-1, 1]到Display坐标系的映射。可以把不同的渲染场景放在同一个窗口进行显示。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值