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

我们把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类生物---器官初始化一的更多相关文章
- 探索未知种族之osg类生物---器官初始化四
上一节我们对完成了对osg生物内部非常重要器官graphicsContext的初始化工作.这样就可保证我们场景中至少有一个graphicContext存在,不至于刚出生就面临夭折.我们根据上一节中os ...
- 探索未知种族之osg类生物---器官初始化三
当判断到viewer中没有一个graphicContext可用时,osg就会默认的进行一次对viewer的实现操作,这样可以保证osg以后可以安心的在屏幕上进行作画.那我们就来看看这个osgViewe ...
- 探索未知种族之osg类生物---器官初始化二
那我们回到ViewerBase::frame函数中来,继续看看为什么osg生命刚刚出生的时候会大哭,除了初始化了eventQuene和cameraManipulator之外还对那些器官进行了初始化.在 ...
- 《探索未知种族之osg类生物》目录
精力有限,博客园不在更新<探索未知种族之osg类生物>.在这里列出所有文章目录(持续更新)有兴趣的同学可以看看. 探索未知种族之osg类生物[目录] 前序 探索未知种族之osg类生物--- ...
- [转][osg]探索未知种族之osg类生物【目录】
作者:3wwang 原文链接:http://www.3wwang.cn/html/article_58.html 前序 探索未知种族之osg类生物---起源 ViewBase::frame函数中的Vi ...
- 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系
节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...
- 探索未知种族之osg类生物---起源
任何程序都是有生命的,是生命就需要呼吸.例如普通的windows程序,当运行完main()函数后,就需要进入消息循环,来监听用户的各种操作,以便做出及时的回应.这样的每次循环就像生命的每次呼吸,来维持 ...
- 探索未知种族之osg类生物---渲染遍历之器官协作
好了,现在我们经过三节的介绍我们已经大体上明确了单线程模型(SingleThreaded)下 OSG 渲染遍历的工作流程.事实上无论是场景的筛选render还是绘制cull工作,最后都要归结到场景视图 ...
- 探索未知种族之osg类生物---呼吸分解之事件循环一
事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...
随机推荐
- MySQL 各种主流 SQLServer 迁移到 MySQL 工具对比
原地址:https://www.cnblogs.com/overblue/p/5796887.html Mss2sql:这个比较好用
- 吴裕雄 11-MySQL查询数据
以下为在MySQL数据库中查询数据通用的 SELECT 语法:SELECT column_name,column_nameFROM table_name[WHERE Clause][LIMIT N][ ...
- 四,ViewSets和Routers
概述 在DRF中,允许在一个类中组合一组相关视图的逻辑,称为ViewSets.比如通过通用视图,可以定义列表视图.详情视图等等,但每个视图位于不同的类中,而通过ViewSets则可以将多个视图放在同一 ...
- linux安装node简单方法
1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过 uname -a ...
- soft selective sweeps 下的群体进化
1.Hard and soft selective sweeps 长期以来,快速适应主要与选择作用于高度多基因的数量性状有关,例如在育种试验期间.这些性状可以通过对大量已经存在的多态性的群体频率的微小 ...
- Avatar
[Avatar] 1.Retargeting of Humanoid animations Retargeting is only possible for humanoid models, wher ...
- mysql limit语句
[mysql limit语句] 代码: SELECT * FROM table LIMIT 2 OFFSET 1; 比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. ...
- MYSQL 插入数据乱码
1.最近在写电商项目 遇见过向数据库中加入数据乱码问题 最开始以为是,数据库的问题但是一看 没问题啊 于是又看了项目的默认编码,也没问题啊 那么问题来了,在哪出现了问题呢 于是 博主 在 tomact ...
- TOJ3448: 小学生的作业
Python字符串的插入操作 传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3448 ...
- Lua的闭包详解(终于搞懂了)
词法定界:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量,这种特征叫做词法定界 table.sort(names,functin (n1,n2) return grades[n1] ...