转自: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. Java 基本数据类型最大值极限和最小值极限

    想知道 Java 基本数据类型最大值极限和最小值极限,写个小程序就很容易知道. 测试 Integer, Long, Float 和 Double 的最大值和最小值,代码如下: public stati ...

  2. PyQt 5布局管理

    绝对定位 绝对定位有以下限制 1.如果调整窗口,控件的大小和位置不会改变 2.在各种平台上应用程序看起来不会一样 3.如果改变字体,我们的应用程序的布局就会改变 4.如果我们决定改变我们的布局,我们必 ...

  3. 3_python之路之商城购物车

    python之路之商城购物车 1.程序说明:Readme.txt 1.程序文件:storeapp_new.py userinfo.py 2.程序文件说明:storeapp_new.py-主程序 use ...

  4. OD 实验(六) - 对一个程序的破解

    程序: 双击进行安装,安装过程默认就好了 安装完成 运行程序 输入 User 为 sch01ar,点击 Create 点击 Log In 这里显示为未注册版本 看看未注册版本有哪些功能被限制 这里会显 ...

  5. cinder-backup详细介绍

    首先介绍Snapshot snapshot可以为volume创建快照,快照中保存了volume当前的状态,此后可以通过snapshot回溯 主要采用了Copy On Write算法.进行快照时,不牵涉 ...

  6. Android屏幕适配方案——基于最小宽度(Smallest-width)限定符

    转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...

  7. 小酌Jmeter4.0新版本特性

    1.  首先下载打开jmeter4.0,说一个能感受到的视觉变化,如图, 黑色界面,不少朋友认为做技术黑色的东西看起来高上大一点,虽然这个观念有点肤浅,但似乎也有点道理,毕竟还是有不少朋友热衷于lin ...

  8. jquery制作滚动条到一定位置触发

    $(function(){ var nav=$(".nav"); //得到导航对象 var win=$(window); //得到窗口对象 var sc=$(document);/ ...

  9. 使用Spring MVC创建 REST API

    1.REST的基础知识 当谈论REST时,有一种常见的错误就是将其视为“基于URL的Web服务”——将REST作为另一种类型的远程过程调用(remote procedurecall,RPC)机制,就像 ...

  10. Django models拆分

    大多数Django教程都是将models放在models.py文件(模块)中, 然而随着models类的增加, 将类放在一个文件中太混乱了, 于是将models做成一个package: 这样就可以将m ...