OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)

介绍

VIS组件通过VTK库为OCCT拓扑形状的可视化提供适配功能。本用户指南描述了如何在基于 VTK 库的 3D 可视化应用程序中应用 VIS 类。

图片[1]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

基于VTK库的3D可视化

在应用程序中有两种使用 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 可视化管道的高级工具。
图片[2]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

VIS包的依赖

所提到的包组织背后的想法是通过它们对特定库(OCCT,VTK)的依赖关系,将接口与其实际实现分离。除了提供语义分离之外,这种分离还有助于避免对其他 OCCT 工具包和 VTK 的过度依赖。

  • IVtk包根本不依赖 VTK 库,仅因为使用了集合而需要 OCCT 库(TKernel库);
  • IVtkOCC包中的实现类仅依赖于 OCCT 库,不需要 VTK;
  • IVtkVTK包仅依赖于 VTK 库,不需要任何 OCCT 功能,除了集合。
图片[3]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

VIS包的依赖

基本上,使用最终用户应用程序中的前三个包(IVtk、IVtkOCCIVtkVTK)就足以在 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_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 的类的实现:

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 拓扑形状,需要执行以下步骤:

  1. 创建IVtkOCC_Shape实例(OCCT 形状的 VIS 包装器)并使用包含实际几何图形的TopoDS_Shape对象对其进行初始化:
    TopoDS_Shape aShape;
    // 初始化 aShape 变量:例如从 BREP 文件中加载它
    IVtkOCC_Shape::Handle aShapeImpl = new IVtkOCC_Shape (aShape);
  2. 为目标 OCCT 拓扑形状创建 VTK 多边形数据源,并使用创建的IVtkOCC_Shape实例对其进行初始化。在这个阶段,分面器被隐式插入:
    vtkSmartPointer<IVtkTools_ShapeDataSource> DS = vtkSmartPointer<IVtkTools_ShapeDataSource>::New();
    DS->SetShape(aShapeImpl);
  3. 以通常的 VTK 方式可视化加载的形状,从新创建的特定源开始管道:
    vtkSmartPointer<vtkPolyDataMapper> Mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    Mapper->SetInputConnection(aDS->GetOutputPort());
    vtkSmartPointer<vtkActor> Actor = vtkSmartPointer<vtkActor>::New();
    Actor->SetMapper(Mapper);

始终可以通过IVtkTools_ShapeObject类的专用方法从 VTK 演员访问形状数据源:

也可以从形状数据源获取形状包装器:

IVtkOCC_Shape::Handle occShape = DS-> GetShape ();

配色方案

默认 OCCT 配色方案

要根据默认的 OCCT 配色方案为形状的不同部分着色,可以使用IVtkTools命名空间的专用辅助功能配置相应的 VTK 映射器:

可以通过以下方法获取具有默认 OCCT 颜色方案的vtkLookupTable 类的实例:

vtkSmartPointer<vtkLookupTable> Table = IVtkTools::InitLookupTable ();

自定义配色方案

要为形状表示设置特定于应用程序的颜色,请使用InitShapeMapper函数和传递自定义查找表的附加参数:

IVtkTools::InitShapeMapper(Mapper, Table);

为子形状设置自定义颜色

也可以将自定义颜色绑定到IVtk_MeshType枚举中列出的任何子形状类型。例如,要访问绑定到自由边缘实体的颜色, IVtkTools命名空间中可以使用以下调用:

SetLookupTableColor (aLookupTable, MT_FreeEdge, R, G, B);
SetLookupTableColor (aLookupTable, MT_FreeEdge, R, G, B, A);
GetLookupTableColor (aLookupTable, MT_FreeEdge, R, G, B);
GetLookupTableColor (aLookupTable, MT_FreeEdge, R, G, B, A);

这里R、G、B是 [0, 1] 范围内颜色的红色、绿色和蓝色分量的双值。可选参数A代表相同范围 [0, 1] 中的双精度值(不透明度)。默认情况下,alpha 值为 1,即颜色不透明。

使用映射器的配色方案

由于 VTK 颜色映射方法基于将标量数据数组与 VTK 单元相关联,因此可以通过以下方式打开/关闭形状组件的着色:

Mapper->ScalarVisibilityOn(); // 使用查找表中的颜色
Mapper>ScalarVisibilityOff(); // 使用actor属性的颜色

例如,可以禁用基于标量的着色以将单一颜色绑定到表示形状的整个 VTK 角色。

显示模式

形状数据源的输出可以线框或阴影显示方式呈现。可以应用IVtkTools_DisplayModeFilter类中的特定过滤器来选择显示模式。过滤器仅通过与给定模式对应的单元格。可用模式集由IVtk_DisplayMode枚举定义。

图片[4]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

例如,可以通过以下方式获得阴影表示:

vtkSmartPointer<IVtkTools_ShapeDataSource> DS = vtkSmartPointer<IVtkTools_ShapeDataSource>::New();
vtkSmartPointer<IVtkTools_DisplayModeFilter> DMFilter = vtkSmartPointer<IVtkTools_DisplayModeFilter>::New();
DMFilter->AddInputConnection(DS->GetOutputPort());
DMFilter->SetDisplayMode(DM_Shading);
vtkSmartPointer<vtkDataSetMapper> M = vtkSmartPointer<vtkDataSetMapper>::New();
M->SetInputConnection(DMFilter->GetOutputPort());

默认情况下,显示模式过滤器以线框模式工作。

提示:要使着色表示平滑,请使用附加的 vtkPolyDataNormals过滤器。此过滤器必须在显示模式过滤器之后应用。

图片[5]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

交互式选择

IVtkTools包提供IVtkTools_ShapePicker类,用于在 VTK 查看器中选择 OCCT 形状和子形状并访问拾取结果。IVtkTools_ShapePicker工具的典型用法包括以下操作序列:

  1. 创建一个选择器并将其渲染器设置为您的活动 VTK 渲染器:
    vtkSmartPointer<IVtkTools_ShapePicker> aPicker = vtkSmartPointer<IVtkTools_ShapePicker>::New();
    aPicker->SetRenderer(aRenderer);
  2. 通过从IVtk_SelectionMode枚举中选择相应的子形状类型来激活所需的选择模式。例如,以下调用允许在渲染器的所有可选形状actors上选择边缘:
    aPicker->SetSelectionMode(SM_Edge);

    如果需要限制特定形状 Actor 的选择,可以使用提到的SetSelectionMode方法,将IVtk_IShape句柄或vtkActor指针作为第一个参数:

    IVtk_IShape::Handle aShape = new IVtkOCC_Shape (occShape);
    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 );
  3. 调用Pick方法传递鼠标显示坐标:
    aPicker->Pick( x , y , 0);

    默认使用第 1 步中传入的渲染器。为了对另一个渲染器执行挑选操作,可以指定一个额外的可选参数:

    aPicker->Pick( x , y , 0, aRenderer);
  4. 获取顶级选择结果作为选择的 VTK Actor 的集合:
    vtkActorCollection* anActorCollection = aPicker->GetPickedActors();

    或作为选取的形状 ID 的集合:

    IVtk_ShapeIdList ids = aPicker->GetPickedShapesIds();

    默认情况下,这些方法返回单个顶部选取的演员或形状。要获得所有挑选的演员或形状,有必要在可选的布尔参数中发送“真”值:

    anActorCollection = aPicker->GetPickedActors( true );
    ids = aPicker->GetPickedShapesIds( true );
  5. 获取选取的子形状 ID:
    IVtk_ShapeIdList subShapeIds = aPicker->GetPickedSubShapesIds(shapeId);

    此方法还返回顶级拾取子形状的单个 ID,并具有相同的可选布尔参数来获取形状的所有拾取子形状:

    subShapeIds = aPicker->GetPickedSubShapesIds(shapeId, true );

应该注意的是,创建一个唯一的选取器实例并只向渲染器提供一次会更有效。问题是每次渲染器或其某些参数发生更改时,拾取算法都会执行内部计算。因此,尽量减少此类更新的数量是有意义的。

OCCT 拾取算法IVtkTools_ShapePicker每次更改视图的某些参数时都会计算一个新的变换矩阵来构建投影。同样,一旦在SetSelectionMode方法中为此形状打开了适当的选择模式,就会为每种选择模式构建形状选择基元。

警告:VIS 选择器本质上是在初始拓扑数据结构上工作,而不是在实际可视化的参与者上工作。这种特性使 VIS 可以利用标准的 OCCT 选择机制,但对相应的可视化管道施加了严格的限制。一旦构建,刻面形状表示无论如何都不应变形或平移。否则,拾取结果将失去与源几何体的关联性。例如,您永远不应该使用vtkTransform过滤器,而应该在初始模型上应用 OCCT 等距变换,以便在已经重新定位的方面上工作。对于 CAD 可视化,这些限制通常是可以接受的。如果没有,请考虑使用自定义 VTK 样式的选择器来处理实际可视化的演员。

图片[6]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

子形状的选择

IVtkTools_SubPolyDataFilter是一个方便的 VTK 过滤器类,它允许提取与初始形状的子形状相对应的多边形单元。它可用于使用来自IVTkTools_ShapePicker工具的选择结果从输入的vtkPolyData对象生成vtkPolyData对象。

例如,子形状可以通过以下方式在 VTK 查看器中表示:

// 将形状加载到数据源中(参见 3.1)
vtkSmartPointer< IVtkTools_ShapeDataSource > DS = vtkSmartPointer<IVtkTools_ShapeDataSource>::New();
DS-> SetShape (shapeImpl);
// 为子形状过滤创建一个新的 sub-polydata 过滤器
vtkSmartPointer< IVtkTools_SubPolyDataFilter > subShapesFilter = IVtkTools_SubPolyDataFilter::New();
// 将形状源设置为 sub-polydata 过滤器的输入
subShapesFilter->SetInputConnection(DS->GetOutputPort());
// 从选取器中获取形状的所有选取的子形状 id(参见 3.4)
IVtk_ShapeIdList subShapeIds = aPicker->GetPickedSubShapesIds(ds->GetId(), true );
// 将 ids 设置为过滤器以仅通过选取的子形状
subShapesFilter-> SetData (subShapeIds);
subShapesFilter->Modified();
// 将结果输出到映射器
vtkSmartPointer<vtkPolyDataMapper> aMapper = vtkPolyDataMapper::New();
aMapper->AddInputConnection(subShapesFilter->GetOutputPort());

使用低级 API(高级场景)

形状展示

在IVtkTools的实用程序不够用的情况下,使用低级工具是合理的。

VTK pipeline中VIS使用的底层场景如下图所示。Mesher 组件使用IShapeData接口的实现来生成形状刻面(VTK 多边形数据) 。然后可以从这个实现中检索结果作为vtkPolyData实例。

图片[7]-OpenCasCade官方开发文档翻译(8)–VTK 集成服务 (VIS)-卡核

使用 VTK 的低级 VIS 使用

420

OCCT 形状表示的可视化管道可以初始化如下:

  1. 创建一个由 OCCT 拓扑形状初始化的IShape类的实例:
    TopoDS_Shape aShape;
    // 在变量 a Shape 中加载或创建一个 TopoDS_Shape
    IVtkOCC_Shape::Handle aShapeImpl = new IVtkOCC_Shape (aShape);
  2. 为 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_ShapePickerAlgoIVtkOCC_ViewerSelector类中实现了 OCCT 选择原理。IVtkOCC_ViewerSelector是一个内部类,它实现了应用于IVtkVTK_View的 OCCT 选择机制。

IVtkOCC_ShapePickerAlgo必须用于激活/停用形状IVtk_IShape的选择模式。IVtkOCC_ShapePickerAlgoIVtk_IShapePickerAlgo接口的实现。

IVtk_IShapePickerAlgo的典型用法包括以下操作序列:

  1. 创建选择器类的实例:
  2. 将IVtk_IView类的实例设置为算法以定义查看器参数:
    IVtkVTK_View::Handle View = new IVtkVTK_View (Renderer);
    Picker->SetView(View);
  3. 使用IVtk_SelectionMode枚举中的值激活所需的选择模式。例如,以下调用允许选择边:
    TopoDS_Shape aShape;
    // 在变量 a Shape 中加载或创建一个 TopoDS_Shape
    IVtk_IShape::Handle shapeImpl = new IVtkOCC_Shape (aShape);
    myOccPickerAlgo->SetSelectionMode(occShape, SM_Edge);

    一个选择器的不同选择模式可以同时独立地打开/关闭。要关闭选择模式,请使用带有false值的附加可选布尔参数,例如:

    myOccPickerAlgo->SetSelectionMode(occShape, SM_Edge, false );
  4. 调用Pick方法传递鼠标坐标:
    myOccPickerAlgo->Pick( x , y );
  5. 获取顶级拾取结果作为拾取的顶级形状的 ID:
    IVtk_ShapeIdList ids = myOccPickerAlgo->ShapesPicked();
  6. 获取选取的子形状的 ID:
    IVtk_ShapeIdList subShapeIds
    = myOccPickerAlgo->SubShapesPicked(shapeId);

DRAW 测试线束

TKIVtkDraw工具包包含用于将 VIS 功能嵌入到 DRAW 测试工具中的类,具有简单交互的可能性,包括检测和突出显示。

© 版权声明
THE END
喜欢就支持一下吧
点赞2.1W+ 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容