那我们就开始处理这些事件中得到的所有的交互事件,首先我们要判断这些事件是否包含osg的退出事件,那什么情况下会触发这个退出事件呢?如果您运行过osg中example中的小例子的,聪明的你一定就会发现当按下esc时就会退出osg。所以osg中默认的退出事件就是由esc触发的。当然我们也可以通过ViewerBase::setQuitEventSetsDone 设置是否允许按下某个键之后直接退出这种做法, 同时还可以使用另一个函数 ViewerBase::setKeyEventSetsDone 来设置自定义的退出键。

_eventVisitor->setFrameStamp(getFrameStamp());_eventVisitor->setTraversalNumber(getFrameStamp()->getFrameNumber());for(osgGA::EventQueue::Events::iterator itr = events.begin();itr != events.end();++itr){osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();if (!event) continue;_eventVisitor->reset();_eventVisitor->addEvent( event );getSceneData()->accept(*_eventVisitor);// Do EventTraversal for slaves with their own subgraphfor(unsigned int i=0; i<getNumSlaves(); ++i){osg::View::Slave& slave = getSlave(i);osg::Camera* camera = slave._camera.get();if(camera && !slave._useMastersSceneData){camera->accept(*_eventVisitor);}}// call any camera event callbacks, but only traverse that callback, don't traverse its subgraph// leave that to the scene update traversal.osg::NodeVisitor::TraversalMode tm = _eventVisitor->getTraversalMode();_eventVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);if (_camera.valid() && _camera->getEventCallback()) _camera->accept(*_eventVisitor);for(unsigned int i=0; i<getNumSlaves(); ++i){osg::View::Slave& slave = getSlave(i);osg::Camera* camera = slave._camera.get();if (camera && slave._useMastersSceneData && camera->getEventCallback()){camera->accept(*_eventVisitor);}}_eventVisitor->setTraversalMode(tm);}

我们还是先来看一下其中一些新认识的成员。_eventVisitor:, 为了正确地遍历场景的节点和几何体对象,并执行所有可能的事件回调和更新回调, OSG 使用访问器(Visitor)机制来处理场景图形的访问工作。这其中,_eventVisitor 就是负 责管理事件回调的遍历工作的。在事件循环中主要是的访问器主要是通过setEventCallback来设置Drawable对象中的事件回调的。在事件回调的处理函数中(operator()或者 event),我们可以通过读取第二个传入参数, 并调用 EventVisitor::getEvents 函数来获取当前发生的事件。所有的交互和系统事件都会一次 又一次地触发事件回调,因此编写这个回调的内容时请一定要慎重,不然会大幅度地降低系 统的性能。

那我们回到osgViewer::eventTraversal函数中,首先我们需要设置当前的处于那一帧中,并进行统计,下一步就是我们要遍历所有事件队列中的事件,并放到eventVisitor中。,OSG 还要转至主摄像机_camera 和从摄像机组 _slaves,再次执行它们的事件回调对象,依然使用访问器,但是设置访问器不要向下遍历节点(因为 Camera 同样可以作为场景 的一个中间节点),在访问过所有摄像机之后再恢复访问器的原有值。

for(osgGA::EventQueue::Events::iterator itr = events.begin();itr != events.end();++itr){osgGA::Event* event = itr->get();for(EventHandlers::iterator hitr = _eventHandlers.begin();hitr != _eventHandlers.end();++hitr){(*hitr)->handle( event, 0, _eventVisitor.get());}}for(osgGA::EventQueue::Events::iterator itr = events.begin();itr != events.end();++itr){osgGA::Event* event = itr->get();if (event && _cameraManipulator.valid()){_cameraManipulator->handle( event, 0, _eventVisitor.get());}}

然后在遍历场景节点并执行其事件回调之后,在遍历所有的相机操作中的handler函数。这样就基本完成了事件循环的遍历。最后,计算事件遍历的结束时间,将相关的时刻信息保存到记录器中。

原文链接 探索未知种族之osg类生物---呼吸分解之事件循环三

退出所有循环_探索未知种族之osg类生物---呼吸分解之事件循环三相关推荐

  1. 探索未知种族之osg类生物---呼吸分解之更新循环一

    上节总结 前几天我们大体上介绍完成了osg的事件循环的介绍,总结一下osg的时间循环主要就是得到平台(windows)的所有消息,并遍历所有的node的eventCallback,并对他们进行处理.接 ...

  2. 类的初始化列表_探索未知种族之osg类生物---渲染遍历之draw函数二

    我们今天今天真是进入SceneView::draw()函数. 1.判断主相机是否为隐藏状态也就是(camera->getNodeMask()==0),隐藏状态就会退出这个draw函数. 2.开始 ...

  3. osg动态加载模型不显示_探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介...

    我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...

  4. 探索未知种族之osg类生物---器官初始化四

    上一节我们对完成了对osg生物内部非常重要器官graphicsContext的初始化工作.这样就可保证我们场景中至少有一个graphicContext存在,不至于刚出生就面临夭折.我们根据上一节中os ...

  5. 探索未知种族之osg类生物---起源

    任何程序都是有生命的,是生命就需要呼吸.例如普通的windows程序,当运行完main()函数后,就需要进入消息循环,来监听用户的各种操作,以便做出及时的回应.这样的每次循环就像生命的每次呼吸,来维持 ...

  6. 探索未知种族之osg类生物---器官初始化一

    我们把ViewerBase::frame()比作osg这类生物的肺,首先我们先来大概的看一下'肺'长什么样子,有哪几部分组成.在这之前得对一些固定的零件进行说明,例如_done代表osg的viewer ...

  7. python程序多次运行_[Python]在一段Python程序中使用多次事件循环

    背景 我们在Python异步程序编写中经常要用到如下的结构 import asyncio async def doAsync(): await asyncio.sleep(0) #... if __n ...

  8. jsp循环输出表格_「翻译」JS可视化学习之七:Promise、事件循环和异步2

    喜欢排队吧,它能保护你的时间和精力 - 排队纪律维护员Event Loop Promise和事件循环概览图 请注意上面这张图,Promise和事件循环的那些事,将在这个图上缓缓展开. 微任务和(宏)任 ...

  9. es6 依赖循环_探索 JavaScript 中的依赖管理及循环依赖

    我们通常会把项目中使用的第三方依赖写在 package.json 文件里,然后使用 npm .cnpm 或者 yarn 这些流行的依赖管理工具来帮我们管理这些依赖.但是它们是如何管理这些依赖的.它们之 ...

最新文章

  1. java程序运行结果题_(Java程序设计)试题
  2. oracle 的行级触发器
  3. ES6 开发常用新特性以及简述ES7
  4. 向mvc controller传递json数组
  5. 阿里云云效如何保障双11大型项目管理
  6. 可以访问本地mysql服务器的命令是_在用户访问本地MySQL服务器时,访问命令可以省略“–h localhost”。...
  7. 快速排序法实战入门(推荐)
  8. 列转行 带逗号_Excel 统计压岁钱?按逗号拆分单元格且纵向排列,分离中文和数字...
  9. java自学一般要学多久?学会了有什么作用?
  10. 国产数据库--HighGo DB(瀚高数据库)
  11. 一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
  12. AD(altium designer)15原理图与PCB设计教程(六)——印制电路板设计的基础知识
  13. python输出字体的大小_Python之美——一只数据狗的笔记[长期更新]
  14. 读卡器插电脑不显示盘符
  15. TCGA官网下载和TCGAbiolinks下载的文件数量竟然不一样?
  16. c++ ado连接mysql数据库_C++使用ADO连接数据库及其实例
  17. 小学计算机资格证教案模板,小学数学教师资格证教学设计通用模板
  18. Latex: 使 tabular 居中
  19. 【C++新手教程】C++ 循环
  20. message提示框的三种显示方式

热门文章

  1. HDU2567 寻梦【输入输出流+水题】
  2. HDU2561 第二小整数【水题+序列处理】
  3. java 面试 —— java 基础
  4. 高级数据结构及应用 —— 使用 bitmap 进行字符串去重
  5. 学习 Perl(一) —— 安装及 hello world
  6. caffe 源码阅读与运行流程
  7. 软件安装下载的镜像站、国内源
  8. 迷宫问题(寻路)和状态空间搜索
  9. 中英文对照 —— 医学与医院
  10. Linux 符号链接与 inode