VTK 学习----VTK基础-数据对象、管道架构、渲染子系统

3.2.2 VTK数据对象

VTK的优势之一是它能够表示复杂的数据形式。这些数据形式从简单表到复杂结构,如有限元网格。所有这些数据形式都是如下图vtkDataObject所示的子类(注意这是许多数据对象类的部分继承图)。

其中一个最重要的特征是vtkDataObject可以在可视化管道中处理。vtkDataSet 和派生类用于科学可视化;vtkPolyData用于表示多边形网格; vtkUnstructuredGrid表示网格;vtkImageData表示2D和3D像素和体素数据。

3.2.3 VTK管道架构

VTK由几个主要子系统组成。可能与可视化包最相关的子系统是数据流/流水线架构。在概念上,管道体系结构由三个基本类对象组成:表示数据的对象(vtkDataObject),、将数据对象从一种形式映射到另一种形式的对象(vtkAlgorithm)、对象执行的一个管道(vtkExecutive)

典型的管道

虽然在概念上很简单,但实际实现流水线架构具有挑战性。一个原因是数据的表示可能很复杂。例如,某些数据集由层次结构或数据分组组成,因此跨数据执行需要进行多次的迭代或递归。更复杂的是,并行处理(无论是使用共享存储器还是可扩展的分布式方法)需要将数据分成片段,其中可能需要片段重叠以便一致地计算边界信息,例如衍生物。

算法对象也引入了自己特殊的复杂性。一些算法可以采用多个输入和/或产生不同类型的多个输出。一些可以在数据上本地操作(例如,计算单元的中心),而另一些则需要全局信息,例如以计算直方图。在所有情况下,算法将其输入视为不可变,算法仅读取其输入以产生其输出。这是因为数据可以作为多个算法的输入,并且一个算法覆盖另一个算法的输入并不是一个好主意。

最后,执行人员可能会很复杂,具体取决于执行策略的细节。在某些情况下,我们可能希望在过滤器之间缓存中间结果。这可以最大限度地减少管道中的某些内容发生变化时必须执行的重新计算量。另一方面,可视化数据集可能很大,在这种情况下,我们可能希望在不再需要计算时释放数据。最后,存在复杂的执行策略,例如数据的多分辨率处理,其需要管道以迭代方式操作。

3.2.4 VTK渲染子系统

VTK有一个简单的面向对象的渲染模型,其中的类对应于构成3D场景的组件。例如,vtkActor是由vtkRenderer结合vtkCamera呈现的对象,其中可能存在多个vtkRenderer、vtkRenderWindow。场景由一个或多个vtkLights照亮 。每个vtkActor的位置由vtkTransform控制,并且演员的外观通过vtkProperty指定。最后,演员的几何表示由vtkMapper定义。Mappers在VTK中发挥着重要作用,它们用于终止数据处理管道,以及连接渲染系统。考虑下面这个示例,抽取数据并将结果写入文件,然后使用映射器可视化并与结果交互:

vtkOBJReader *reader = vtkOBJReader::New();
reader->SetFileName("exampleFile.obj");

vtkTriangleFilter *tri = vtkTriangleFilter::New();
tri->SetInputConnection(reader->GetOutputPort());

vtkQuadricDecimation *deci = vtkQuadricDecimation::New();
deci->SetInputConnection(tri->GetOutputPort());
deci->SetTargetReduction( 0.75 );

vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
mapper->SetInputConnection(deci->GetOutputPort());

vtkActor *actor = vtkActor::New();
actor->SetMapper(mapper);

vtkRenderer *renderer = vtkRenderer::New();
renderer->AddActor(actor);

vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);

vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New();
interactor->SetRenderWindow(renWin);

renWin->Render();

这里创建了一个actor,渲染器和渲染窗口,并添加了一个将管道连接到渲染系统的映射器。还要注意添加一个vtkRenderWindowInteractor捕获鼠标和键盘事件的实例,并将它们转换为相机操作或其他操作。此转换过程通过vtkInteractorStyle定义。默认情况下,会在后台设置许多实例和数据值。例如,构造身份变换,以及单个默认(头部)光和属性。

随着时间的推移,这个对象模型变得更加复杂,大部分复杂性来自于开发专门用于渲染过程方面的派生类。vtkActors现在是专业化的vtkProp(就像在舞台上找到的道具一样),并且有大量这些道具用于渲染2D叠加图形和文本,专用3D对象,甚至支持高级渲染技术,如体积渲染或GPU实现。

同样,随着VTK支持的数据模型的增长,将数据与渲染系统连接的各种映射器也在增长。另一个重要扩展领域是转型层次结构。最初的简单线性4×4变换矩阵,已成为支持非线性变换(包括薄板样条变换)的强大层次结构。例如,原始vtkPolyDataMapper具有特定于设备的子类(例如vtkOpenGLPolyDataMapper)。

近年来,它被一种复杂的图形管道所取代,被称为下图所示的“画家”管道。

画家设计支持各种渲染数据的技术,这些技术可以组合以提供特殊的渲染效果。这种能力大大超过了vtkPolyDataMapper1994年最初实施的那种简单。

可视化系统的另一个重要方面是选择子系统。在VTK中,存在“选择器”的层次结构,大致分类为, 选择基于硬件的方法与基于软件的方法(例如,光线投射)的vtkProps; 以及在拾取操作之后提供不同级别信息的对象。例如,一些pickers只提供XYZ世界空间中的一个位置,而不指示vtkProp他们选择了哪个; 其他的不仅提供选定的vtkProp而且提供构成定义道具几何形状的网格的特定点或单元。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dylan55_you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值