官方文档翻译

  • 前言
  • 简介
  • Inviwo 图形界面介绍
  • 图形界面概览
  • 处理器
  • 接口
  • 属性
  • Inviwo 网络

前言

目前由于业务需要学习 Inviwo,但翻遍论坛发现相关教程及经验意外地少,只能去查阅官方手册。现在把啃的过程放在这里当作记录(基本就是硬翻译)

简介

Inviwo 是一款提供快速可视化原型框架功能的软件,官网见 Inviwo 官网,目前多用于医学数据可视化领域。其诞生从 Voreen 借鉴了不少特性,但 Voreen 已经多年不更新了。

I, 并且易于使用和做二次开发,核心模块完全使用C++开发。

特性:

  • 简化 BSD 许可证下的开源软件,免费使用
  • 跨平台(Windows, Linux, Mac OS X)
  • 通过将外部 module 内包含达到良好的扩展性
  • C/C++ 内核及其次要依赖项
  • 图像模块基于OpenGL(>= 3.3)
  • 通过 OpenCL (>= 1.0) 相关 module 实现多平台(GPU/CPU) 并行运算
  • 支持 Python 脚本(>= 3.2)
  • GUI 使用 Qt5 (>= 5.12)
  • 使用 GLFW 3 进行多窗口及上下文管理
  • 通过 CMake (>= 3.12.0) 配置/生成项目及 module
  • 可通过 Visual Studio 2019, Clang 8, GCC 9, XCode 11 编译 Inviwo
  • 需要 C++17

Inviwo 图形界面介绍

接下来介绍 Inviwo 的图形化用户界面及其构建模块的大致概念。这份指导手册的目的是让用户对 Inviwo 的 GUI 有直觉上的感受并教会用户能使用已有的处理器构建一个工作区。官网手册也提供了视频教学

图形界面概览

MovieLens数据分析及图表展示 inview数据分析软件_qt


上图为 Inviwo GUI 概览。可以看到,中间区域为网络编辑区,左右菜单分别为处理器列表受选处理器属性栏,下方为 Debug 控制台及日志信息,以上部分构成了主要区域。

我们可以从处理器列表拖拽处理器到网络编辑区。“处理器”(Processor) 是网络的基本构建块,它可以执行封装化的行为。每个处理器可以定义它所需的输入和输出并使用鼠标将接口连接进行传输。最终网络形成一个有向无环图,其中节点为处理器而边为接口链接。除了输入和输出之外,也可在右栏编辑某个被选中处理器的属性。这些属性表示了处理器了配置及暴露给用户的参数。更改一项属性会交互地更新网络的结果。处理器的样例包括:

  • 源处理器:主要用于加载数据(例如 体积源,网格源,图像源)。他们没有输入只有通过输出接口输出加载的数据。可在属性中设置相应文件路径。
  • 执行特定算法处理器:例如体积 Raycaster,网格渲染,图像反转。
  • 池处理器:只有输入没有输出。例如“画布”(Canvas),用来显示输入的图像,并没有输出。

整个网络,即所有的处理器,他们的链接及属性,可一起被保存为工作区。加载一个工作区及恢复整个网络的状态,包括其参数和处理器的摆放等。

Tips:

  • 你可以通过从一个已初始化处理器列表的顶部拖拽一个处理器到网络中来重新初始化它
  • 当把处理器拖拽进网络时如果按住 Shift 键,inviwo会尝试自动将其与其他处理器进行连接。
  • 一些属性(如摄像头)在初始化时会自动连接。拖拽处理器时按住 Alt 键可阻止其自动连接。

处理器

处理器 是 Inviwo 网络中的基本构建单元。实际的图形化处理器元素包含了很多信息,参见下图:

MovieLens数据分析及图表展示 inview数据分析软件_qt_02


首先并且最重要的,是显示其他处理器与该处理器连接的输入输出接口,以不同颜色表示了接收及产出的数据类型。并且显示了哪些信息是强制必须的哪些是额外可选的输入。状态灯标识了处理器是否成功输出,意味着它有了所有必须的输入连接并且在没有致命错误的情况下处理输入数据。最后,你可以通过从一个处理器的"属性连接器"拖拽连接至另一个处理器的来将属性连接起来(必须类型相同)。实际的连接机制将在后面阐述。

接口

正如以上所言,一个处理器的接口决定了其内部处理操作的输入和输出。接口内的点表示了接口是可选的并且处理器不连接它就可以工作。一个接口的颜色表示了流经它的数据类型,例如红色代表体积,黄色代表网格,蓝色代表图像。如果要有方向地检查流经接口的数据,你可以通过鼠标停留在接口上查看 弹出的 Port Inspector

MovieLens数据分析及图表展示 inview数据分析软件_交互_03


该窗口将显示准确类型和元数据比如空间维度以及数据的实际预览。当对一个网络 debugging 的时候,通过 Port Inspector 检查所有的输入输出是不错的第一步。注意有些输入接口时多重输入接口,意味这你可以连接多个输出接口。通过连接的输出接口所有数据看是在处理器中作为一个列表使用。

属性

属性栏可以让你定义处理器的配置。意味着它有条理地包含了这个处理器所有的参数,并允许以选项框、滑动条和窗口小部件等来简单地操控。

除了可以简单操作参数,属性栏可以与其他处理器的属性栏连接绑定来实现同步化。在属性连接器(参见处理器)将属性与另一个处理器的属性拖拽连接一起后,会打开如下图的窗口:

MovieLens数据分析及图表展示 inview数据分析软件_c++_04


此窗口列出了所有可能连接至另一处理器的属性。你基本上能将任何共享相同类型的属性连接起来。对于复合属性(包含其他属性的属性),可以点击展开以展示次级的简单属性,它们也可以单独地连接起来。当拖动两属性之间的连接时,会建立一个双向连接,意思是其中任何一个属性变更另一个属性也会做同样更新。通过点击该连接你可以通过双向连接交换它们(个人通过实验觉得这里不太对,应该是双击会切换双向->单向)。注意某些属性会默认自动连接,比如"摄像头属性"。着保证了所有需要摄像头信息的处理器得到相投参数以让你能在同一张画布上看到多个渲染的共同结果。在多画布设置中那些需要多个观察接口的,它们之间的连接也许需要去除。你也可以通过在拖拽处理器时按住 Alt 来避免自动连接。属性中另一个重要的方面是属性语义(Property Semanitics)。这是对属性的另一种抽象表示,以不同的方式呈现在用户界面。拿一个 3D 矢量举例,它们可以用来表示三维位置、方向和颜色。下图显示了效果。根据其语义,不同的图像化表示可以让用户更直觉性地来设置属性

MovieLens数据分析及图表展示 inview数据分析软件_c++_05


该菜单左边是矢量 Vec3 的拾色器。在右边是两项位置语义,上方是极坐标,其他是直接设置坐标分量。在右下你可以看到“光照位置”语义,你可以在球上拖动游标来图形化地设置光照方向。

一个属性总是必须设置默认值以及可能的取值范围。对于一个普通的浮点数的范围决定其滑动条的最小(min)及最大值(max)。

你可以右键点击一项属性分别选“语义(Semantics)” 或 “属性(Property)”来同时调整语义和默认值/取值范围。

Inviwo 网络

nviwo网络是围绕几个概念构建的,以保持生成的图的干净性和确定性。本指南解释了这些概念,并阐明了处理器执行的时间顺序。我们还附带了一个视频教程 (还是Youtube)

总的来说,这些网络大致代表了可视化的 Pipelline,即一个从网络顶部到底部的数据流。请注意,图表中不能有循环!这种自上而下的数据流已经强制处理器的执行也是自上而下的,因为底部处理器需要来自前一个处理器的输出。

为了保持应用程序的交互性,事件(尤其是画布上的鼠标事件)在网络中向上传播,直到处理器消耗(consume)该事件。向上运行的每个处理器都可以查看该事件,并确定该事件是否会 无效化 处理器(TODO: 链接到失效),这意味着该处理器必须更新其输出。此外,如果一个处理器以这种方式失效,这也会_无效化_下面的所有后续处理器。在处理完所有事件并将所有无效的处理器标记为“无效”后,将重新评估网络,这意味着所有无效的处理器将被重新执行一次。消耗该事件的处理器之上的任何处理器均不受影响,不会重新计算其输出。如果没有处理器消耗该事件,则会将其传播到源处理器,但除非该事件使处理器失效,否则不会对其进行重新评估。

让我们以相机操作为例(比较下图):在画布上执行拖动手势(单击并移动)以旋转相机。这会触发向上传播的鼠标移动事件。在下图中,您可以看到事件向上移动,直到 VolumeRaycaster 使用它,但它既没有到达 EntryExitPoints,也没有到达 Mesh Renderer。作为对事件的反应,VolumeRaycaster会更新其 CameraProperty,从而使处理器失效。由于 CameraProperty 链接到 EntryExitPoints 和 Mesh Renderer 处理器的相机属性(请参见属性链接),它们也会因相机参数的更改而无效。

MovieLens数据分析及图表展示 inview数据分析软件_qt_06

注意:当处理器的输入发生变化,并且可以为属性设置不同的失效级别时,处理器总是会被重新评估。这意味着在代码中,你可以控制哪些属性更改会触发网络的重新计算。