转自: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. MySQL添加数据库的唯一索引的几种方式~

    创建表时直接设置: DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (  `stu_id` int(11) NOT NULL AUTO_IN ...

  2. SQL Server 2008系统信息查询常用命令 查看表大小、记录数等

    1.返回所有数据库信息(数据库名,创建日期,存储路径等).   use master; GO select * from dbo.sysdatabases 2.返回当前数据库所有对象(可根据type字 ...

  3. OD 实验(十四) - 内嵌补丁

    内嵌补丁(inline patch): 内嵌补丁指在程序文件中把补丁代码写入文件里面达到破解的目的 如果修改某行语句会影响后面的语句,例如某语句占用 3 个字节,修改完变为 5 个字节,会覆盖后面的语 ...

  4. IDA Pro 权威指南学习笔记(十四) - 操纵函数

    IDA 无法定位一个函数调用,由于没有直接的方法到达函数,IDA 将无法识别它们 IDA 可能无法正确确定函数的结束部分,需要手动干预,以更正反汇编代码中的错误 如果编译器已经将函数分割到几个地址范围 ...

  5. Python模块学习 ---- datetime

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块我在之前的文章已经有所介绍,它提供的接口与C标准库time.h基本一致.相比于time模块, ...

  6. Tkinter Fonts(字体)

    Python GUI - Tkinter Fonts:作为一个tuple的第一个元素是字体家族,一个点的大小,可选择一个字符串,包含一个或更多的粗体,斜体,下划线的样式修饰符,加粗.   最多可能有三 ...

  7. Django-组件--用户认证Auth(auth_user增加字段)

    引入: from django.db import models from django.contrib.auth.models import AbstractBaseUser 源码 : from d ...

  8. Netty的ChannelHandler,ChannelHandlerContext,ChannelPipeline

    本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...

  9. maven surefire plugin介绍

    示例 <!-- 测试运行器,生成测试报告 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  10. 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序

    名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域              1全局名称空间 2 内置名称空间 局部作用域           ...