OCCT使用指南:Visualization

1、介绍

        一方面,存储要显示和选择的实体的几何图形和拓扑的数据;另一方面,它的呈现(当对象显示在场景中时所看到的内容)和选择(交互选择整个对象或其子部分以将应用程序定义的操作应用于选定实体的可能性).演示文稿通过演示文稿组件进行管理,选择通过选择组件进行管理。

        应用程序交互服务(AIS)提供了在应用程序GUI查看器和用于管理选择和演示的包之间创建链接的方法,这使得在3D中对这些功能的管理更加直观,从而更加透明。

        AIS使用交互式对象的概念,这是一个可显示和可选择的实体,表示应用程序数据中的一个元素。因此,在3D中,用户无需熟悉AIS的任何底层功能,除非您想创建自己的交互式对象或选择过滤器。

        然而,如果您需要除提供的交互对象和过滤器之外的其他类型的交互对象,则需要了解可呈现和可选择对象的机制,特别是如何实现它们的虚拟功能。要做到这一点,需要熟悉敏感原语和可呈现对象等基本概念。

        以下软件包用于显示三维对象:AIS;StdPrs;Prs3d;PrsMgr;V3d;Graphic3d.用于显示3D对象的包也适用于2D对象的可视化。 

        下图简要介绍了可视化中关键概念和包之间的关系。当然,“Geometry&Topology”只是AIS可以处理的应用程序数据的一个例子,特定于应用程序的交互对象可以处理任何类型的数据。

OCCT使用指南:Visualization_第1张图片

2、基本概念

2.1、演示

        表示服务与数据是分离的,它们所代表的数据是由应用算法生成的。此划分允许您在不修改可视化服务的情况下修改几何或拓扑算法及其结果对象。

        演示文稿结构

        在屏幕上显示对象涉及三种实体:一个可呈现的对象,AIS_InteractiveObject;viewr;交互式上下文AIS_InteractiveContext。

        可展示的对象

        可呈现对象的目的是以Graphic3d结构的形式提供对象的图形表示。在第一次显示请求时,它通过调用适当的算法并保留此框架以供进一步显示来创建此结构。

        StdPrs和Prs3d软件包中提供了标准表示算法。然而,您可以编写自己的特定演示算法,前提是它们可以创建由Graphic3d包中的结构制成的演示。您还可以为单个可显示对象创建多个显示:应用程序支持的每个可视化模式都有一个。

        要单独呈现的每个对象都必须是可呈现的或与可呈现对象相关联。

        viewer

        viewer允许以交互方式操纵对象的视图。缩放、平移或旋转视图时,查看器操作的是可显示对象创建的图形结构,而不是应用程序的数据模型。在演示算法中创建Graphic3d结构,可以使用Open CASCADE Technology中提供的3D查看器进行3D可视化。

        交互式上下文

        交互式上下文通过公共高级API控制整个演示过程。当应用程序请求显示对象时,交互式上下文从可呈现对象请求图形结构,并将其发送给查看器进行显示。

        演示文稿包

        演示至少涉及AIS、PrsMgr、StdPrs和V3d软件包。如果您需要实现自己的表示算法,则可以使用其他包,如Prs3d和Graphic3d。

        AIS(Active IS)是一个交互式绘图模块,用于创建和管理交互式绘图对象。

        StdPrs(Standard Presentation)是OCCT的一个模块,用于创建和管理标准化的图形表示。它提供了一组通用的图形对象和操作,用于创建和编辑各种类型的图形表示。

        Prs3d(Presentation 3D)是OCCT的一个模块,用于创建和管理三维图形表示。它提供了一组用于创建和编辑三维模型、场景、视图和渲染的图形对象和操作。

        PrsMgr(Presentation Manager)是OCCT的一个模块,用于管理交互式绘图和三维图形表示的创建、编辑和渲染。它提供了一组用于创建、编辑和操作图形对象的通用接口和功能。

        V3d(View 3D)是OCCT的一个模块,用于创建和管理三维视图表示。它提供了一组用于创建和编辑三维视图、场景和渲染的图形对象和操作。

        Graphic3d是OCCT的一个模块,用于提供三维图形渲染功能。它提供了一组用于渲染三维模型、场景和视图的功能,包括光照、材质、阴影、透明度等效果。

        DsgPrs包提供了显示尺寸、关系和XYZ三面体的工具。

2.2、选择

        标准OCCT选择算法由两部分表示:动态和静态。动态选择会使对象在鼠标光标移动时自动高亮显示。静态选择允许拾取特定对象以进行进一步处理。

        有3种不同的选择类型:点选择–允许拾取和高亮显示位于鼠标光标下的单个对象(或其部分);矩形选择–允许拾取位于由鼠标开始和结束光标位置定义的矩形下的对象或零件;多段线选择–允许拾取位于用户定义的非自相交多段线下的对象或零件。

        对于OCCT选择算法,所有可选择的对象都表示为一组敏感区域,称为敏感实体。当鼠标光标在视图中移动时,将分析每个对象的敏感实体是否发生碰撞。

        术语和概念

        本节介绍在整个算法描述中使用的基本术语和概念。敏感实体:与实体所有者一样,敏感实体也是对象和选择机制之间的链接。实体的目的是定义对象的哪些部分可以特别选择。因此,任何可选择的对象都必须拆分为敏感实体(一个或多个)。例如,若要将面选择应用于对象,需要将其分解为面,并将其用于创建敏感图元集。

OCCT使用指南:Visualization_第2张图片

        根据用户的需要,敏感实体可能是原子实体(点或边)或复杂实体。复杂实体包含许多子元素,检测机制可以以类似的方式处理这些子元素(例如,存储为一组线段或三角测量的多段线)。

        实体被用作选择算法的内部单元,不包含任何拓扑数据,因此它们有一个到维护拓扑特定方法的上层接口的链接。

        实体所有者:每个敏感实体都存储对其所有者的引用,该所有者是连接实体和相应可选对象的类。此外,所有者可以存储任何附加信息,例如,敏感实体的拓扑形状、高亮显示颜色和方法,或者是否选择了实体。

        选择:为了简化对对象不同选择模式的处理,将链接到其所有者的敏感实体组织到集合中,称为选择。每个选择都包含为特定模式创建的实体以及敏感度和更新状态。

        可选择对象:可选择对象存储有关所有创建的选择模式和敏感实体的信息。可选对象的所有后续对象都必须实现根据给定模式将其表示拆分为敏感实体的方法。计算的实体排列在一个选择中,并添加到此对象的所有选择的列表中。在永久删除对象之前,不会从列表中删除任何选择。

        对于所有标准OCCT形状,零模式应该选择整个对象(但在自定义对象中可以很容易地重新定义)。例如,标准OCCT选择机制和AIS_Shape确定以下模式(请参见AIS_Shape::SelectionMode()):0–选择整个对象*(AIS_Shape)*;1–顶点的选择(TopAbs_VERTEX);2–边的选择(TopAbs_EDGE);3–导线的选择(TopAbs_WIRE);4–面的选择(TopAbs_FACE);5–外壳的选择(TopAbs_SHELL);6–成分固体的选择(TopAbs_SOLID)。

OCCT使用指南:Visualization_第3张图片

        查看器选择:对于每个OCCT查看器,都有一个查看器选择器类实例。它为整个选择算法提供了一个高级API,并封装了每个鼠标选择的对象和敏感实体的处理。查看器选择器保持选择模式的激活和去激活,启动算法,该算法检测要挑选的候选实体,并存储其结果,以及实现用于保持选择结构最新的接口。

        选择管理器:选择管理器是一个高级API,用于操作所有显示对象的选择。它处理所有查看器选择器,激活和停用所有或特定选择器中对象的选择模式,管理每个对象的选择计算和更新。此外,它会根据应用的更改不断更新选择结构。

OCCT使用指南:Visualization_第4张图片

        算法

        所有三种类型的OCCT选择都是作为一个单一的概念来实现的,基于通过三级BVH树遍历来搜索截头体和敏感实体之间的重叠。             

        透视视图:每次运行选择算法的第一步是根据当前激活的选择类型构建选择截头体。对于点或矩形选择,截头体的底部是分别根据像素公差或用户定义区域的尺寸构建的矩形。对于多段线选择,由构造的直线定义的多边形将被三角化,并且每个三角形都用作其自身截头体的基础。因此,这种类型的选择使用一组三角形截头体来进行重叠检测。截头体长度受到近视图体积平面和远视图体积平面的限制,并且每个平面被构建为平行于相应的视图体积平面。

OCCT使用指南:Visualization_第5张图片

        上图显示了矩形截头体:a)鼠标移动或单击后,b)应用矩形选择后。

OCCT使用指南:Visualization_第6张图片

        在上面的图像中,三角形截头体是:a)由用户定义的多段线设置的,b)由基于给定多段线的多边形三角测量设置的,c)由基于其中一个三角形的三角截头体设置的。

        BVH树:为了在查看器级别保持选择机制,使用了由3个BVH树组成的加速结构。第一级树由每个可选对象的轴对齐边界框构成。因此,该树的根包含所有可选边界的组合,即使它们当前没有激活的选择。对象是在AIS_InteractiveObject的显示过程中添加的,只有当对象被销毁时才会从该树中删除。第一级BVH树与选择算法的第一次运行同时按需构建。二级BVH树由一个可选对象的所有敏感实体组成。当默认模式被激活时,二级树会自动构建,当第一次计算新的选择模式时,会重新构建。第三级BVH树用于包含许多元素的复杂敏感实体:例如,三角形、具有许多线段的导线、点集等。它是根据需要为子元素低于800K的敏感实体构建的。

OCCT使用指南:Visualization_第7张图片

        算法的几个阶段:该算法包括预处理和三个主要阶段。预处理,隐含了选择截头体及其主要特性的计算。

        第一阶段-遍历一级BVH树:在成功构建选择截头体之后,该算法开始遍历对象级BVH树。根据分离轴定理(SAT)的术语,测试包含轴对齐边界框的节点与选择截头体的重叠。当遍历向下到叶节点时,意味着已经找到了可能具有重叠敏感实体的候选对象。如果没有检测到这样的对象,则算法停止,并且假设不需要选择任何对象。否则,它将进入下一阶段,以处理找到的可选对象的实体。

        第二阶段——遍历二级BVH树:在这个阶段,有必要确定在一个对象的所有敏感实体中是否存在候选者。首先,在这个阶段,算法检查是否对当前对象应用了任何变换。如果它有自己的位置,那么相应变换的截头体将用于进一步的计算。在下一步骤中,访问给定对象的第二级BVH树的节点以搜索重叠的叶子。如果没有发现这样的叶子,则算法返回到第二阶段。否则,它将通过执行以下检查来开始处理找到的实体:激活检查-实体当前可能处于非活动状态,因为它属于已停用的选择;公差检查-当前选择的截锥体可能太大,无法进行进一步检查,因为它总是以所有激活实体中的最大公差构建的。因此,在该步骤中,可以对截头体进行缩放。在这些检查之后,算法进入最后阶段。

        第三阶段——特定敏感实体的重叠或包含测试:如果实体是原子的,则执行简单的SAT测试。在复杂实体的情况下,遍历第三级BVH树。分析匹配敏感实体的定量特征(如深度、到几何中心的距离),并应用剪裁平面(如果已设置)。检测结果被存储,并且算法返回到第二阶段。

        包和类

        选择是由多种算法的组合实现的,这些算法分为几个包——SelectBasics、Select3D、SelectMgr和StdSelect。选择基础
        SelectBasics包包含用于选择的基本类和接口。最值得注意的是:SelectBasics_PickResult–用于存储检测过程的定量结果的结构,例如,到几何中心的深度和距离;SelectBasics_SelectingVolumeManager–用于与当前选择截头体交互的界面。每个自定义敏感实体必须至少继承SelectBasics_SensiveEntity。

        Select3D软件包提供了标准敏感实体的定义,例如:box;circle;curve;face;group;point;segment;triangle;triangulation;wire.

        每个基本敏感实体都继承Select3D_SensiveEntity。该包还包含两个辅助类,Select3D_SensivePoly和Select3D_SectiveSet。Select3D_SensiveEntity–敏感实体的基本定义。
Select3D_SensiveSet–所有需要使用第三级BVH的复杂敏感实体的基类。它实现了对树的遍历,并为检查子实体的方法定义了一个接口。Select3D_SensivePoly–描述任意点集并实现选择的基本功能。重要的是要知道这个类不执行任何内部数据检查。因此,从Select3D_SensivePoly继承的敏感实体的自定义实现必须满足分离轴定理的条款,才能使用标准OCCT重叠检测方法。

        SelectMgr:SelectMgr包用于维护整个选择过程。为此,该软件包提供以下服务:激活和停用所有可选择对象的选择模式;用于计算所述对象的选择模式的接口;选择过滤器类别的定义;使选择BVH数据保持最新。

        下面对主要内容进行简要说明SelectMgr_BaseFrustum、SelectMgr_Frustum、SelectMgr_RectangularFrustum,SelectMgr_Triangular Frustum和SelectMgr_Tariangular FrustumSet–选择截头体的接口和实现,这些类实现了用于重叠和包含检测的不同SAT测试。它们还包含测量检测到的实体的特征(深度、到几何体中心的距离)的方法;        

        SelectMgr_SensiveEntity、SelectMgr_Selection和SelectMgr_SitiveEntitySet–存储和处理敏感实体;SelectMgr_SensiveEntitySet为二级BVH树实现一个基元集;SelectMgr_SelectableObject和SelectMgr_SectiableObjectSet–描述可选对象。它们还管理选择的存储、计算和删除。SelectMgr_SelectableObjectSet实现了一级BVH树的基元集;SelectMgr_ViewerSelector–封装选择算法的所有逻辑,并实现第三级BVH树遍历;SelectMgr_SelectionManager–管理每个可选对象的激活/停用、计算和更新选择,并保持BVH数据的最新状态。StdSelect_RepOwner–定义实体所有者,该所有者具有指向其拓扑形状的链接和高亮显示的方法;StdSelect_RepSelectionTool–包含将标准AIS形状拆分为敏感基元的算法;tdSelect_ViewerSelector3d–SelectMgr_ViewerSelector实现的示例,用于默认OCCT选择机制;StdSelect_FaceFilter、StdSelect_edFilter–选择过滤器的实现。

        选择示例

       让我们假设需要让一个盒子在两种模式下可选择——整个形状(模式0)和它的每个边缘(模式1)。为了选择整个盒子,应用程序可以为交互对象的每个面创建一个敏感原语。在这种情况下,所有原语共享同一个所有者——盒子本身。要选择框的边缘,应用程序必须为每个边缘创建一个敏感原语。在这里,所有敏感实体不能共享所有者,因为不同的几何原语必须作为选择过程的结果突出显示。

        任何交互式对象的选择结构都是在SelectMgr_SelectableObject::ComputeSelection()方法中创建的。

        Open CASCADE技术采用的突出显示选定实体所有者的传统方法假定每个实体所有者自己突出显示自己。这种方法有两个缺点:每个实体所有者都必须维护自己的Graphic3d_Structure对象,这导致了相当大的内存开销;从可视化的角度来看,逐个绘制选定的所有者效率不高。因此,为了克服这些限制,OCCT有一种替代方法来实现选中表示的突出显示。使用这种方法,交互对象本身将负责突出显示,而不是实体所有者。

        同样重要的是要知道,OCCT中有两种类型的检测用于矩形选择:包容性检测。在这种情况下,只有当敏感基元的所有点都包括在由选择矩形定义的区域中时,才认为检测到敏感基元;
重叠检测。在这种情况下,当敏感基元被选择矩形部分重叠时,就认为它被检测到了。

3、应用程序交互服务

3.1、介绍

        应用程序交互服务允许以简单透明的方式在查看器中管理演示和动态选择。管理可视化和选择的中心实体是交互式上下文。它连接到主查看器。

        默认情况下,交互上下文从中性点开始,每个可选择对象作为一个整体被选中,但用户可能会激活特定对象的局部选择,以使对象的部分可选择。本地/全局选择通过为每个显示对象激活的选择模式列表来管理,选择模式为0(默认选择模式),通常意味着全局(整个对象)选择。

        交互对象是实体,它是可视化的和可选择的。您可以使用已经为其编写了所有必要函数的标准交互式对象类,或者您可以通过遵守下面描述的一定数量的规则和约定来实现您自己的交互式对象类。

        交互式对象是一个“虚拟”实体,它可以被呈现和选择。交互式对象可以具有一定数量的特定图形属性,例如可视化模式、颜色和材料。当交互式对象可视化时,如果它具有所需的自定义属性,则从其自己的抽屉(Prs3d_Drawer)中获取所需的图形属性,否则从上下文抽屉中获取所需的图形属性。

        可能需要过滤要选择的实体。因此存在Filter实体,它允许对动态检测上下文进行细化。其中一些过滤器只能在中立点内使用,其他过滤器只能在局部选择中使用。可以编写自定义过滤器并将其加载到交互式上下文中。

OCCT使用指南:Visualization_第8张图片

3.2、交互对象

        在AIS查看器中可视化和选择的实体是对象。它们将模型的底层参考几何连接到其在AIS中的图形表示。您可以使用预定义的标准交互对象OCCT类,所有必要的功能都已经编程完成,或者,如果您是高级用户,您可以实现自己的交互对象类。

        展示:一个交互式对象可以有创建者想要给它的许多演示。3D演示由演示管理器(PrsMgr_PresentationManager)管理。由于这在AIS中是透明的,所以用户不必担心。表示由索引(Display Mode)和对它所依赖的presentation Manager的引用来标识。按照约定,交互式对象的默认表示模式索引为0。

OCCT使用指南:Visualization_第9张图片

        交互式对象的各种表现形式的计算是由继承自PrsMgr_PresentableObject::Compute函数的Compute函数完成的。它们由PresentationManager在可视化或更新请求时自动调用。

        隐线移除:

        Hidden Line Removal,简称HLR,指的是在计算机图形学中,消除隐藏线的技术。这项技术常用于3D渲染和计算机动画,以改善图像的视觉效果。

        在3D图形渲染中,一个场景通常由许多重叠的物体组成,每个物体都有自己的形状和轮廓。为了在屏幕上正确地显示这些物体,渲染引擎需要确定哪些物体的轮廓线应该被显示,哪些应该被隐藏。这就是隐藏线消除技术的核心任务。

        隐藏线消除技术可以通过多种方法来实现,包括软件算法和硬件加速。一些常见的实现方法包括基于z-buffer的算法、基于深度缓冲区的算法、基于扫描线的算法等。

        通过隐藏线消除技术,可以减少图像中的视觉干扰和混乱,使图像更加清晰和易于理解。这项技术在许多领域都有广泛的应用,包括游戏开发、电影制作、科学可视化等。

        视图可以有两种状态:正常模式或计算模式(Hidden Line Removal模式)。当后者处于活动状态时,视图查找在正常模式下显示的所有表示,这些表示已被标记为接受HLR模式。内部机制允许调用交互对象自己的计算,即投影仪功能。

        按照惯例,交互对象接受或拒绝HLR模式的表示。可以用以下两种方式之一来声明:首先使用枚举PrsMgr_TypeOfPresentation3d中的一个值:PrsMgr_TOP_AllView,PrsMgr_TOP_ProjectorDependant;稍后通过使用函数PrsMgr_PresentableObject::SetTypeOfPresentation

        AIS_Shape 类是支持 HLR 表示的交互式对象的示例。HLR 算法的类型存储在形状的 Prs3d_Drawer 中。它是 Prs3d_TypeOfHLR 枚举的值,可以设置为:Prs3d_TOH_PolyAlgo,一种基于形状三角化的多边形算法;Prs3d_TOH_Algo是一种精确的算法,适用于形状的真实几何形状;如果未给定交互对象实例设置算法类型,则返回Prs3d_TOH_NotSet。
        用于AIS_Shape的HLR算法类型可以通过调用AIS_Shape::SetTypeOfHLR()方法进行更改。可以使用AIS_Shape::TypeOfHLR()方法获取当前的HLR算法类型。

        这些方法从AIS_Shape的drawer中获取值。如果Prs3d_Drawer中的HLR算法类型设置为Prs3d_TOH_NotSet,则Prs3d_Drawer将从AIS_InteractiveContext的默认drawer中获取值。因此,可以更改所有新显示的交互对象使用的默认HLR算法。存储在上下文抽屉中的HLR算法类型的值可以是Prs3d_TOH_Algo或Prs3d_TOH_PolyAlgo。多边形算法是默认算法。

        演示模式:

        AIS中有四种类型的交互对象:“施工要素”或基准;关系(尺寸和约束);对象,目标;
None类型(当对象是未知类型时)。
        在这些类别中,可以通过签名(索引)进行额外的特征描述。默认情况下,交互对象具有NONE类型和0签名(相当于NONE)。如果你想给你的交互对象一个特定的类型和签名,你必须重新定义两个虚拟函数:AIS_InteractiveObject::Type;AIS_InteractiveObject::Signature。
        请注意,某些签名已被AIS中提供的“标准”对象使用(请参阅标准交互对象类列表)。

        交互上下文可以具有一组交互对象的默认表示模式。这种模式可能不被给定的对象类接受。因此,要获取有关此类别的信息,有必要使用虚拟函数AIS_InteractiveObject::AcceptDisplayMode。

        显示模式

        函数AIS_InteractiveContext::SetDisplayMode和AIS_InteractiveContext::UnsetDisplayMode允许为对象设置自定义显示模式,该模式可以不同于交互上下文所建议的显示模式。

        高亮模式:

        在动态检测中,交互式上下文所呈现的默认显示内容是屏幕上已有的显示内容。函数AIS_InteractiveObject::SetHilightMode和AIS_InteractiveObject:: unsetHilightMode允许指定用于突出显示的显示模式(所谓的突出显示模式),该模式独立于对象的主动表示有效。无论该选择是暂时的还是确定的,都没有区别。

        请注意,用于突出显示检测到的对象和突出显示选定对象的演示文稿(以及相应的突出显示模式)是相同的,后者使用特殊的选择颜色绘制(请参阅与交互式上下文服务相关的部分)。

        例如,您想系统地突出显示形状的线框演示,而不考虑它是用线框演示还是用着色显示。因此,您在交互对象的构造函数中将突出显示模式设置为0。别忘了在Compute函数中实现这种表示模式。

        无限的状态:

        如果你不想让一个对象受到FitAll视图的影响,你必须声明它为infinite;你可以使用AIS_InteractiveObject::SetInfiniteState和AIS_InteractiveObject::IsInfinite函数来取消它的“infinite”状态。

        选择:

        交互对象可以有无限数量的选择模式,每个模式都代表一个“分解”为敏感基元。每个基元都有一个所有者(SelectMgr_EntityOwner),它允许识别已检测到的确切交互对象或形状(见选择章节)。

        与给定模式相对应的敏感基元集存储在选择(SelectMgr_Selection)中。

        每种选择模式都由一个索引标识。按照惯例,默认选择模式允许我们完整地掌握交互对象,该模式为模式 0。但是,可以在自定义交互对象中使用方法。SelectMgr_SelectableObject::setGlobalSelMode() 进行修改。

        选择基元(或敏感实体)的计算是在一个虚拟函数 ComputeSelection 中完成的。它应该为每种类型的交互对象实现,这些对象被假设为使用函数 AIS_InteractiveObject::ComputeSelection 具有不同的选择模式。关于该机制的详细解释和实现该函数的方式已经在选择章节中给出。

        在OCCT中最广泛使用的交互对象有一些选择模式计算的例子——AIS_Shape(按顶点、按边等选择)。要创建与AIS_Shape具有相同选择行为的新类交互对象——如顶点和边——你必须重新定义虚拟函数AIS_InteractiveObject::AcceptShapeDecomposition。

        图形属性:

        图形属性管理器或Prs3d_Drawer存储特定交互对象和交互上下文控制的交互对象的图形属性。

        最初,所有绘制属性都使用预定义值填充,这些值将定义默认的3D对象外观。当交互式对象可视化时,首先从其自己的绘制(如果存在)或上下文绘制(如果不存在该类型的对象的特定抽屉)中获取所需的图形属性。

        关于图形属性,请记住以下几点:每个交互对象都可以有自己的可视化属性。默认情况下,交互对象采用其被可视化的上下文的图形属性(可视化模式、用于计算表示的偏转值、等参数、颜色、线条类型、材料等)。在AIS_InteractiveObject抽象类中,包括颜色、线条粗细、材料和透明度在内的标准属性具有特权。因此,有一定数量的虚函数允许对这些属性进行操作。每个新的交互对象类都可以重新定义这些函数并改变类的行为。

        以下虚拟函数提供颜色、宽度、材质和透明度的设置:AIS_InteractiveObject::UnsetColor; AIS_InteractiveObject::SetWidth AIS_InteractiveObject::UnsetWidth;AIS_InteractiveObject::SetMaterial;AIS_InteractiveObject::UnsetMaterial;AIS_InteractiveObject::SetTransparency; AIS_InteractiveObject::UnsetTransparency;

        这些方法可以作为在常见情况下属性赋值的快捷方式,但结果可能无法实现。一些交互式对象可能根本不实现这些方法,或者只实现其中的一部分。直接修改AIS_InteractiveObject::Attributes返回的Prs3d_Drawer属性可以用于更精确和可预测的配置。

        知道哪些函数可能意味着重新计算对象的演示是很重要的。如果交互式对象的演示模式需要更新,PrsMgr_PresentableObject中的标志会指示这一点。可以使用AIS_InteractiveContext中的Display和Redisplay函数来更新模式。

OCCT使用指南:Visualization_第10张图片

        配套服务:

        当您为交互式对象使用补充服务时,请特别注意下面提到的情况。

        更改交互式对象的位置:以下函数允许在视图中“移动”交互式对象的表示和选择,无需重新计算(也不修改原始形状):AIS_InteractiveContext::SetLocation;AIS_InteractiveContext::ResetLocation;AIS_InteractiveContext::HasLocation;AIS_InteractiveContext::Location;
        将交互式对象连接到应用程序实体:每个交互式对象都有函数,允许将其GetOwner属性赋给Transient:AIS_InteractiveObject::SetOwner;AIS_InteractiveObject::HasOwner;AIS_InteractiveObject::GetOwner.因此,交互式对象可以与应用程序实体相关联或无关,而不影响其行为。

        注意:不要被另一种类型的所有者(SelectMgr_EntityOwner)混淆,它用于识别对象的可选择部分或对象本身。

        解析重合的拓扑结构:由于三维图形坐标的准确性具有有限分辨率,因此拓扑对象的元素可以重合,产生“弹出”一些元素的效果。

        当两个或多个交互式对象的元素重合时,您可以应用多边形偏移。这是一种图形计算偏移或深度缓冲区偏移,允许您在不更改坐标的情况下排列元素(通过修改其深度值)。接受这种偏移的图形元素是实体多边形或显示为边界线和点。通过设置适当的内部样式,可以将多边形显示为线条或点。

        AIS_InteractiveObject::SetPolygonOffsets和AIS_InteractiveContext::SetPolygonOffsets方法可用于设置多边形偏移。

        对象层次结构:

        每个 PrsMgr_PresentableObject 都有一个名为 myChildren 的对象列表。PrsMgr_PresentableObject 的任何转换也会应用于其子对象。此层次结构不会传播到 Graphic3d 级别及以下。

        PrsMgr_PresentableObject将其组合(根据层次结构)的变换向下发送到Graphic3d_Structure。结构的材质不受层次结构的影响。对象层次结构可以由以下API调用控制:PrsMgr_PresentableObject::AddChild; PrsMgr_PresentableObject::RemoveChild。

        实例化:

        实例化的概念对对象层次结构的操作如下:实例由分离的AIS对象表示;实例不计算任何演示文稿。

       类AIS_ConnectedInteractive和AIS_MultipleConnectedInteractive用于实现这一概念。

        AIS_ConnectedInteractive是一个对象实例,它重用连接对象的几何体,但有自己的变换和可见性标志。该连接向下传播到OpenGl级别,即OpenGl_Structure。OpenGl_Structure只能连接到单个其他结构。

        AIS_ConnectedInteractive通常可以引用到任何AIS_InteractiveObject。当它被引用到另一个AIS_ConnectedInteractive时,它只是复制引用。

        AIS_MultipleConnectedInteractive表示一个程序集,该程序集没有自己的表示形式。程序集能够参与对象层次结构,并用于处理实例化对象的分组集。在选择方面,它表现为单个对象。它将高级转换应用于所有子元素,因为它位于层次结构的上方。

        所有AIS_MultipleConnectedInteractive都可以具有子程序集。如果一个程序集附加到另一个程序集中,则执行对象实例树的深度复制。

        请注意,AIS_ConnectedInteractive不能引用AIS_MultipleConnectedInteractive。AIS_ConnectedInteractive复制原始对象的敏感实体以供选择,而AIS_MultipleConnectedInteractive则重复使用原始对象的实体。 

        实例可以通过以下DRAW命令进行控制:vconnect:从输入对象和位置创建并显示AIS_MultipleConnectedInteractive对象。vconnecto:生成具有给定位置的对象的实例。vdisconnect:从程序集断开所有对象的连接,或按名称或编号断开对象的连接。vaddconnected:将对象添加到程序集中。vlistconnected:列出程序集中的对象。

OCCT使用指南:Visualization_第11张图片

OCCT使用指南:Visualization_第12张图片

3.3、交互上下文        

        规则:

        交互式上下文允许在一个或多个查看器中以透明的方式管理交互式对象的图形和可选择行为。大多数允许修改交互式对象属性的函数,在前一章中已经介绍过,这里将再次讨论。

        这里有一个基本规则需要遵循:交互式对象的修改(Context已经知道)必须使用Context函数来完成。如果交互式对象没有被加载到交互式上下文中,则只能直接调用该对象可用的函数。

        函数群:

        中立点和本地选择构成了交互式上下文的两种操作模式或状态,交互式上下文是引导可视化和选择的核心实体。中立点是默认模式,可以轻松地可视化和选择已加载到上下文中的交互对象。激活特定对象的本地选择可以对其子部分进行选择。

        交互式上下文的管理:

        交互对象可以具有一定数量的特定图形属性,例如可视化模式、颜色和材料。相应地,交互上下文有一组图形属性,即Drawer,默认情况下对其控制的对象有效。当交互式对象可视化时,如果存在,则首先从对象自己的Drawer中获取所需的图形属性,否则则从上下文Drawer中获取所需的图形属性。

        以下可调设置允许个性化演示和选择的行为: 默认Drawer,包含所有可被交互对象使用的颜色和线条属性,这些对象没有自己的属性。交互式对象的默认可视化模式。默认:mode 0; 突出显示鼠标移动检测到的实体的颜色。默认值:Quantity_NOC_CYAN1; 预选的颜色。默认值:Quantity_NOC_GREEN; 选择颜色(当您单击检测到的对象时)。默认值:Quantity_NOC_GRAY80;
        所有这些设置都可以通过适合上下文的函数进行修改。当您更改属于Context的图形属性(例如,可视化模式)时,所有没有相应的适当属性的交互式对象都会被更新。PresentationManager和Selector3D管理当前交互对象的表示和选择,它们与主查看器相关联。

        警告!在实际代码中不要使用整数值(就像上面的示例一样)——而是使用适当的枚举!每个可呈现对象具有支持的显示和选择模式的独立列表;例如,AIS_DisplayMode枚举仅适用于AIS_Shape表示。

3.4、当地的选择

        选择模式

        本地选择由索引(选择模式)定义。由特定交互对象实现的选择模式及其含义应在此类文档中进行检查。例如,请参见MeshVS_Mesh对象的MeshVS_SelectionModeFlags。

        AIS_Shape是最常用的交互式对象。它提供API来管理形状组成元素上的选择操作(顶点、边、面等的选择)。特定形状类型(TopAbs_ShapeEnum)的选择模式由方法AIS_shape::SelectionMode()返回。

        不带选择模式参数的方法AIS_InteractiveContext::Display()激活对象的默认选择模式。方法AIS_InteractiveContext::Activate()和AIS_Interactive Context::Deactivate()激活和停用特定的选择模式。

        可以同时激活多个“选择模式”(但用于选择整个对象的默认0模式是独占的,不能与其他模式组合)。可使用函数AIS_InteractiveContext::ActivatedModes检索活动模式列表。

        过滤器

        要定义动态检测环境,可以使用标准的过滤器类或创建自己的过滤器类。过滤器询问敏感原语的所有者,以确定它是否具有所需的质量。如果它的回答是肯定的,它就会被保留。否则,它将被拒绝。

        对象的根类是SelectMgr_Filter。它背后的原理很简单:过滤器测试通过选择器在鼠标位置检测到的所有者(SelectMgr_EntityOwner)是否回答OK。如果是,它将被保留,否则它将被拒绝。您可以通过实现延迟函数SelectMgr_filter::IsOk()来创建筛选器对象的自定义类。

        在SelectMgr中,还有组合过滤器(AND过滤器、OR过滤器),它们允许组合多个过滤器。在Interactive Context中,您添加的所有筛选器都存储在OR筛选器中(如果至少有一个筛选器的答案为OK,则该筛选器的回答为OK)。

        有一些标准过滤器,已经在几个包中实现:StdSelect_EdgeFilter–用于边,如直线和圆;StdSelect_FaceFilter–用于面,如平面、圆柱体和球体;StdSelect_ShapeTypeFilter–用于形状类型,例如复合物、实体、壳和导线;AIS_TypeFilter–用于交互对象的类型;AIS_SignatureFilter–用于交互对象的类型和签名;AIS_AttributeFilter–用于交互式对象的属性,例如颜色和宽度。

        有几个函数可以操作过滤器:AIS_InteractiveContext::AddFilter添加作为参数传递的筛选器。AIS_InteractiveContext::RemoveFilter删除作为参数传递的筛选器。AIS_InteractiveContext::RemoveFilters删除所有现有的筛选器。AIS_InteractiveContext::Filters获取上下文中活动的筛选器列表。

        选择

        动态检测和选择以一种简单的方式实现。只有几个惯例和功能需要熟悉:AIS_InteractiveContext::MoveTo–将鼠标位置传递给交互式上下文选择器。AIS_InteractiveContext::Select–存储上次MoveTo检测到的内容。替换以前选定的对象。如果在最后一次移动中未检测到任何内容,则清空堆栈。AIS_InteractiveContext::ShiftSelect–如果上次移动时检测到的对象尚未选定,则会将其添加到选定对象的列表中。如果没有,它将被撤回。如果你点击一个空白区域,什么都不会发生。AIS_InteractiveContext::选择–选择在周围区域找到的所有内容。AIS_InteractiveContext::ShiftSelect–选择先前未在所选列表中的内容,取消选择已存在的内容。检测到的和选择的实体的高亮显示由交互上下文自动管理。高亮显示颜色是上面处理过的颜色。

        您可以通过移动鼠标来询问交互式上下文。可以使用以下功能:AIS_InteractiveContext::HasDetected–检查是否存在检测到的实体;AIS_InteractiveContext::DetectedOwner–返回(当前突出显示的)检测到的实体。

        使用Select(选择)和ShiftSelect(换档选择)功能后,您可以浏览选择列表。可以使用以下功能:AIS_InteractiveContext::InitSelected–初始化迭代器;AIS_InteractiveContext::MoreSelected–检查迭代器是否有效;AIS_InteractiveContext::NextSelected–将迭代器移动到下一个位置;AIS_InteractiveContext::SelectedOwner–返回当前迭代器位置的实体。

        所有者对象SelectMgr_EntityOwner是标识查看器中可选择实体的关键对象(由方法AIS_InteractiveContext::DetectedOwner和AIS_Interactive Context::SelectedOwner返回)。交互式对象本身可以通过方法SelectMgr_EntityOwner::Selectable检索,而识别子部分取决于交互式对象的类型。在AIS_Shape的情况下,通过StdSelect_RepOwner::Shape方法返回(子)形状。

3.5、标准交互对象类

        ​​​​交互对象是连接图形表示和底层参考几何的可选择和可查看的对象。它们分为四种类型:基准面——一个建筑几何元素;关系-对交互形状和相应参考几何的约束;the Object—拓扑形状或形状之间的连接;None—一个令牌,它不会消除对象,而是告诉应用程序进一步查找,直到在生成的对象中找到可接受的对象定义。

        在这些类别中,有可能通过签名进行额外的特征描述。签名提供了进一步表征的索引。缺省情况下,交互对象的类型为None,签名为0(相当于None)。如果你想给你的交互对象一个特定的类型和签名,你必须重新定义两个虚拟方法: Type 和Signature.

        基准:

        基准将线、圆、点、三棱锥、平面三棱锥、平面和轴等构造元素组合在一起。

        AIS_Point, AIS_Axis, AIS_Line, AIS_Circle, AIS_Plane and AIS_Trihedron有四种选择模式:模式AIS_TrihedronSelectionMode_EntireObject:选择三棱锥;模式AIS_TrihedronSelectionMode_Origin:选择三棱锥的原点;模式AIS_TrihedronSelectionMode_Axes:选择轴;模式AIS_TrihedronSelectionMode_MainPlanes:选择XOY、YOZ、XOZ平面。

        这些是AutoCAD Interactive Shell(AIS)中的选择模式,用于选择不同类型的几何对象。这些选择模式允许用户以不同的方式选择和操作这些对象。例如,在模式AIS_TrihedronSelectionMode_EntireObject中,可以选择整个三棱锥对象;在模式AIS_TrihedronSelectionMode_Origin中,可以选择三棱锥的原点;在模式AIS_TrihedronSelectionMode_Axes中,可以选择三棱锥的轴;在模式AIS_TrihedronSelectionMode_MainPlanes中,可以选择三棱锥的XOY、YOZ、XOZ主平面。这些选择模式有助于更精确地选择和操作这些对象。

        当你激活其中一种模式时,你会选择AIS类型的对象:AIS_Point;AIS_Axis(以及轴的类型信息);AIS_Plane(以及平面的类型信息)。

        AIS_PlaneTrihedron提供三种选择模式:模式0:选择整个三棱锥;模式1:选择三棱锥的原点;模式2:选择轴-与三棱锥相同。

        对于平面和三棱锥的呈现,默认长度单位是毫米,轴的默认表示值为10。要修改这些尺寸,你必须暂时恢复对象绘图员。从绘图员中,获取DatumAspect()并更改FirstAxisLength的值。最后,重新计算呈现。

      AutoCAD Interactive Shell(交互式AutoCAD外壳)是一个用于创建交互式2D和3D设计应用程序的软件开发工具包(SDK)。它允许开发人员将AutoCAD的功能嵌入到自定义应用程序中,以支持各种行业特定的设计和绘图任务。

        通过使用AutoCAD Interactive Shell,开发人员可以创建自定义的应用程序,这些应用程序可以利用AutoCAD的强大绘图和设计工具,例如线条、圆、弧、多边形、填充、标注、块等等。此外,它还支持各种文件格式,包括DWG、DXF和DGN等,以便在AutoCAD环境中进行数据交换。

        AutoCAD Interactive Shell还提供了丰富的交互功能,例如实时跟踪、动态输入、命令行界面等,以支持用户与设计界面之间的直观交互。此外,它还支持各种用户自定义选项,例如快捷键、工具栏、工作空间和自定义参数等,以便根据特定需求定制应用程序界面。

        总之,AutoCAD Interactive Shell是一个强大的软件开发工具包,允许开发人员将AutoCAD的功能嵌入到自定义应用程序中,以支持各种行业特定的设计和绘图任务。它提供了丰富的绘图和设计工具以及交互功能,以支持用户与设计界面之间的直观交互。

        对象

        对象类型包括拓扑形状以及形状之间的连接。AIS_Shape有两种可视化模式:模式AIS_WireFrame:线(默认模式);模式AIS_Shaded:着色(取决于形状类型)

        AIS_ConnectedInteractive是一个连接到另一个交互式对象引用的交互式对象,位于查看器的其他位置,可以不计算表示和选择,而是从对象引用中推断它们。AIS_MultipleConnectedInteractive是一个连接到交互式对象列表的对象(也可以是connected对象。它不需要占用内存的表示计算)。

        MeshVS_Mesh是一个表示网格的交互式对象,它有一个提供几何信息(节点、元素)的数据源,并且可以使用自定义表示生成器从源数据构建。类AIS_ColoredShape允许为TopoShape对象及其子形状使用自定义颜色和线宽

        表示类AIS_PointCloud可用于有效地绘制大型任意彩色点集。它使用Graphic3d_ArrayOfPoints将点数据传递到OpenGl图形驱动程序中,以将设定点绘制为“点精灵”阵列。为了提高性能,点数据被打包到顶点缓冲区对象中。

        用于绘制点的点标记的类型可以指定为表示方式。该演示提供了通过点的可视化集合的边界框进行的选择。它支持两种显示/高亮显示模式:点或边界框。

OCCT使用指南:Visualization_第13张图片

      绘制命令vpointcloud通过形状三角测量构建点云。该命令还可以绘制具有大量点(超过一百万)的球面或体积。

        关系:

        关系由一个或多个交互形状和相应的参考几何形状的约束组成。例如,您可能希望在并行关系中约束两条边。这个约束本身被视为一个对象,并显示为一个敏感原语。这采用了一个垂直箭头的图形形式,标记为||符号,位于两条边之间。AIS提供以下关系:

         AIS_ConcentricRelation:同心关系,表示两个圆或圆弧共享同一圆心。
        AIS_FixRelation:固定关系,表示两个对象之间的位置是固定的,不会因操作而改变。
        AIS_IdenticRelation:完全相同关系,表示两个对象完全相同,具有相同的尺寸和位置。
        AIS_ParallelRelation:平行关系,表示两条线或两个面之间保持恒定的距离,形成平行的几何关系。
        AIS_PerpendicularRelation:垂直关系,表示两条线或两个面之间相互垂直,其中一个对象的垂线与另一个对象相交。
        AIS_Relation:一般关系,表示两个对象之间存在某种几何约束关系,但具体类型需要根据上下文确定。
        AIS_SymmetricRelation:对称关系,表示两个对象之间存在对称的几何关系,其中一个对象相对于另一个对象进行镜像反射。
        AIS_TangentRelation:相切关系,表示两个圆或圆弧在某一点处相切。

        维度:

        AIS_AngleDimension:这是一个角度尺寸。它测量两条线或两个面之间的角度。AIS_Chamf3dDimension:这是一个3D倒角尺寸,用于测量3D模型中的倒角。AIS_DiameterDimension:这是一个直径尺寸,用于测量圆或弧的直径。AIS_DimensionOwner:这是一个维度所有者,通常用于表示一个特定维度的来源或关联的对象。AIS_LengthDimension:这是一个长度尺寸,用于测量两个点之间的实际距离。AIS_OffsetDimension:这是一个偏移尺寸,通常用于表示一个对象与另一个对象之间的偏移距离。AIS_RadiusDimension:这是一个半径尺寸,用于测量圆或弧的半径。

        MeshVS_Mesh:

        MeshVS_Mesh是一个表示网格的交互式对象。该对象不同于AIS_Shape,因为其几何数据由描述对象节点和元素的数据源MeshVS_DataSource支持。因此,您可以提供自己的数据源。

        但是,DataSource不提供任何关于属性的信息,例如节点颜色,但您可以通过选择适当的表示生成器以特殊方式应用它们。

        MeshVS_Mesh的演示文稿是使用演示文稿生成器MeshVS_PrsBuilder构建的。您可以在构建器之间进行选择,以不同的方式表示对象。此外,您可以重新定义基本生成器类,并提供自己的表示生成器。

        有一组为MeshVS_Mesh保留的显示和高亮显示模式标志。模式值是允许选择其他显示参数并组合以下模式标志的位数,这些模式标志允许在线框、着色和收缩模式中显示网格。

        MeshVS_DMF_User是用户定义的模式。这些值将由演示生成器使用。还有一组选择模式标志,可以按位的组合进行分组:MeshVS_SMF_0D;MeshVS_SMF_Link;MeshVS_SMF_Face;MeshVS_SMF_Volume;MeshVS_SMF_Element – groups 0D, Link, Face and Volume as a bit mask;MeshVS_SMF_Node;MeshVS_SMF_All – groups Element and Node as a bit mask;MeshVS_SMF_Mesh;MeshVS_SMF_Group;

3.6、动态选择

        动态选择表示您想要选择的拓扑形状,通过分解敏感原语(将被检测和突出显示的形状的子部分)。这些原语的集合由强大的三层BVH树选择算法处理。有关算法的更多细节和使用示例,请参阅“选择”一章。

4、3D演示

4.1、3D术语词汇表

        一组基本体和这些基本体上的属性。基本体和属性可以添加到组中,但不能从组中删除,除非全局删除。一个组可以有一个pick标识。

        光源有五种光源——环境光源、前照灯光源、定向光源、位置光源和点光源。灯光仅在视图中的着色上下文中激活。

        Primitive–可绘制元素。它在三维空间中有一个定义。基本体可以是线、面、文字或标记。一旦显示,标记和文本的大小保持不变。可以修改线条和面,例如缩放。基本体必须存储在一个组中。

        结构–管理组。这些组是相互排斥的。可以编辑结构,添加或删除组。一个结构可以引用其他结构来形成层次结构。它有一个默认的(身份)变换,并且可以应用其他变换(旋转、平移、缩放等)。它没有基本体直线、面、标记和文本的默认属性。属性可以在结构中设置,但它们会被每个组中的属性覆盖。每个结构都有一个与之相关的显示优先级,这决定了在3D查看器中重新绘制结构的顺序。如果可视化模式与视图不兼容,则不会在该视图中显示,例如,仅着色对象不会在线框视图中可视化。

        视图–由视图方向、视图映射和上下文视图定义。

        Viewer–管理一组视图。

        视图方向–定义观察者根据视图参考坐标查看场景的方式。

        视图映射–定义从“视图参考坐标”到“规格化投影坐标”的变换。这遵循Phigs方案。

        Z-Buffering–仅在着色模式下移除隐藏曲面的一种形式。对于处于着色模式的视图,此选项始终处于活动状态。它是无法抑制的。

4.2、图形基元

        Graphic3d包用于在3D查看器中创建3D图形对象。这些被称为结构的对象由一组原语和属性组成,如折线、带孔或不带孔的平面多边形、文本和标记,以及属性,如颜色、透明度、反射、线条类型、线条宽度和文本字体。组是结构中最小的可编辑元素。转换可以应用于结构。结构可以连接起来,形成由转换组成的结构树。结构是由观察者全局操纵的。

        图形结构可以是: Displayed, Highlighted, Erased, Transformed;有以下类:线条、面、标记、文本、材料的视觉属性向量和顶点,图形对象、组和结构。

        结构层次结构:根是结构层次结构或结构网络的顶部。父结构的属性将传递给其子结构。子结构的属性不会影响父结构。不支持递归结构网络。

        图形基本体:标记:具有一个或多个顶点;有一个类型、比例因子和颜色;具有独立于变换的大小、形状和方向。三角形:具有至少三个顶点;为着色定义了节点法线;具有内部属性:样式、颜色、正面和背面材质、纹理和反射比。 多段线或线段:具有两个或多个顶点;具有以下属性:类型、宽度比例因子、颜色。文本:具有几何和非几何属性,几何属性–字符高度、字符向上矢量、文本路径、水平和垂直对齐、方向、三维位置、可缩放标志;非几何属性–文本字体、字符间距、字符扩展因子、颜色。

        基元数组:不同类型的基元可以用以下基元数组表示:Graphic3d_ArrayOfPoints,Graphic3d_ArrayOfPolylines,Graphic3d_ArrayOfSegments,Graphic3d_ArrayOfTriangleFans,Graphic3d_ArrayOfTriangles,Graphic3d_ArrayOfTriangleStrips。Graphic3d_ArrayOfPrimitives是这些基本体阵列的基类。方法集Graphic3d_ArrayOfPrimitives::AddVertex允许将顶点及其属性(颜色、法线、纹理坐标)添加到基本体阵列中。也可以修改指定给顶点的值,或通过顶点索引查询这些值。

        如果基本体共享相同的顶点(多边形、三角形等),则可以将它们定义为顶点阵列的索引。方法Graphic3d_ArrayOfPrimitives::AddEdge允许通过索引定义基本体。此方法在数组中添加一个范围为[1,VertexNumber()]的“边”。也可以使用方法Graphic3d_ArrayOfPrimitives::edge查询由边定义的顶点

         文本元素:TKOpenGl工具包使用纹理字体渲染文本标签。Graphic3d文本基元具有以下功能:固定大小(不可缩放)或可缩放;可以在视图平面中旋转到任何角度;支持unicode字符集;该组的文本属性可以使用Graphic3d_AspectText3d属性组定义。要将任何文本添加到图形结构中,可以使用以下方法:AddText。请注意,文本方向角度可以由Graphic3d_SpectructText3d属性定义。

        材料:Graphic3d_MaterialAspect定义如下:透明度;漫反射–对象颜色的组成部分;环境反射;镜面反射——光源颜色的一个组成部分;折射率。

        纹理:由名称定义。有三种类型的纹理可用:1D;2D;环境映射。

        着色器:OCCT可视化核心支持GLSL着色器。着色器可以通过其抽屉属性(Graphic3d方面)指定给通用表示。要为应用程序中的特定AIS_Shape启用自定义着色器,可以使用以下API函数:AttachShader

4.3、图形属性

        特性包概述:Aspect包为查看器中的图形元素提供了类:图形属性组;边缘、线条、背景;窗口;drawer。

4.4、三维视图设施

        概述:

        V3d包提供了定义三维查看器和附加到此查看器的视图(正交视图、透视视图)的资源。该包提供了操作屏幕上视图中可视化的任何3D对象的图形场景的命令。一组高级命令允许在任何特定视图中单独操作参数和投影结果(旋转、缩放、平移等)以及可视化属性(模式、照明、剪裁等)。V3d包基本上是一组由查看器前端的命令引导的工具。此工具集包含用于创建和编辑查看器类的方法,例如:查看器的默认参数,视图(正交、透视),照明(位置、方向、环境、聚光灯、前照灯),剪裁平面,视图、平面、光源、图形结构和拾取的实例化序列,各种包装方法。   

        定义查看参数:

        OCCT V3d_View中的视图投影和方向由相机驱动。相机计算并提供投影和视图方向矩阵,以便通过OpenGL进行渲染。允许用户控制所有投影参数。摄影机由以下属性定义:眼睛–定义观察者(相机)的位置。确保“Eye”点永远不会位于“Front”和“Back”剪裁平面之间。中心–定义视图参考坐标的原点(摄影机的目标位置)。方向–定义摄影机视图的方向(从眼睛到中心)。距离–定义眼睛和中心之间的距离。Front Plane–定义前剪裁平面在视图参考坐标系中的位置。后平面–定义后剪裁平面在视图参考坐标系中的位置。ZNear–定义Eye和Front平面之间的距离。ZFar–定义Eye和Back平面之间的距离。大多数常见的视图操作(平移、缩放、旋转)都是作为V3d_view类的方便方法实现的,但应用程序开发人员也可以直接使用Graphic3d_Camera类。

OCCT使用指南:Visualization_第14张图片

        透视投影:

        视场(FOVy)–通过y轴定义相机视场,单位为度(45� 为默认值)。

        立体投影:

        IOD–定义眼内距离(以世界空间为单位)。IOD有两种类型:Graphic3d_Camera::IODType_Absolute:眼内距离定义为绝对值。Graphic3d_Camera::IODType_Relative:相对于相机焦距(作为其系数)定义眼内距离。视场(FOV)–通过以度为单位的y轴(45� 为默认值)。ZFocus–定义到立体聚焦点的距离。下图是立体投影的原理

OCCT使用指南:Visualization_第15张图片

        要启用立体投影,您的工作站应满足以下要求:图形卡应支持四元缓冲。您需要有源3D眼镜(LCD快门眼镜)。图形驱动程序需要配置为对新创建的OpenGl上下文施加四元缓冲;然后应该创建查看器和视图。在立体投影模式中,相机准备两个投影矩阵来显示左眼和右眼的不同立体图片。在非立体相机中,这种效果是不可见的,因为两只眼睛只使用相同的投影。       

        视锥体裁剪:

        在3D查看器中,CPU侧的视锥裁剪算法默认激活。此算法允许在渲染阶段跳过相机外部的呈现,从而提供更好的性能。以下功能支持此方法:Graphic3d_Structure::CalculateBoundBox()用于计算考虑其转换的呈现的轴对齐边界框。V3d_View::SetFrustumCulling可以启用或禁用特定视图的视锥裁剪。Graphic3d_BvhCStructureSet和Graphic3d_CullingTool类处理外部物体的检测以及用于视锥裁剪的加速结构的用法。BVH_BinnedBuilder类将几个具有空边界框的对象分开。

        查看背景样式:

        V3d_View有三种类型的背景样式:纯色、渐变色和图像。

        将三维场景转储到图像文件中:视图中显示的3D场景可以转储到具有独立于窗口大小的分辨率的图像文件中(使用屏幕外缓冲区)。V3d_View具有以下用于转储3D场景的方法:V3d_View::Dump。将场景转储到具有视图尺寸的图像文件中。光栅图像数据处理算法基于image_AlientPixMap类。支持的扩展名有“.png”、“.bmp”、“.jpg”和FreeImage库支持的其他扩展名。作为BufferType参数传递的值定义输出图像的缓冲区类型(RGB、RGBA、浮点、RGBF、RGBAF)。如果场景已成功转储,方法将返回TRUE。

        光线跟踪支持:

        OCCT可视化通过实时光线跟踪技术提供渲染。允许在常用光栅化和光线跟踪渲染模式之间轻松切换。OCCT光线跟踪的核心是使用GLSL着色器编写的。光线跟踪具有一系列功能:硬阴影、折射、反射、透明度、纹理、支持非多边形对象,如线条、文本、高亮显示、选择、使用两级边界体积层次结构(BVH)进行性能优化。

        光线跟踪算法是递归的(Whitted算法)。它采用了BVH有效的优化结构。该结构为场景几何体准备优化数据,以便进一步实时显示。对于视图操作、选择、动画,甚至通过变换对象的位置来编辑场景,都不需要对BVH进行耗时的重新计算。只有当显示的对象列表或其几何图形发生更改时,才有必要执行此操作。为了使BVH可重复使用,它已被添加到单独的可重复使用OCCT包TKMath/BVH中。用户可以打开/关闭几个光线跟踪选项:最大光线跟踪深度、阴影渲染、镜面反射、自适应抗锯齿、透明度阴影效果。        

        显示优先级:

        结构显示优先级控制绘制结构的顺序。显示结构时,可以指定其优先级。值越低,显示优先级越低。当重新生成显示时,将首先绘制优先级最低的结构。具有相同显示优先级的结构以与已经显示的结构相同的顺序绘制。OCCT支持十一种结构显示优先级。

        深度支撑:

        OCCT具有称为z层的深度排列功能。图形表示可以放在z层中。通常,此函数可用于在图形应用程序中实现“前置”功能。

        Z层功能的另一个应用程序是在显示远离世界中心的对象时处理视觉精度问题。此类对象的关键问题是可视化数据是用单精度浮点数(32位)存储和操作的。单精度32位浮点数只能提供6-9个有效小数位数的精度,而双精度64位数字可以提供15-17个有效小数数字的精度,这对于大多数应用来说已经足够了。

        将对象移动到远离世界中心的位置时,浮点数会稳定地降低精度。摄影机的“Eye”位置会将前导小数位数添加到整个“Object”变换中,由于浮点数字的性质,该变换会丢弃较小的数字。例如,移动到位置1000的0.0000123大小的对象具有结果转换1000.0000123,它溢出了单精度浮点-考虑到9个有效数字的最乐观情况(但事实并非如此),结果编号将为1000.00001。

        这种不精确性会导致3D查看器中出现两种视觉伪影:

        整体逐顶点对象扭曲。当在世界坐标系中定义了每个顶点位置时,就会发生这种情况。

        对象本身没有扭曲,但其在“世界”中的位置不稳定且不精确——对象在摄影机操作过程中会跳跃。当在局部坐标系中以足够小的距离定义顶点以将精度保持在单精度浮点内时,就会发生这种情况,但是应用于对象的局部变换由于单精度浮点而损坏。

        如果不将整个演示转换为双精度(针对每个顶点位置),就无法处理第一个问题。然而,可视化硬件使用单精度浮点数比使用双精度要快得多,因此在大多数情况下这不是一种选择。然而,第二个问题可以通过应用特殊的渲染技巧来否定。

        请注意,层的局部原点仅用于渲染-外部的所有内容仍将在世界坐标系中定义,包括对象的局部变换和检测结果。例如,当在具有不同本地原点的Z层之间移动演示时,对象将停留在同一位置——只有可视化质量会有所不同。

        因此,要在OCCT中应用此功能,应用程序:为每个对象定义“局部变换”,以便在不失真的情况下将演示数据拟合到单精度浮点中。在空间上将世界划分为更小的区域/单元格,其中单精度浮动就足够了。这种单元的大小可能会变化,并取决于应用程序所需的精度(例如,用户能够在应用程序中放大相机的大小)。为包含任何对象的每个空间单元定义Z层。根据单元的中心定义Z层的“局部原点”特性。

        剪裁平面:

        定义自定义剪裁平面的功能对于某些任务可能非常有用。OCCT提供了这样一个机会,使用类Graphic3d_ClipPlane。

        自动背面剔除:

        背面剔除减少了渲染的三角形数量(这提高了性能),并消除了形状边界处的瑕疵。但是,此选项只能用于实体对象,因为从任何角度来看,实体对象的内部实际上都是不可见的。默认情况下,自动背面剔除机制处于启用状态,由V3d_View::SetBackFacingModel()控制。

        以下功能应用于StdPrs_ToolTriangulatedShape::IsClosed()中,用于定义ShadingAspect中的背面剔除:禁用自由闭合壳(不在实体内部)的剔除,因为自由壳的反向方向是有效的情况;能够对填充到化合物中的固体进行筛选;忽略不完全三角剖分的实体。

        在以下情况下,在TKOpenGl级别禁用背面剔除:剪裁/覆盖平面生效;用于半透明物体;带有图案填充显示样式。

4.5、创建三维场景

        要创建三维图形对象并将其显示在屏幕中,请按照以下步骤操作:创建属性。创建三维查看器。创建视图。创建一个交互式上下文。创建交互式对象。在交互式对象中创建基本体。显示交互式对象。

5、网格可视化服务

        MeshVS(网格可视化服务)组件扩展了OPENCASCADE技术的三维可视化功能。它提供了显示网格以及相关的预处理器和后处理器数据的灵活方式。

        从开发人员的角度来看,只要遵循以下准则,就可以很容易地将MeshVS组件集成到任何与网格相关的应用程序中:从MeshVS_DataSource类派生数据源类。

        重新实现其虚拟方法,以便让MeshVS组件访问应用程序数据模型。这是工作中最重要的部分,因为可视化性能受数据源类的数据检索方法性能的影响。

        创建MeshVS_Mesh类的实例。

        创建数据源类的实例,并通过SetDataSource()方法将其传递给MeshVS_Mesh对象。

        创建一个或多个MeshVS_PrsBuilder派生类的对象(标准对象,包含在MeshVS包中,或您的自定义对象)。

        每个PrsBuilder都负责以指定为PrsBuilder构造函数参数的特定显示模式绘制MeshVS_Mesh表示。MeshVS类将显示模式视为位标志的组合(两个最低有效位用于编码标准显示模式:线框、着色和收缩)。

        将这些对象传递给MeshVS_Mesh::AddBuilder()方法。MeshVS_Mesh利用了改进的选择高亮显示机制:它在所谓的“荧光笔”对象的帮助下高亮显示其选定的实体本身。借助AddBuilder()方法的相应参数,可以将PrsBuilder对象之一设置为荧光笔。

MeshVS_Mesh对象的视觉属性(如着色颜色、收缩系数等)通过MeshVS_Drawer对象进行控制。它维护一个映射“Attribute ID-->Attribute value”,并且可以使用任意数量的自定义属性轻松扩展。

        在所有其他方面,MeshVS_Mesh与从AIS_InteractiveObject派生的任何其他类都非常相似,应该相应地使用它(请参阅文档中对AIS包的描述)。

Open CASCADE Technology: Visualization

你可能感兴趣的:(OCCT,图形渲染,交互)