Skip to content

Commit

Permalink
update: VTK note
Browse files Browse the repository at this point in the history
  • Loading branch information
hxf0223 committed May 22, 2024
1 parent ad7c44c commit d00801b
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 3 deletions.
67 changes: 64 additions & 3 deletions _posts/2023-07-09-vtk-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,68 @@ mermaid: true
# pin: true
---

## vtkUnstructuredGrid 添加数据
## VTK可视化基本流程

* SetScalar、Vector = AddArray + SetActiveScalar\Vector 类似问题,看源码,不同的filter会取不同的activeAttribute,具体设置哪个active还是取决于filter
* setActive 不是2选一的关系
```cpp
/* 二维等值线提取与可视化代码片段 */
// 等值线 Filter
vtkContourFilter *contourFilter = vtkContourFilter::New();
contourFilter->SetValue(0, ui->selectedValueLabel->text().toDouble());
contourFilter->SetInputData(polyData);

// 将几何数据转换为可被渲染引擎绘制的可视化表达
vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
contourMapper->SetInputConnection(contourFilter->GetOutputPort());
contourMapper->ScalarVisibilityOff();

// 需要被渲染绘制的对象
contourActor = vtkActor::New();
contourActor->SetMapper(contourMapper);
contourActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
contourActor->GetProperty()->SetLineWidth(2.0);

// 添加到渲染器
renderer->AddActor(contourActor);
```
![VTK可视化基本流程](/assets/images/vtk/vtk_contour2d_workflow.png)
## VTK 主要 class
- [VTK 简明教程 -- 主要 class](https://csuzhangxc.gitbooks.io/vtk-simple-tutorial/content/basic/main_classes.html)
## VTK开发精要:数据与管线机制(济南友泉软件有限公司)
- [VTK开发精要:数据与管线机制](https://blog.csdn.net/qq_26221775/article/details/108023931)
## Filter
`VTK`中通过**管线机制**来实现组合各种算法处理数据。每一种算法是一个`Filter`,多个`Filter`连接在一起形成`VTK管线`。
$\color{#FF0000}{每个Filter可以分为两个组成部分:一个是算法对象,继承自`vtkAlgrithm`,主要负责处理输入的数据和信息;另一个是执行对象,继承自`vtkExecute()`,负责通知算法对象何时运行以及传递需要处理的数据和信息。}$
`Filter`类继承自`vtkAlgrithm`及其子类,实例化时,内部会生成一个默认的`Executive()`对象,用于管理执行管线。
`Filter`的输入数据与信息存储在输入端口中。一个`Filter`可能有0个输入端口(例如 `Reader` 对象);也可能有一个或多个输入端口(例如,`vtkGlyph3D` 类需要两个输入端口,每个输入端口可以建立多个连接)。
一个`Filter`可能有1个或多个输出端口,每个输出端口对应一个逻辑输出。例如`vtkExtractVectorComponents`类,从一个三维向量数据中提取每个分量数据,该Filter需要一个输入端口接受向量数据,三个输出端口用于输出三个分量数据,端口号分别为 0, 1, 2。
Filter之间通过端口(Port)建立连接(Connection)。例如一个标准的连接代码如下:
```cpp
Filter2->SetInputConnection( Filter1->GetOutputPort() );
```

该句代码将Filter1的输出端口与Filter2的输入端口建立连接,连接中只涉及了一个输入端口和一个输出端口。

`VTK`中还有许多`Filter`可能需要多个输入,例如`vtkGlyph3D`,该类需要两个输入数据并生成一个输出数据。因此这里需要建立两个连接,相应的函数分别为`SetInputConnection()``SetSourceConnection()`,其中,`SetInputConnection()`输入的是几何点集数据,对应输入端口0,`SetSourceConnection()`输入的是`Glyph图形数据`,对应输入端口1。`vtkGlyph3D`中输入的两个数据具有不同的意义,因此建立了两个不同的输入端口。

另外,对一个Filter的多个输入数据具有相同意义时,则只需要建立一个输入端口,并使用AddInputConnection()来添加新的连接。例如vtkAppendFilter类实现数据的合并,其多个输入数据具有相同意义,而不像vtkGlyph3D的两个输入表示不同的对象,因此其连接建立如下:

```cpp
apeend = vtkAppendFilter::New();
append->AddInputConnection( foo->GetOutputPort );
append->AddInputConnection( bar->GetOutputPort );
```
管线的接口是通过逻辑端口(Logical Port)而不是数据流实现的,因此在形成连接的过程中不需要知道实际的数据类型,而是在执行时进行数据类型检查,以决定管线是否执行。
Binary file added assets/images/vtk/vtk_contour2d_workflow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit d00801b

Please sign in to comment.