草庐IT

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

Me伟 2023-03-28 原文

转载请注明原文链接: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

有关Open Cascade 中的 AIS_InteractiveContext、V3d_Viewer 与 V3d_View 之间的关系的更多相关文章

  1. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  2. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  5. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  6. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  9. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  10. ruby-on-rails - 在 haml View 中重构条件 - 2

    除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p

随机推荐