我们把ViewerBase::frame()比作osg这类生物的肺,首先我们先来大概的看一下‘肺’长什么样子,有哪几部分组成。在这之前得对一些固定的零件进行说明,例如_done代表osg的viewer是否被删除释放内存;_firstFrame代表是否是第一次进入frame函数。那么接下来我们会发现frame函数表面上组成结构非常简单,逻辑上也非常的清晰---先判断当前的viewer是否被删除,也就是判断是否died,如果已经died,那么肺的功能就不会进行。然后判断这个osg小孩是否刚刚出生,是的话就要执行一些初始化工作---嚎啕大哭。最后剩下的四个函数就是一个正常的osg生物的肺周而复始进行的工作。

我们一步步来,首先看看刚刚生下来的osg宝宝为什么会哭,对osg整体产生了什么样的影响。进入第一个函数viewerInit(),ViewerBase::ViewerInit是纯虚函数,代表他的实现由他的子类完成,上一节我们研究了osg生物两种存在形式时,就已经定义了目前正在进行工作的viewer是哪一个,所以我们直接到osgViewer::Viewer(是ViewerBase的子类)下看看他的ViewerInit函数。经过复杂的拆解工作,终于发现ViewerInit是在osgViewer::Viewer的头文件中定义并且实现的。并且它的功能非常简单就是简单的调用init()方法。而这个init方法又是在那个类里面定义的呢。Viewer类分别继承了osgViewer::ViewerBase以及osgViewer::View。Init既然在osgViewer::ViewerBase和osgViewer::Viewer中都没有记录,那么肯定是在osgViewer::View中定义和实现的。我们这里就有一个疑问Viewer和View到底有什么区别。从名字上我们有一个大概的区分Viewer视景器,View视图风景。简单的理解Viewer就是View的操作器,osgViewer::View就是持有场景中的一张景色。仔细的你们一定会发现osgViewer::View继承自osg::View以及osgGA::GUIActionAdapter. osgGA::GUIActionAdapter我们先不进行详解要不就跑偏太远了,先介绍osg::View. osg::View我们看作是场景中一系列相机的掌管者。好了。我们这些就先说到这里,赶紧趁着刚刚打开的osg的肺还有失去动力之前回去继续看看。

进入osgViewer::View::init()函数,这是一个新的身体零件,和研究frame()函数的思路一样,我们先认识它内部的固定零件:_eventQueue代表空的osg内的事件队列—这个我们以后再介绍,_cameraManipulator代表相机的操作方式—这个我们都会在进入frame()函数之前进行单独的指定。所以我们大体上也就大体了解了osgViewer::View初始化工作,就是创建一个名叫osgGA::GUIEventAdapter::FRAME的事件并放到_eventQueue中,以及对_cameraManipulator相机操作方式的初始化。不同的摄像机操作模式就会有不同的init函数,我们就对CameraManipulator::init()函数不进行介绍了--- 很简单。

这样我们就完成了对ViewerBase::frame()函数中第一个功能介绍完毕,总结一下。Viewer::viewerInit()函数就是完成了osg中事件队列的初始化以及相机操作器的初始化工作。当然这些工作之前,也就是进入frame函数之前必须先完成viewer以及相机的定义。但是osg库非常强大,即是你没有定义viewer以及camera他就会默认的按照约定的模式创建一组他们出来。

欢迎大家来我的新家看一看3wwang个人博客-记录走过的技术之路

探索未知种族之osg类生物---器官初始化一的更多相关文章

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

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

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

    当判断到viewer中没有一个graphicContext可用时,osg就会默认的进行一次对viewer的实现操作,这样可以保证osg以后可以安心的在屏幕上进行作画.那我们就来看看这个osgViewe ...

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

    那我们回到ViewerBase::frame函数中来,继续看看为什么osg生命刚刚出生的时候会大哭,除了初始化了eventQuene和cameraManipulator之外还对那些器官进行了初始化.在 ...

  4. 《探索未知种族之osg类生物》目录

    精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...

  5. [转][osg]探索未知种族之osg类生物【目录】

    作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...

  6. 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系

    节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...

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

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

  8. 探索未知种族之osg类生物---渲染遍历之器官协作

    好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...

  9. 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...

随机推荐

  1. mysql 模糊搜索

    [mysql 模糊搜索] like,%,_,[],[^] 参考:http://www.jb51.net/article/31904.htm

  2. db2 性能查看top sql

    DB2 V10.3    查看top sql ,类似oracle 这篇文章是对之前有篇db2 v9的简化更新,总体还是觉得DB2TOP比较好用直观,不过需要导出SQL时,或自动化脚本时,还是建议执行S ...

  3. weblogc SessionData.getNextId性能问题

    参考:https://www.cnblogs.com/lemon-flm/p/7396627.html weblogic运行中持续报weblogic.servlet.internal.session. ...

  4. Excel表格如何保护单元格不被修改

    Excel如何保护单元格不被修改  有时使用Excel时希望保护单元格不被修改,这可以叫做单元格的“写保护”即把光标定位在一个不允许输入数据的区域内时,是无论如何也无法在里面输入数据的.下面咱们就一起 ...

  5. Python基础之逻辑运算

    逻辑运算 概念: 优先级() > not > and > or print(2 > 1 and 1 < 4 or 2 < 3 and 9 > 6 or 2 & ...

  6. 一分钟了解Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi (转)

    转自:http://blog.csdn.net/a704755096/article/details/46342689 DPI:每英寸像素数 简单的屏幕分辨率计算方法: DisplayMetrics ...

  7. c++ 面试题(汇总)

    1,extern 关键字作用: http://www.cnblogs.com/lzjsky/archive/2010/11/24/1886686.html 2,static 关键字作用: https: ...

  8. pta l2-18(多项式A除以B)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805060372905984 题意:给定两个多项式,求出其做除法 ...

  9. openstack(Pike 版)集群部署(八)--- 连接Ceph Cluster 作为后端存储

    一.openstack Glance + ceph Cluster 部署: 博客:http://www.cnblogs.com/weijie0717/p/8563294.html 参考 续 部分.  ...

  10. SSH 连接很慢

    相信很多朋友在使用Linux系统的时候因为安全性的原因摒弃了telnet rlogin 或者 X-window,而把openssh作为自己默认的远程登录方式.然而经常会遇到的一个情况是telnet到s ...