Open Cascade 中的 AIS_InteractiveContext、V3d_Viewer 与 V3d_View 之间的关系
转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16892989.html
1. 前言
本想通过 Context 与 Viewer 的多对一关系尝试实现三维视图图层、图元分类管理的功能,但经过几次验证,尚未找到可行的方法。
2. 三者之间的关系
如下图所示:
图1. Context Viewer View 三者之间关系
图中的各命名分别表示:
Viewer:3D查看器。建立用户 GUI 与OpenGL 之间的连接,处理渲染,如着色、光照、投影方式等,同一个3D 查看器可以被多个交互场景使用,可实现多个场景的快速切换。
图2. 不同光照渲染效果
Context:交互场景。负责管理显示对象(或称图元),例如显示模型、显示网格、处理模型选择等。初始化时必须指定一个 3D查看器,也就是说必须告诉交互场景以何种方式显示其中的各个图元。
View:3D视图。由 3D查看器创建的具体视图,以特定的相机视角显示Viewer渲染后的图元。一个3D查看器可以创建多个多个视图,例如以不同的相机视角、不同的缩放比例显示同一个场景(当前激活场景)中的图元。可参考
。在图1可中,AIS_ViewController 是OCC升级新增的一个交互工具类,用于处理3D视图GUI线程和渲染线程之间的交互事件,如鼠标旋转、框选等操作,建立了 View 与 Context 之间的直接联系。
因此,GUI 对 3D视图 View 的鼠标悬浮、点击等交互操作通过 AIS_ViewController 传递给 Context 进行处理,对应地分别响应为高亮、选中等显示效果,并将更新后的交互场景由 Viewer 刷新至 View 中。
以上注释为 2、3的两行代码并不产生实际效果(参考最后实现效果),仍然只有 allContexts[0] 响应了 GUI 事件。直观理解:GUI 事件被一个交互场景 Context 处理后即被标记为“已处理”,不再向后传递,实际原理如何还需要再深究。
3. 测试验证
同一个3D查看器对应多个交互场景,各交互场景可显示、隐藏其中的所有图元。按图元类型分别创建多个交互场景:0-立方体Box, 1-圆环Torus, 2-坐标系Trihedron, 3-球体Spherre, 4-PointCloud点云(点云的生成即不同显示效果可参考
),实现的效果如下:图3. GUI 事件仅被一个交互场景 Context 处理
上图中,通过点击左上角按钮 随机生成不同类型的图元数据,并按类型将图元数据放置到不同的交出场景 Context 中。左下角按钮 用于显示或隐藏其对应的 Context 中的所有图元。
从图中可以看出只有球可以被选中,无法选中立方体、圆环等其他物体。而球类型的图元放置在 _contexts[3] 中,在 Qt GUI 的重绘事件中如下实现:
结论:无法将 GUI 事件直接传递到多个交互场景 Context 中。
。
参考资料
1. OCC用户文档:
2. OCC用户文档:
3. OCC用户文档:
4. OCC已被废弃的功能——
转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16892989.html