OSG相机与视图

转自: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),则须要完成如下几个功能:
      一、将场景节点树传递给CullVisitor,以裁剪场景信息并生成后台的状态树和渲染树。
      二、接下来,按照顺序遍历渲染树,执行各个渲染叶的绘制,将结果输出到图形设备。
      三、监控前端数据更新和后台裁剪渲染的过程,避免产生数据变度的冲突。
      四、若有可能,采起多线程、多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的场景结构和交互系统来实现渲染,固然这较为麻烦一些。
相关文章
相关标签/搜索