探索未知种族之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 ...
随机推荐
- Python之路 - 网络编程之粘包
Python之路 - 网络编程之粘包 粘包
- NTKO OFFICE文档控件
目录 前言 什么是ntko 准备工作 实战演练 总结 一.前言 Web开发中经常需要用到在线处理office文档的功能,现在市面上有一些常用的Web页面调用显示Office的控件技术,用起来很方便. ...
- 文字在线转图片二维码的公用API接口
在线生成网址二维码的API接口: 1.百度网盘(可使用https) http://pan.baidu.com/share/qrcode?w=150&h=150&url=ht ...
- MATLAB GUI图片添加背景
global im [filename,pathname]=uigetfile('*.jpg','输入图片'); file=strcat(pathname,filename); im=imread(f ...
- Spring AOP @Aspect
spring提供了两个核心功能,一个是IoC(控制反转),另外一个便是Aop(面向切面编程),IoC有助于应用对象之间的解耦,AOP则可以实现横切关注点(如日志.安全.缓存和事务管理)与他们所影响的对 ...
- Socket通讯-Netty框架实现Java通讯
Netty简介 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty ...
- 无线渗透wep加密路由器
停掉网络服务 service network-manager stop 检查现在的环境适不适合使用airmon-ng airmon-ng check 杀死可能冲突的进程 开启网卡monitor模式 a ...
- phpunit 生成三种日志文件的配置方法
#目录结构 windows bin目录下 ├── phpunit.phar ├── phpunit.cmd ├── phpunit.xml ├── build.xml ├── ArrTest.php ...
- HTML5 WebSocket 权威指南 学习一 (第二章 WebSocket API)
WebSocket 协议两种URL方案 ws 客户端和服务器之间的非加密流量 wss 客户端和服务器之间的加密流量 WebSocket Secure 表示使用传输层安全性(SSL)的WebSocket ...
- 织梦 列表页 list标签 按照自已设置的方式排序
一.可以按照权重排序 降序排序 desc 1.添加的文章默认权重是自动加1,所以只要把想置顶的文章权重设置很高,如10000 2.{dede:list pagesize='12′ orderby='w ...