首页 > 其他分享 >Open Cascade 中的 AIS_InteractiveContext、V3d_Viewer 与 V3d_View 之间的关系

Open Cascade 中的 AIS_InteractiveContext、V3d_Viewer 与 V3d_View 之间的关系

时间:2022-11-15 17:02:53浏览次数:73  
标签:InteractiveContext Viewer GUI AIS V3d Context 交互 3D

转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16892989.html

1. 前言

本想通过 Context 与 Viewer 的多对一关系尝试实现三维视图图层、图元分类管理的功能,但经过几次验证,尚未找到可行的方法

2. 三者之间的关系

如下图所示:

图1. Context Viewer View 三者之间关系

图中的各命名分别表示: 

Context: AIS_InteractiveContext
Viewer: V3d_Viewer
View: V3d_View
GUI: 与实现相关,交互界面,如 Qt 中的QWidget
OpenGL: OpenGl_GraphicDriver

 

 Viewer:3D查看器。建立用户 GUI 与OpenGL 之间的连接,处理渲染,如着色、光照、投影方式等,同一个3D 查看器可以被多个交互场景使用,可实现多个场景的快速切换。

Handle(OpenGl_GraphicDriver) graph_driver = new OpenGl_GraphicDriver(aDisplayConnection);
Handle(V3d_Viewer) viewer = new V3d_Viewer(graph_driver);
// 默认是 Graphic3d_TypeOfShadingModel_Phong
viewer->SetDefaultShadingModel(Graphic3d_TypeOfShadingModel_Phong);
viewer->SetDefaultShadingModel(Graphic3d_TypeOfShadingModel_Unlit);
viewer->SetDefaultShadingModel(Graphic3d_TypeOfShadingModel_PhongFacet);
viewer->SetDefaultShadingModel(Graphic3d_TypeOfShadingModel_Gouraud);
viewer->SetDefaultShadingModel(Graphic3d_TypeOfShadingModel_Pbr);
viewer->SetDefaultShadingModel(Graphic3d_TypeOfShadingModel_PbrFacet);

图2. 不同光照渲染效果

Context:交互场景。负责管理显示对象(或称图元),例如显示模型、显示网格、处理模型选择等。初始化时必须指定一个 3D查看器,也就是说必须告诉交互场景以何种方式显示其中的各个图元。

Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext(viewer);
for (size_t i = 0; i < _contexts.size(); i++) // Viewer->Context 1对多
{
    _contexts[i] = new AIS_InteractiveContext(viewer);
    _contexts[i]->SetDisplayMode(1, false); // Shaded
}
context->SetDeviationCoefficient(0.001); // 设置构造渲染数据时的误差系数

View:3D视图。由 3D查看器创建的具体视图,以特定的相机视角显示Viewer渲染后的图元。一个3D查看器可以创建多个多个视图,例如以不同的相机视角、不同的缩放比例显示同一个场景(当前激活场景)中的图元。可参考文章Open Cascade 多视图-多个3D视图

Handle(V3d_View) view = viewer->CreateView()

在图1可中,AIS_ViewController 是OCC升级新增的一个交互工具类,用于处理3D视图GUI线程和渲染线程之间的交互事件,如鼠标旋转、框选等操作,建立了 View 与 Context 之间的直接联系。

因此,GUI 对 3D视图 View 的鼠标悬浮、点击等交互操作通过 AIS_ViewController 传递给 Context 进行处理,对应地分别响应为高亮、选中等显示效果,并将更新后的交互场景由 Viewer 刷新至 View 中。

AIS_ViewController::FlushViewEvents(allContexts[0], myView, true); // GUI 事件由 allContexts[0] 响应
AIS_ViewController::FlushViewEvents(allContexts[1], myView, true); // 2
AIS_ViewController::FlushViewEvents(allContexts[2], myView, true); // 3

以上注释为 2、3的两行代码并不产生实际效果(参考最后实现效果),仍然只有 allContexts[0] 响应了 GUI 事件。直观理解:GUI 事件被一个交互场景 Context 处理后即被标记为“已处理”,不再向后传递,实际原理如何还需要再深究。

3. 测试验证

同一个3D查看器对应多个交互场景,各交互场景可显示、隐藏其中的所有图元。按图元类型分别创建多个交互场景:0-立方体Box, 1-圆环Torus, 2-坐标系Trihedron, 3-球体Spherre, 4-PointCloud点云(点云的生成即不同显示效果可参考Open Cascade 7.7.0:新功能-模拟三维扫面点云-BRepLib_PointCloudShape),实现的效果如下:

图3. GUI 事件仅被一个交互场景 Context 处理

 上图中,通过点击左上角按钮 随机生成不同类型的图元数据,并按类型将图元数据放置到不同的交出场景 Context 中。左下角按钮 用于显示或隐藏其对应的 Context 中的所有图元。

从图中可以看出只有球可以被选中,无法选中立方体、圆环等其他物体。而球类型的图元放置在 _contexts[3] 中,在 Qt GUI 的重绘事件中如下实现:

void GUIView::paintEvent(QPaintEvent*)
{
    myView->InvalidateImmediate();

    FlushViewEvents(allContexts[3], myView, true);
    FlushViewEvents(allContexts[1], myView, true); // 实际不产生效果
}

结论:无法将 GUI 事件直接传递到多个交互场景 Context 中。

源代码地址

参考资料

1. OCC用户文档:V3d_Viewer Class Reference - Open CASCADE Technology Documentation

2. OCC用户文档:AIS_InteractiveContext Class Reference - Open CASCADE Technology Documentation

3. OCC用户文档:Open CASCADE Technology: AIS_ViewController Class Reference

4. OCC已被废弃的功能——Local Context removal - Forum Open Cascade Technology

 

转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16892989.html

标签:InteractiveContext,Viewer,GUI,AIS,V3d,Context,交互,3D
From: https://www.cnblogs.com/mechanicoder/p/16892989.html

相关文章

  • WPF 的 FlowDocumentScrollViewer滚动到最底下的方法
    官网上好像并没有直接给相应的接口和方法。发现一种有效的方法:先说方法:ScrollViewersv=flowScrollViewer.Template.FindName("PART_ContentHost",flowScrollViewer)......
  • Visio绘图文件阅读器:VSD Viewer for Mac
    VSDViewerforMac版是mac上一款非常强大的Visio绘图文件阅读器,它为打开和打印Visio文件提供了简单的解决方案。可以显示隐藏的图层,查看对象的形状数据,预览超链接。还可以......
  • 二进制查看器 Binary Viewer
     BinaryViewer是一款专业的二进制查看器,它能显示数据以十进制,八进制,十六进制和文本(ASCII码或统一的字符编码标准)的格式。能查看任何文件的二进制代码,支持直接编辑文件的......
  • lui - imageViewer - 图片查看器
    imageViewer-图片查看器ImageViewerTableAttributes参数说明类型可选值默认值urlList图片列表Array—[]onChange图片切换、缩放、旋转回调函数......
  • Java: Image Viewer Frame
     /***版权所有2022涂聚文有限公司*许可信息查看:*描述:*CoreJava,VolumeI:Fundamentals,TwelfthEditionbyCayS.Horstamnn*CoreJava,VolumeII:......
  • v-viewer图片预览插件使用
    链接:https://www.jianshu.com/p/1fd3b4e6911c今天介绍一款用于图片浏览的Vue组件,支持旋转、缩放、翻转等操作,它是基于viewer.js做的二次开发,我感觉用起来挺方便的,Github......
  • 操作uiautomateviewer工具报错:Error while obtaining UI hierarchy XML file: com.and
    报错信息如下:ErrorwhileobtainingUIhierarchyXMLfile:com.android.ddmlib.SyncException:Remoteobjectdoesn'texist!ErrorwhileobtainingUIhierarchyXML......
  • idea 查看类的字节码信息( jclassLib Bytecode viewer插件、javap tools)
    idea查看类的字节码信息第一种方式:IntelliJIDEA--Preferences---Plugins安装插件:jclassLibBytecodeviewer第二种方式:IntelliJIDEA--Preferenc......
  • RDLC报表设计1: 添加ReportViewer Control
    https://docs.microsoft.com/en-us/sql/reporting-services/application-integration/integrating-reporting-services-using-reportviewer-controls-get-started?view=sql......
  • element图片预览el-image-viewer
    el-image-viewer竟然可以单独使用,真不错1、引入el-image-viewer组件importElImageViewerfrom'element-ui/packages/image/src/image-viewer'components:{ElImageVie......