转自:http://blog.csdn.net/wang15061955806/article/details/51603083
相机与视图
    osg::Camera类用来管理OSG中的模型——视图矩阵,相机的管理主要通过各种变换来实现的。
    osgViewer::Viewer为一个单独的场景scene保存一个单独的view,单视图的管理是通过osgViewer::Viewer来实现的。在osgViewer::Viewer中,只允许单视图,单视图可以同时包含多个相机渲染,也可以在多窗口中渲染。为了能够进行正常的渲染,还需要创建一个图形环境(默认的情况下已经创建了一个)。有时为了方便控制场景渲染,需要设置一个合适的图形环境窗口。
    osg::View主要用来管理所有的相机视图。它包含一个主相机和N个从属相机(Slave)。如果View仅有一个主相机,则该主相机用来负责控制和渲染场景视图。如果包含从属相机,则主相机用来负责控制管理视图,从属相机用于渲染场景。
    osgViewer::View:可以挂节事件、处理事件、并负责创建相机和创建图形环境窗口。
    osgViewer::ViewBase:具有管理渲染的线程、负责设置线程模式、启动相关线程等功能。
    osgGA::GUIActionAdapter类:GUI动作适配器,用来向系统发送一些请求,以实现一些特定的操作。这也是GUI时间适配器的主要组成部分之一。
    一个视景体可以包含一个主相机和多个从相机,setUpViewInWindow()的作用是根据给定的窗口参数来创建一个图形设备。
 
    osg::DisplaySetting保存了与图形显示,尤其是立体显示有关的所有信息。
 
    了解整个屏幕的分辨率可以用这个类:osg::GraphicsContext::WindowingSystemInterface意思是说系统接口,可以获得当前环境的各种信息。有一方法加getScreenResolution,可以得到分辨率。
 
    Camera::SetViewport决定了相片也就是图像的大小;osg::GraphicContext::Traits的Width,Height定义了在屏幕上显示的相框的大小。一般viewport和相框一样大,如果viewport大于相框,则在相框中只显示一部分场景;如果viewport小于相框,相框中会有一部分的空白。
 
    场景节点树是通过场景中的一个或多个相机节点Camera来进行管理的,不属于任何相机的场景节点无法用于渲染过程;图形设备(GraphicContext)则表示相机的底层图形窗口或者缓存,并且传递了各种各样的交互事件;视图(View)和视景器(Viewer和CompositeViewer)负责将相机节点及其子树应用与系统的仿真过程,并加载漫游器、交互事件处理器和各种场景浏览的辅助部件。它们共同完成了场景数据的管理和用户交互的系统前端工作。
   而系统前端与渲染后台的接口,也就是即将介绍的渲染器(Renderer)和场景视图(SceneView),则需要完成以下几个功能:
      1、将场景节点树传递给CullVisitor,以裁剪场景信息并生成后台的状态树和渲染树。
      2、接下来,按照顺序遍历渲染树,执行各个渲染叶的绘制,将结果输出到图形设备。
      3、监控前端数据更新和后台裁剪渲染的过程,避免产生数据变度的冲突。
      4、如有可能,采取多线程、多CPU的方式来实现整个工作流程。
  渲染器为相机节点树与渲染后台之间提供了一个公共的接口。当向场景中添加一个新的相机(Camera)时,一个与之关联的渲染器(Renderer)也会被自动创建;而当我们准备执行场景的裁剪和绘制时,渲染器会负责传递场景与用户数据,进而交由系统后台执行裁剪与绘制工作。
  同时,渲染器派生子Operation类,也就是说它属于一种用户操作,可以追加到操作线程OperationThread和GraphicThread中,进而可以在图形设备或相机节点的线程中运行,完成多线程环境下的渲染接口操作。
 
  渲染器并没有直接将场景节点传递到裁剪访问器,也不负责记录渲染树或状态树的节点数据,它自动创建并保存的osgUtil::SceneView对象,也就是场景视图对象,才是裁剪和绘制工作的真正执行者。
  这里有一个值得注意的设计理念:OSG中,与用户直接交互的系统前端工具——GraphicsWindow、View、Viewer、CompositeViewer 以及Render,均通过osgViewer库进行定义;而渲染后台的功能类,包括CullVisitor、StateGraph、RenderLeaf、RenderStage、RenderBin,以及即将介绍的SceneView,均为osgUtil库的组成部分。换句话说,任何用户都可能使用自己系统前端替代osgVIewer内容,并通过操作SceneView实现对渲染后台的调用;而高级使用者甚至可以考虑使用另外的渲染后台,配合OSG的场景结构和交互系统来实现渲染,当然这较为麻烦一些。

OSG相机与视图的更多相关文章

  1. [osg]OSG相机添加动画路径

    查看osg坐标系,camare默认姿态:http://www.cnblogs.com/lyggqm/p/8073688.html 首先搞清楚osg的坐标系以及osg::camare的默认姿态 下代码面 ...

  2. OSG的HUD抬头文字显示

    原文:http://blog.csdn.net/tmljs1988/article/details/7562926 可以运行 1.       HUD流程图: 完整源代码如下: /*OSG中的HUD, ...

  3. [osg][osgEarth][原]基于OE自定义自由飞行漫游器(第二版)

    在初级版上,进行新的漫游方式调整 头文件: #pragma once //南水之源 20180101 #include <osgGA/CameraManipulator> #include ...

  4. [osg][osgEarth][原]基于OE自定义自由飞行漫游器(初级版)

    由于受够了OE的漫游器,想搞个可以在全球飞行的漫游器,所以就做了一个: 请无视我的起名规则······ 类头文件:EarthWalkManipulator.h #pragma once //南水之源 ...

  5. [osg][原]自定义osgGA漫游器

    相机矩阵变化基础:http://blog.csdn.net/popy007/article/details/5120158 osg漫游器原理:http://blog.csdn.net/csxiaosh ...

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

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

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

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

  8. OSG入坑之路[转]

    转载自:https://segmentfault.com/a/1190000010506374?utm_source=tag-newest osg插件原理:https://blog.csdn.net/ ...

  9. 相机标定:关于用Levenberg-Marquardt算法在相机标定中应用

    LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在 ...

随机推荐

  1. 导入和导出eclipse代码格式化模板

    导入和导出eclipse代码格式化模板 导出格式化代码模板:

  2. lnmp环境应用实践

    LNMP 用户通过浏览器输入域名请求nginx web服务,如果请求时静态资源,则由nginx解析返回给用户:如果是动态请求(.php结尾),那么nginx就会把它通过FastCGI接口(生产常用方法 ...

  3. HTTP客户端之使用request方法向其他网站请求数据

    在node中,可以很轻松的向任何网站发送请求并读取该网站的响应数据. var req=http.request(options,callback); options是一个字符串或者是对象.如果是字符串 ...

  4. Android:ScrollView和SwipeRefreshLayout高度测量

    今天组里的同事要做一个奇葩的效果,要求在ScrollView里嵌套一个RefreshLayout.类似代码如下: <?xml version="1.0" encoding=& ...

  5. wget 技巧

    最近用到一个命令wget,有一个技巧分享一下. [root@py ~]# wget -m -k http://www.example.com 可以将示例网站整个打包,作为本地镜像.

  6. 浪潮openStack云

  7. 在C#中控制ListBox某一行的字体颜色

    例1 private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add("红色"); listBox ...

  8. <转>Linux环境进程间通信(五): 共享内存(下)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html 系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通 ...

  9. shell编程——变量子串的常用操作

    ${#字符串} 返回字符串的长度 [root@localhost ~]# a=length [root@localhost ~]# echo ${#a} 6 ${字符串:位置x} 从位置x开始往后截取 ...

  10. 第1章WCF简介(WCF全面解析读书笔记2)

    第1章 WCF简介 面向服务架构(SOA)是近年来备受业界关注的一个主题,它代表了软件架构的一种方向.顺应SOA发展潮流,微软于2006年年底推出了一种新的分布式通信框架Windows Communi ...