VTK 基础(一) — 常用控件介绍及实现圆锥体绘制

简介: 最近在做医学图像的相关处理,其中用到了可视化程序包 VTK,在学习过程中,准备写一系列相关教程,一方面用于巩固自己所学,主要自己太笨图片,另一方面加强一下知识理解。利用 VTK 进行绘制物体时,常用到的组件有下面几种,为了加深理解,VTK 把一个物体的渲染过程比喻成了一场演出(真的很形象图片):

最近在做医学图像的相关处理,其中用到了可视化程序包 VTK,在学习过程中,准备写一系列相关教程,一方面用于巩固自己所学,主要自己太笨,一方面加强一下知识理解。

利用 VTK 进行绘制物体时,常用到的组件有下面几种,为了加深理解,VTK 把一个物体的渲染过程比喻成了一场演出(真的很形象):


  • vtkRenderWindow : 绘制窗口,相当于用于表演的舞台场地;
  • vtkRenderer — 涉及灯光,相机,actor 的绘制过程;相当于舞台上的整体表演效果;
  • vtkLight — 灯源用于照明场景;
  • vtkCamera — 定义视角,焦距,及场景的视觉属性,相当于观众的视野范围;
  • vtkActor — 场景中渲染的对象,属性以及它在场景中的位置,绘制中展示的道具;相当于演出的演员和道具;
  • vtkProperty 修饰 vtkActor 的属性,包括颜色、透明度及灯光的属性(反射、折射效果),演出用到的灯光
  • vtkMappervtkActor 的几何映射,绘制时需要把 vtkAcor 转化为几何属性才能进行绘制;多个 vtkActor 可以设置相同的 mapper


下图是对 VTK 在绘制效果中对各组件的标注:

微信图片_20220520112627.jpg


进行物体绘制时,需要先提供源数据,对数据进行一系列操作(读取、格式转换、Filter图像处理),再转化为vtkMappervtkActor 进行设置`vtkMapper 后,传入vtkRendener (绘制器)中。


在进行代码实现时,如果没有定义vtkLight、vtkCamera 两个组件时,程序会自动创建这两个组件。

整体来说,VTK 的数据管道流向如下:


微信图片_20220520112629.jpg

下面就利用代码来实现一个圆锥体的绘制,借助于 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;
}


最终的效果如下:

微信图片_20220520112631.jpg

代码中对圆锥设置了几个参数:高度,底部半径,及包含面的个数(圆锥涉及的面的总个数);

VTK 除了头文件 vtkConeSource.h 提供圆锥数据以外,还有椭圆,正方体,圆环等数据对象。


微信图片_20220520112634.jpg

相关文章
|
2月前
|
计算机视觉 C++
基于Qt的简易图片浏览器设计与实现
基于Qt的简易图片浏览器设计与实现
35 1
|
存储 编解码 缓存
Qt开发技术:Qt绘图系统(一)绘图系统介绍
Qt开发技术:Qt绘图系统(一)绘图系统介绍
Qt开发技术:Qt绘图系统(一)绘图系统介绍
|
2月前
|
前端开发 数据可视化 JavaScript
【五一创作】QML、Qt Quick /Qt中绘制圆形
【五一创作】QML、Qt Quick /Qt中绘制圆形
68 0
|
9月前
|
前端开发 定位技术
QT使用QML实现地图绘制虚线
QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段
137 0
|
9月前
QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 终篇
接上一篇,我们需要继续完成以下的效果; 先上个效果图:
102 0
|
9月前
|
C++
QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 始篇
详细的介绍可以看QT的官方助手,那里面介绍的详细且明白,需要一定的英语基础,我这里直接使用一个开源项目来介绍QGraphicsView、QGraphicsScene的使用。
200 1
|
9月前
|
图形学 容器
QT5图形视图框架
GraphicsView (图形视图)框架结构取代了之前版本中的QCanvas模块,它提 供基于图元的模型/视图编程,类似于QtlnterView的模型/视图结构,只是这里的数据是图形。
104 0
|
定位技术 图形学 容器
Qt5入门学习——图形视图框架
Qt5入门学习——图形视图框架
291 0
Qt5入门学习——图形视图框架
从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap
从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap
从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap
|
计算机视觉
Qt实用技巧:在Qt中获取屏幕的绝对坐标
Qt实用技巧:在Qt中获取屏幕的绝对坐标