介绍
VIS组件通过VTK库为OCCT拓扑形状的可视化提供适配功能。本用户指南描述了如何在基于 VTK 库的 3D 可视化应用程序中应用 VIS 类。
在应用程序中有两种使用 VIS 的方法:
- 使用高级 API。这是一个使用显示 OCCT 形状的 VTK 查看器的简单场景。它考虑了与 VIS 组件一起提供的工具的使用,例如特定的 VTK 数据源、选择器类和特定的 VTK 过滤器。基本上,在这种情况下,您可以使用来自 VIS 的扩展来丰富您的自定义 VTK 管道。
- 使用低级 API。对于有特定需求的用户来说,这是一个高级场景,VIS 的更高级别的实用程序没有解决这些需求。它假定在 VIS 组件的低级 API 的帮助下实现自定义 VTK 算法(如过滤器)。本文档描述了将 VIS 集成到应用程序中的两种情况。要理解本文档,有必要熟悉 VTK 和 OCCT 库。
组件架构
通用结构
VIS组件由以下包组成:
- IVtk – 定义作为 VIS 基础的主要对象的通用接口。
- IVtkOCC – 实现与 CAD 域相关的接口。该软件包中的类处理 OCCT 的拓扑形状、刻面和交互式选择工具;
- IVtkVTK ——VTK可视化工具包相关接口的实现;
- IVtkTools – 设计用于集成到 VTK 可视化管道的高级工具。
所提到的包组织背后的想法是通过它们对特定库(OCCT,VTK)的依赖关系,将接口与其实际实现分离。除了提供语义分离之外,这种分离还有助于避免对其他 OCCT 工具包和 VTK 的过度依赖。
- IVtk包根本不依赖 VTK 库,仅因为使用了集合而需要 OCCT 库(TKernel库);
- IVtkOCC包中的实现类仅依赖于 OCCT 库,不需要 VTK;
- IVtkVTK包仅依赖于 VTK 库,不需要任何 OCCT 功能,除了集合。
基本上,使用最终用户应用程序中的前三个包(IVtk、IVtkOCC和IVtkVTK)就足以在 VTK 查看器中使用 OCCT 形状。但是,IVtkTools包也作为组件的一部分提供,以使工作更加舒适。
IVtk 包
IVtk包包含以下类:
- IVtk_Interface – 组件所有接口的基类。为Handle(OCCT“智能指针”)功能提供继承
- IVtk_IShape – 表示任意性质的 3D 形状。提供其 ID 属性。此接口的实现应为所有可视化形状维护唯一的 ID。这些 ID 可以在应用程序级别轻松转换为原始形状对象。
- IVtk_IShapeData – 表示多面数据。提供添加坐标和单元格(顶点、线、三角形)的方法。
- IVtk_IShapeMesher – 刻面接口,即从IVtk_IShape输入形状构造IVtk_IShapeData 。
- IVtk_IShapePickerAlgo – 用于在场景中交互式拾取形状的算法接口。提供根据所选选择模式在给定位置查找形状及其部分(子形状)的方法。
- IVtk_IView – 获取视图转换参数的接口。它由IVtk_IShapePickerAlgo使用。
IVtkOCC 封装
IVtkOCC包包含依赖于 OCCT 的类的实现:
- IVtkOCC_Shape – IVtk_IShape接口的实现作为 TopoDS_Shape 的包装器。
- IVtkOCC_ShapeMesher – IVtk_IShapeMesher接口的实现,用于从TopoDS形状构建构面
- IVtkOCC_ShapePickerAlgo – 交互式拾取算法的实现。它为形状( IVtk_IShape实例)和给定光标位置的拾取工具提供启用/禁用选择模式
- IVtkOCC_ViewerSelector – 交互式选择器,它实现了拾取算法IVtkOCC_ShapePickerAlgo的Pick()方法,并在抽象IView接口的帮助下连接到可视化层
IVtkOCC_ViewerSelector是 OCCT 原生SelectMgr_ViewerSelector的后代,因此它为IVtkVTK_View实现了 OCCT 选择机制(类似于为 OCCT 原生V3d_View实现SelectMgr_ViewerSelector的StdSelect_ViewerSelector3D)。IVtkOCC_ViewerSelector封装了拾取机制的所有投影变换。这些转换是从通过 VTK Renderer 可用的vtkCamera实例中提取的。IVtkOCC_ViewerSelector与本机 OCCT SelectMgr_Selection实体一起操作。每个实体代表OCCT可选对象的一种选择模式。ViewerSelector是一个内部类,因此它不是公共 API 的一部分。
- IVtkOCC_SelectableObject – OCCT 形状包装器用于拾取算法中,用于计算所选选择模式的形状选择基元。
IVtkVtk 封装
IVtkVTK包包含依赖于 VTK 的类的实现:
- IVtkVTK_ShapeData – 为 VTK 多数据实现IVtk_IShapeData接口。此类还存储与子形状 ID 和子形状网格类型IVtk_MeshType(自由顶点、共享顶点、自由边、边界边、共享边、线框面或阴影面)相关的信息。此信息存储在单元格的 VTK 数据数组中。
- IVtkVTK_View –为 VTK 查看器实现IVtk_IView接口。该实现类用于将IVtkOCC_ViewerSelector连接到 VTK 渲染器。
IVtkTools 包
IVtkTools包为您提供了一个现成的算法工具箱,有助于将 OCCT 形状集成到 VTK 的可视化管道中。这个包包含以下类:
- IVtkTools_ShapeDataSource – OCCT 形状的 VTK 多边形数据源。它继承了 vtkPolyDataAlgorithm类,并为可视化管道提供了 OCCT 形状的多面表示。
- IVtkTools_ShapeObject – OCCT 形状的辅助包装类,通过 VTK 信息键将它们传递给管道。
- IVtkTools_ShapePicker – 形状演员的 VTK 选择器。内部使用 OCCT 选择算法。
- IVtkTools_DisplayModeFilter – VTK 过滤器,用于根据给定的显示模式IVtk_DisplayMode(线框或阴影)提取特定网格类型的单元格
- IVtkTools_SubPolyDataFilter – VTK 过滤器,用于提取对应于给定子形状 ID 集的单元格。
此外,IVtkTools包包含IVtkTools命名空间中的辅助方法。例如,有一个方便的函数填充vtkLookupTable实例来设置颜色方案,以便更好地可视化子形状。
使用高级 API(简单场景)
VTK 查看器中的 OCCT 形状演示
要在 VTK 查看器中可视化 OCCT 拓扑形状,需要执行以下步骤:
- 创建IVtkOCC_Shape实例(OCCT 形状的 VIS 包装器)并使用包含实际几何图形的TopoDS_Shape对象对其进行初始化:
TopoDS_Shape aShape;// 初始化 aShape 变量:例如从 BREP 文件中加载它
- 为目标 OCCT 拓扑形状创建 VTK 多边形数据源,并使用创建的IVtkOCC_Shape实例对其进行初始化。在这个阶段,分面器被隐式插入:
vtkSmartPointer<IVtkTools_ShapeDataSource> DS = vtkSmartPointer<IVtkTools_ShapeDataSource>::New();DS->SetShape(aShapeImpl);
- 以通常的 VTK 方式可视化加载的形状,从新创建的特定源开始管道:
vtkSmartPointer<vtkPolyDataMapper> Mapper = vtkSmartPointer<vtkPolyDataMapper>::New();Mapper->SetInputConnection(aDS->GetOutputPort());vtkSmartPointer<vtkActor> Actor = vtkSmartPointer<vtkActor>::New();Actor->SetMapper(Mapper);
始终可以通过IVtkTools_ShapeObject类的专用方法从 VTK 演员访问形状数据源:
也可以从形状数据源获取形状包装器:
配色方案
默认 OCCT 配色方案
要根据默认的 OCCT 配色方案为形状的不同部分着色,可以使用IVtkTools命名空间的专用辅助功能配置相应的 VTK 映射器:
可以通过以下方法获取具有默认 OCCT 颜色方案的vtkLookupTable 类的实例:
自定义配色方案
要为形状表示设置特定于应用程序的颜色,请使用InitShapeMapper函数和传递自定义查找表的附加参数:
为子形状设置自定义颜色
也可以将自定义颜色绑定到IVtk_MeshType枚举中列出的任何子形状类型。例如,要访问绑定到自由边缘实体的颜色, IVtkTools命名空间中可以使用以下调用:
这里R、G、B是 [0, 1] 范围内颜色的红色、绿色和蓝色分量的双值。可选参数A代表相同范围 [0, 1] 中的双精度值(不透明度)。默认情况下,alpha 值为 1,即颜色不透明。
使用映射器的配色方案
由于 VTK 颜色映射方法基于将标量数据数组与 VTK 单元相关联,因此可以通过以下方式打开/关闭形状组件的着色:
例如,可以禁用基于标量的着色以将单一颜色绑定到表示形状的整个 VTK 角色。
显示模式
形状数据源的输出可以线框或阴影显示方式呈现。可以应用IVtkTools_DisplayModeFilter类中的特定过滤器来选择显示模式。过滤器仅通过与给定模式对应的单元格。可用模式集由IVtk_DisplayMode枚举定义。
例如,可以通过以下方式获得阴影表示:
默认情况下,显示模式过滤器以线框模式工作。
提示:要使着色表示平滑,请使用附加的 vtkPolyDataNormals过滤器。此过滤器必须在显示模式过滤器之后应用。
交互式选择
IVtkTools包提供IVtkTools_ShapePicker类,用于在 VTK 查看器中选择 OCCT 形状和子形状并访问拾取结果。IVtkTools_ShapePicker工具的典型用法包括以下操作序列:
- 创建一个选择器并将其渲染器设置为您的活动 VTK 渲染器:
vtkSmartPointer<IVtkTools_ShapePicker> aPicker = vtkSmartPointer<IVtkTools_ShapePicker>::New();aPicker->SetRenderer(aRenderer);
- 通过从IVtk_SelectionMode枚举中选择相应的子形状类型来激活所需的选择模式。例如,以下调用允许在渲染器的所有可选形状actors上选择边缘:
aPicker->SetSelectionMode(SM_Edge);
如果需要限制特定形状 Actor 的选择,可以使用提到的SetSelectionMode方法,将IVtk_IShape句柄或vtkActor指针作为第一个参数:
aPicker->SetSelectionMode(aShape, SM_Edge); // 如果形状句柄可用aPicker->SetSelectionMode(anActor, SM_Edge); // 如果形状actor可用一个选择器的不同选择模式可以同时独立地打开/关闭。
aPicker->SetSelectionMode(SM_Edge);aPicker->SetSelectionMode(SM_Face);要关闭选择模式,请使用带有false值的附加可选布尔参数,例如:
aPicker->SetSelectionMode(aShape, SM_Edge, false ); - 调用Pick方法传递鼠标显示坐标:
默认使用第 1 步中传入的渲染器。为了对另一个渲染器执行挑选操作,可以指定一个额外的可选参数:
- 获取顶级选择结果作为选择的 VTK Actor 的集合:
vtkActorCollection* anActorCollection = aPicker->GetPickedActors();
或作为选取的形状 ID 的集合:
默认情况下,这些方法返回单个顶部选取的演员或形状。要获得所有挑选的演员或形状,有必要在可选的布尔参数中发送“真”值:
anActorCollection = aPicker->GetPickedActors( true ); - 获取选取的子形状 ID:
IVtk_ShapeIdList subShapeIds = aPicker->GetPickedSubShapesIds(shapeId);
此方法还返回顶级拾取子形状的单个 ID,并具有相同的可选布尔参数来获取形状的所有拾取子形状:
subShapeIds = aPicker->GetPickedSubShapesIds(shapeId, true );
应该注意的是,创建一个唯一的选取器实例并只向渲染器提供一次会更有效。问题是每次渲染器或其某些参数发生更改时,拾取算法都会执行内部计算。因此,尽量减少此类更新的数量是有意义的。
OCCT 拾取算法IVtkTools_ShapePicker每次更改视图的某些参数时都会计算一个新的变换矩阵来构建投影。同样,一旦在SetSelectionMode方法中为此形状打开了适当的选择模式,就会为每种选择模式构建形状选择基元。
警告:VIS 选择器本质上是在初始拓扑数据结构上工作,而不是在实际可视化的参与者上工作。这种特性使 VIS 可以利用标准的 OCCT 选择机制,但对相应的可视化管道施加了严格的限制。一旦构建,刻面形状表示无论如何都不应变形或平移。否则,拾取结果将失去与源几何体的关联性。例如,您永远不应该使用vtkTransform过滤器,而应该在初始模型上应用 OCCT 等距变换,以便在已经重新定位的方面上工作。对于 CAD 可视化,这些限制通常是可以接受的。如果没有,请考虑使用自定义 VTK 样式的选择器来处理实际可视化的演员。
子形状的选择
IVtkTools_SubPolyDataFilter是一个方便的 VTK 过滤器类,它允许提取与初始形状的子形状相对应的多边形单元。它可用于使用来自IVTkTools_ShapePicker工具的选择结果从输入的vtkPolyData对象生成vtkPolyData对象。
例如,子形状可以通过以下方式在 VTK 查看器中表示:
使用低级 API(高级场景)
形状展示
在IVtkTools的实用程序不够用的情况下,使用低级工具是合理的。
VTK pipeline中VIS使用的底层场景如下图所示。Mesher 组件使用IShapeData接口的实现来生成形状刻面(VTK 多边形数据) 。然后可以从这个实现中检索结果作为vtkPolyData实例。
420
OCCT 形状表示的可视化管道可以初始化如下:
- 创建一个由 OCCT 拓扑形状初始化的IShape类的实例:
- 为 VTK 创建一个 IShapeData 实现的空实例:
3. 为 OCCT 创建一个IShapeMesher实现的实例(在此阶段可以使用任何 faceter):
4 .使用 Mesher 对 OCCT 拓扑形状进行三角剖分并访问结果:
aMesher->Build (aShapeImpl, aDataImpl);;vtkPolyData* aPolyData = aDataImpl->GetVtkPolyData();
生成的vtkPolyData实例可用于初始化 VTK 管道。IVtkVTK_ShapeData对象用于保持和通过管道传递子形状、它们的网格类型和生成的网格单元之间的映射。它将每个生成的单元格的子形状 ID 和网格类型存储在 VTK 数据数组中。结果,生成的 VTK 单元填充了以下数据数组:
- SUBSHAPE_IDS – vtkIdTypeArray类型的数组。它包含为相应单元格生成的形状 ID。该数组的名称在IVtkVTK_ShapeData类的ARRNAME_SUBSHAPE_IDS常量中定义。
- MESH_TYPES – vtkShortArray 类型的数组。它包含为其生成相应单元格的形状部件的类型标签。该数组的名称在IVtkVTK_ShapeData类的ARRNAME_MESH_TYPES常量中定义。
OCCT拣选算法的使用
可以使用拾取算法IVtk_IShapePickerAlgo的实例创建自定义 VTK 拾取器,用于交互式选择 OCCT 3D 形状。
挑选算法使用查看器选择器(OCCT 术语)的实例,它管理挑选以及选择模式的激活和停用。VIS 组件在IVtkOCC_ShapePickerAlgo和IVtkOCC_ViewerSelector类中实现了 OCCT 选择原理。IVtkOCC_ViewerSelector是一个内部类,它实现了应用于IVtkVTK_View的 OCCT 选择机制。
IVtkOCC_ShapePickerAlgo必须用于激活/停用形状IVtk_IShape的选择模式。IVtkOCC_ShapePickerAlgo是IVtk_IShapePickerAlgo接口的实现。
IVtk_IShapePickerAlgo的典型用法包括以下操作序列:
- 创建选择器类的实例:
- 将IVtk_IView类的实例设置为算法以定义查看器参数:
Picker->SetView(View);
- 使用IVtk_SelectionMode枚举中的值激活所需的选择模式。例如,以下调用允许选择边:
TopoDS_Shape aShape;// 在变量 a Shape 中加载或创建一个 TopoDS_Shape……myOccPickerAlgo->SetSelectionMode(occShape, SM_Edge);
一个选择器的不同选择模式可以同时独立地打开/关闭。要关闭选择模式,请使用带有false值的附加可选布尔参数,例如:
myOccPickerAlgo->SetSelectionMode(occShape, SM_Edge, false ); - 调用Pick方法传递鼠标坐标:
- 获取顶级拾取结果作为拾取的顶级形状的 ID:
- 获取选取的子形状的 ID:
IVtk_ShapeIdList subShapeIds= myOccPickerAlgo->SubShapesPicked(shapeId);
DRAW 测试线束
TKIVtkDraw工具包包含用于将 VIS 功能嵌入到 DRAW 测试工具中的类,具有简单交互的可能性,包括检测和突出显示。
- IVtkDraw_HighlightAndSelectionPipeline – 使用 OCCT 形状数据源和正确初始化的 VIS 过滤器创建 VTK 管道。
- IVtkDraw_Interactor – 控制简单的交互动作,例如检测和选择显示的形状。
暂无评论内容