那我们回到ViewerBase::frame函数中来,继续看看为什么osg生命刚刚出生的时候会大哭,除了初始化了eventQuene和cameraManipulator之外还对那些器官进行了初始化。在这之前我们先介绍一下上一节说到的osg的肢体或者器官但是没有展开介绍的。

前言

osgGA::GUIEventAdapter,GUI事件适配器。它就是对所有平台windows linux mac平台上的鼠标、键盘、以及其他的窗口事件进行了封装,目的是使接口统一,用户在使用osg库的时候不用再自己区分平台,直接调用GUIEventAdapter就可以得到平台发过来的事件信息。特别是我们处理自定义的EventHandler事件处理器的时候重写handler (const osgGA::GUIActionAdapter &ea ,osgGA::GUIActionAdapter &aa)的时候一定会用到。

osgGA::GUIActionAdapter,这个内脏器官的用处比较多。我们慢慢的说。作用:定义GUIEventHandlers可以请求使用GUI操作系统的动作的抽象接口类。这些动作请求应该遵守用户所使用平台的GUI工具包的规范。例如当一个GUIEventHandler处理一个鼠标事件的时候,它希望去请求GUI,例如当一个模型被’抛出’---(使用TrackballManipulator,按住鼠标右键快速移动,然后松开右键类似抛出物体的动作)时,这个TrackballManipulator可能希望启动计时器,并重复调用,以持续刷新摄像机的位置和方向。但是,它无法做到这一点,因为它对它运行的窗口系统一无所知。得不到任何支持。相反,GUIEventHandler可以通过GUIActionAdapter发出自己的请求,然后使用这个GUI系统的viewer应该遵循这些请求。当然GUIActionAdapter的功能不只是这些,再例如我们上一节也看到了osg::Viewer::View的其中一个基类就是GUIActionAdapter,而osgViewer::View又是osgViewer::Viewer的基类,所以我们可以GUIActionAdapter强转成osgViewer::Viewer.这种使用方式一般也是在处理自定义的EventHandler事件处理器的时候重写handler (const osgGA::GUIActionAdapter &ea ,osgGA::GUIActionAdapter &aa)的时候会用到。

说了两个概念性的东西,有可能比较枯燥,但是技术类工作就是这样,每每在学习一种新的技术或者了解他背后的原理的时候,我们要耐下性子,一步一步来。只有把每一步都搞清楚弄明白我们在能继续前进不至于迷失了方向。

osgViewer::Viewer::isRealized()

我们再此回到我们的解剖课中继续探究osg类物种,osgViewer::ViewerBase::frame()中的下一步就是判读viewer是否已经被实现了,如果没有那么就要实现这个viewer。所以我们要到osgViewer::Viewer::isRealized()函数。主要功能就是这个从这个viewer中得到渲染的上下文,并且判断他们是否被实现。渲染上下文我们应该都很了解,如果您用过qt+osg一定会有这么一个过程,创建一个camera的过程需要指定操作系统的窗口属性,这个渲染的上下文就在这里指定。那我们就去osgViewer::Viewer::getContexts()下看看怎么来得到所有的GraphicsContext()。

osgViewer::Viewer::getContexts()。我们还是老规矩,看看这个新的动作中涉及到那些新的内脏,osg::GraphicsContext。就是图形设备对应的载体,或者说GraphicsContext是任意图形子系统的抽象接口,它提供了统一的图形设备处理函数,用来实现渲染结果和底层设备的交互。图形设备对象的主要工作是提供场景渲染结果的载体,这个载体可以显示缓存,进而绘制到一个图像窗口中,也可以是其他特殊的缓存对象,从而实现复杂的渲染和图像多次曝光等功能,创建一个图像设备不能简单地使用new运算符,因为GraphicContext类是一个不能被实例化的抽象类(这个体现在valid()等一大批纯虚函数上);通常应当使用createContext()静态函数,自动根据当前的用户环境和特性参数traits,构建一个平台相关的图形设备对象。然后绑定到摄相应的像机上。

1
2
3
osg::ref_ptr gc = osg::GraphicsContext::creteGraphicsContext(traits)
 
camera-> setGraphicContext(gc);

所以在osgViewer::Viewer::getContexts()中通过_camera->getGraphicsContext()来得到图形设备对象。

osgViewer::Viewer::getContexts()。我们又遇到了新的不认识的小零件,osg::Slave代表了主相机下的一个跟随相机,以及视图矩阵。我们在前面已经介绍过了osg::View中定义了所有的相机,当场景中只有一个主相机时,那么它即是主导也是场景的渲染器,但是有了从相机,那么主相机将视图控制到场景,而从属相机负责实现场景的渲染。所以osg::Slave中也会包含osg::GraphicsContext,也要中所有的从相机getSlaves()中得到所有的GraphicsContext。并判断他们是否可用GraphicsContexts->vaild()。这样就介绍完了viewer->getContexts().

回到Viewer::isRealized()函数中,再往下就是确定这些得到的所有的图形设备是否已经初始化完成准备被使用。

1
Osg::GraphicsContext::isRealized() const { return isRealizedImplementation();};

也就继承自Osg::GraphicsContext的类或者说Osg::GraphicsContext封装的底层的设备接口类中,这些类一般都在osg::Viewer::api下定义。这些类的仔细介绍我们会稍后进行讲解。这样我们就完成了ViewerBase::frame()一呼一吸动作中的第二个拆解动作isReallized()介绍。

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

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

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

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

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

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

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

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

  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. elastastic search

    curl -X PUT "10.97.184.40:9200/logstash-2015.05.18" -H 'Content-Type: application/json' -d ...

  2. el-js中循环遍历el的集合

    遇到问题的代码: var score=0; for(var i=0;i<${fn:length(tMovie.tComments) };i++){ score=${tMovie.tComment ...

  3. Eclipse 合并GIT分支

    合并GIT分支: 1.  切换到主分支: 2.  右击项目——Team——Merge…: 3.  在弹出的Merge框中选择要合并的分支——Merge: 4.  合并后如果出现冲突,右击项目——Tea ...

  4. kangle请求控制添加的add_header怎么查看

    请求控制里添加的add header不会显示在浏览器的请求里,因为是发送给源的,你们要查看可以用phinfo查看.回应控制里添加的会显示在浏览器的回应里

  5. metasploit framework(二):记一次入侵

    msfconsole use 其中一个 exploit前台执行注入 后台执行shell 加-j 通过sessions查看后台执行的shell,可以看到这个会话的id号为2 进入会话,sessions ...

  6. mysql 定时备份任务

    备份方案: 本地备份并同步至远程服务器,保留30天数据 1. 本地数据库备份,备份数据库gold_ecooy,naiang#!/bin/bash#xliang#Created Time: 2018-1 ...

  7. 无法加载DLL"***.dll":找不到指定的模块

    加载dll的路径不对. 绝对路径不合适,可以换成相对路径. 比如: 把dll放入bin目录下的debug或者release下,然后就可以直接“test.dll”了.不用加路径了. 注意:路径必须与发布 ...

  8. 每月IT摘录201812

    技术 1.JVM.Java并发.NIO.网络通信,这些都是一个java工程师必须具备底层技术素养. 2.关于技术广度.消息中间件.分布式缓存.海量数据.分布式搜索.NoSQL.分布式架构.高并发.高可 ...

  9. Kubernetes 之上的架构应用

    规划并运转一个兼顾可扩展性.可移植性和健壮性的运用是一件很有应战的事情,尤其是当体系杂乱度在不断增长时.运用或体系 本身的架构极大的影响着其运转办法.对环境的依靠性,以及与相关组件的耦合强弱.当运用在 ...

  10. centos 6 KVM 网卡桥接配置

    一. 网卡桥接前准备 1.软件支持: # rpm -qa bridge-utils # yum install bridge-utils       确保软件包已安装 2. 关闭NetworkMana ...