OCCT 实战(4)基础类 | 4.4、AIS_InteractiveObject 类


前言:

AIS_InteractiveObject 是 OCCT 中用于可视化交互的核心类之一,属于 AIS(Application Interactive Services)模块。它代表一个可以在 3D 视图中显示并与用户交互的几何或拓扑对象(如点、线、面、体等),是所有可交互显示对象的基类。

一、AIS_InteractiveObject

1、核心功能

  • 可视化显示:将底层的 TopoDS_Shape 或自定义几何数据以图形方式渲染到 3D 视图中。
  • 交互支持:支持选择(Selection)、高亮(Highlighting)、动态更新(Dynamic Update)等交互操作。
  • 显示模式管理:支持多种显示模式(Display Mode),例如线框(Wireframe)、着色(Shaded)、带边界着色(Shaded with edges)等。
  • 属性定制:可设置颜色、透明度、线宽、材质等视觉属性。
  • 选择机制集成:与 OCCT 的选择服务(Selection Services)集成,支持通过鼠标点击选中对象。

2、工作原理

AIS_InteractiveObject主要负责将底层几何/拓扑数据(如 TopoDS_Shape)与 3D 图形显示、用户交互(如选择、高亮)桥接起来。

2.1、核心设计逻辑

AIS_InteractiveObject的本质是数据封装+接口标准化

  • 封装层:将几何数据(如拓扑形状、点、文本)与交互属性(颜色、显示模式、选择优先级)绑定;
  • 接口层:定义标准化的渲染、选择、模式校验接口,由子类(如AIS_ShapeAIS_Text)实现具体逻辑;
  • 联动层:通过AIS_InteractiveContext(场景上下文)管理生命周期,完成渲染、选择、操纵的调度。

2.2、核心工作流程(与AIS上下文联动)

AIS_InteractiveObject无法独立工作,必须依附AIS_InteractiveContext(场景上下文),完整流程如下:

  • 初始化并注册对象
    • 开发者创建AIS_IO子类实例(如AIS_Shape),绑定几何数据(如TopoDS_Shape);
    • 通过AIS_InteractiveContext::Display(aisObj)将对象注册到场景上下文,上下文接管对象的生命周期。
  • 显示模式校验(AcceptDisplayMode)
    • 上下文调用AcceptDisplayMode(theMode),判定对象是否支持指定显示模式(如着色AIS_Shaded、线框AIS_WireFrame);
    • 若返回false,则拒绝显示该模式;若返回true,进入渲染阶段。
  • 可视化渲染(Compute)
    • 上下文调用Compute()接口,触发子类生成GPU可渲染的图元数据(如Graphic3d_ArrayOfTrianglesGraphic3d_ArrayOfSegments);
    • 渲染数据存入Prs3d_Presentation容器,由PrsMgr_PresentationManager3d(渲染管理器)提交到Graphic3d_Structure,最终在V3d_View中绘制;
    • 触发时机:首次显示、显示模式切换、几何数据修改后Redisplay()
  • 交互选择(ComputeSelection)
    • 鼠标点击/框选时,上下文调用ComputeSelection()接口,子类生成选择敏感区域(如Select3D_SensitiveFaceSelect3D_SensitiveEdge);
    • 上下文通过SelectMgr_SelectionManager检测鼠标坐标是否命中敏感区域,若命中则标记对象为“选中”,并触发高亮/操纵逻辑;
    • 核心:选择逻辑与渲染逻辑分离,可自定义选择优先级、敏感区域(如仅允许选面,不允许选边)。
  • 动态更新
    • 几何数据修改后,调用AIS_InteractiveContext::Redisplay(aisObj),上下文重新调用Compute()生成新渲染数据,实现重绘;
    • 选择模式切换时,重新调用ComputeSelection()生成对应敏感区域,适配不同选择规则。

2.3、关键依赖与联动对象

AIS_InteractiveObject的工作依赖以下核心组件,形成完整闭环:

组件作用
AIS_InteractiveContext场景上下文,调度AIS_IO的显示/选择/更新
Prs3d_Presentation渲染容器,存储Compute生成的图元数据
SelectMgr_Selection选择容器,存储ComputeSelection生成的敏感区域
V3d_View3D视图,最终渲染载体

3、核心接口

AIS_InteractiveObject本质是OCCT为3D交互对象制定的标准化协议,子类只需实现Compute(画什么)、ComputeSelection(选哪里)、AcceptDisplayMode(支持哪些模式),即可快速适配AIS框架的渲染与交互能力。以下是 ComputeComputeSelectionAcceptDisplayMode 三个接口的详细作用及各参数含义:

3.1、Compute

函数签名(典型重载):
virtual void Compute(
    const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
    const Handle(Prs3d_Presentation)& aPresentation,
    const Standard_Integer aMode
);
作用:

用于生成对象在指定显示模式(display mode)下的图形表示(即“呈现”)。每当视图需要绘制该对象时(如初次显示、刷新、切换显示模式等),系统会调用此方法。

参数说明:
  • aPresentationManager:表示当前的呈现管理器,可用于触发子对象的更新或协调多个呈现之间的关系(一般在复杂场景中使用)。

  • aPresentation:是一个图形呈现容器,开发者需将几何图元(如线、面、点等)通过 Prs3d_Drawer 或直接添加到此对象中,最终由 OCCT 渲染引擎绘制。

  • aModeStandard_Integer):指定当前请求的显示模式编号。常用值包括:

    • 0:线框模式(Wireframe)
    • 1:着色模式(Shaded)
    • 其他自定义模式(如 2 表示带尺寸标注的模式等)

注意Compute 可能被多次调用(不同 aMode),应避免重复计算,可缓存几何数据。

3.2. ComputeSelection

函数签名:
virtual void ComputeSelection(
    const Handle(SelectMgr_Selection)& aSelection,
    const Standard_Integer aMode
);
作用:

用于构建对象在指定选择模式(selection mode)下的可拾取图元(sensitive entities)。这些图元定义了用户在 3D 视图中点击时哪些部分可以被选中。

参数说明:
  • aSelection:是一个选择集合容器,开发者需将 Select3D_SensitiveEntity 的派生类(如 SensitivePointSensitiveCurveSensitiveFace 等)添加到其中。

  • aModeStandard_Integer):表示选择模式编号,与显示模式独立。常见约定:

    • 0:选择整个对象(默认)
    • 1:选择顶点(vertices)
    • 2:选择边(edges)
    • 3:选择面(faces)
    • 更高编号可用于自定义逻辑(如选择孔、特征等)

提示:选择模式由应用层通过 AIS_InteractiveContext::SetSelectionMode() 激活。

3.3. AcceptDisplayMode

函数签名:
virtual Standard_Boolean AcceptDisplayMode(
    const Standard_Integer aMode
) const;
作用:

判断当前对象是否支持指定的显示模式。若返回 Standard_True,则允许使用该模式;否则系统将忽略该模式的 Compute 调用。

参数说明:
  • aModeStandard_Integer) :待检测的显示模式编号(与 Compute 中的 aMode 含义相同)。
返回值:
  • Standard_True:支持该显示模式。
  • Standard_False:不支持。
典型用途:
  • 限制对象仅以线框方式显示(如辅助线、坐标轴等):
    return (aMode == 0); // 只接受模式 0
    
  • 避免为不相关的显示模式生成无效图形,提升性能。

通过合理实现这三个接口,开发者可以完全控制自定义交互对象的外观表现交互选择行为显示逻辑,是 OCCT 可视化开发的核心机制之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值