原文连接地址:http://www.osgchina.org/index.php?Itemid=490&id=134:usecompositiv&option=com_content&view=article

本文的目标是在向用户说明应该使用哪个Viewer。

类继承关系

对比两个类的类继承图差异是对类进行分析的有用的方法,从中可以明确的是osgViewer::Viewer只是一个osgViewer::View,而osgViewer::CompositeViewer是一个osgViewer::View序列,包含多个osgViewer::View。

慨念上的差别

基本解释

点击此链接中的文章 解释了二者慨念上的区别。

这篇针对CompositeViewer和Viewer的指导是从慨念和实践上的双重分析,如果没有点实践经验,会发现难以理解本文以及本文所提的一些情况和慨念。

我们来说一些基本慨念,这二者共同拥有的:View。一个View对应于一个物理世界,比如当你通过一个窗口来看一栋建筑时,很容易明白我们有一个view。当你有多个窗口来表示时,同样你可能也只说只有一个view,事实上你有多个窗口来表示这个view。也就是说view和窗口是没有必然的联系的。

osg::View/osgViewer::View几乎是相同的,它们都是和场景相关的view。这里的场景(scene)指的是osgViewer::Scene。View可以这么解释:当你有一辆车需要展示,你在驾驶位上,这样你有一个窗口和一个view,然而你需要同时关注其它的部位,需要单独列出来,比如后视镜,左视镜,甚至车外的第三人称视角,这些都单独的表现为一个camera,这些camera可能都分别拥有一个窗口,这无关紧要,但是这些camera都和view有关系,这个view有一个主的camera,其它都是slave(附属),主camera运动时(车开时),其它的camera也运动,也就是其它的camera相对于主camera只是有一个固定的偏移。这些所有的camera都属于一个view。正常情况下你只有一个camera,它就是主camera。

这里要值得特别注意的是,每个camera(slave)都可以有自己的scene。这个非常重要,它可以做很多的效果。比如distortion,看上去是一个view其实画面是由多个view渲染出来的,而那些view都要做自己的post render,所以它们必须有自己单独的scene用来放自己的shader数据。因此不管多少个slave,都是一个view,每个slave都可以有自己的scene。

上面的慨念可能会使你头大,但是这些都被封装的很好,通过类似于View::setUpViewAccrossAllScreens或者View::setUpViewFor3DSphericalDisplay来实现power walls(有很多显示屏)或者扭曲校正(球幕或环幕)。所有的都封装好了,以至于Viewer/CompositeViewer关于此做的复杂的相机之间的同步和线程安全你都不必关注。

如果要做球形显示,你可以看一下View::setUpViewFor3DSphericalDisplay。

何时使用Viewer呢,就是你是否只有一个View,比如你在开车,那就是只有一个view,你可以有一打的camera来实现其它的功能,此时你就需要一个Viewer,不需要CompositeViewer。何时需要CompositeViewer呢,那就是有多个view了,比如一个三维软件,它有不同的视图,而这些视图它又希望独立的控制,每个视图载入不同的模型或相同的模型,然后每个视图都能独立的操作,这就需要多个view了,也就是每个视图都有观察者,它们彼此独立,多view的场景出来了。使用CompositeViewer并需要使多view进行协同,有一定联系,那么这个程序就会变得比较复杂。

在邮件列表中的其它讨论

In the same thread, Mike Weiblen and Robert tried to sum up with this
analogy.

On Jan 19, 2008 12:28 AM, Mike Weiblen <mweib...@…> wrote:

1) an immersive car cockpit display: front windscreen, left/right side
windows, inside/outside rearview mirrors.
That indicates Viewer (even though the eye orientations are quiet
different, and also have some mirror flips)

Yep spot on, a clear case of a single conceptual view, as well as all the contributing cameras sharing the scene and being relative to the view's master camera - so both a conceptual fit as well as implementation one.

2) a 3rd-person stealth watching a UAV sensor platform: the UAV is
collecting sensor data from its viewpoint; an operator is watching the
UAV and a wireframe of its sensor volume sweeping the terrain. That
indicates CompositeViewer (the scene database could be identical, but
the sensor wont see its wireframe nor the UAV)

Yep spot on again, the viewer (the person the viewer as in the English language definition) has two views of a scene so conceptually we have two views of one scene, on the implementation side you'd want to control the viewpoint of these views separately as
well as some of the state - so again both a good conceptual fit as well as an implementation one.

Robert.

Example use cases

 

下面是大家使用viewer的一些经验之谈,你也可以加入自己的经验。

OSGVIEWER::VIEWER

程序运行在单一屏上单一场景

osgviewer 在一个屏幕上运行单一场景 (OSG_SCREEN=0 for example)

osgViewer::View::setUpViewOnSingleScreen(unsigned int screenNum = 0)
单一场景,但是有多个camera (using slave cameras)
  • osgviewer 使用用下面的语句会在所有的屏幕上运行,可以使用环境变量OSG_SCREEN来控制在哪个屏幕上运行
osgViewer::View::setUpViewAcrossAllScreens().

OSGVIEWER::COMPOSITEVIEWER

Application with multiple scenes

3D view along with a map or a radar/sonar view

OSG-CompositeViewer的更多相关文章

  1. 探索未知种族之osg类生物---起源

    任何程序都是有生命的,是生命就需要呼吸.例如普通的windows程序,当运行完main()函数后,就需要进入消息循环,来监听用户的各种操作,以便做出及时的回应.这样的每次循环就像生命的每次呼吸,来维持 ...

  2. [OSG]OSG例子程序简介

    1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.M ...

  3. 如何在osg中删除EventHandler

    最近在一个项目中需要动态的添加和删除EventHandler,添加的时候很顺利,使用view->addEventHandler()函数就可以了. 不过在删除的时候,出现点麻烦.   直接调用vi ...

  4. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  5. osg 笔记一 (转)

    场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息.根节点 ...

  6. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

  7. OSG多屏显示问题

    // testMultiScreen.cpp : Defines the entry point for the console application.// #include "stdaf ...

  8. [原][OSG]OSG例子程序简介

    1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.M ...

  9. [原][osg][QT]osg与QT界面结合的简单例子二

    //main.cpp #include "VREObliqueEditorQTWindow.h" #include <QtWidgets/QApplication> # ...

  10. [转][osg][QT]osg与QT界面结合的简单例子

    //QT += core gui opengl //LIBS += -losgViewer -losgDB -losgUtil -losg -lOpenThreads -losgGA -losgQt ...

随机推荐

  1. 搭建一个redis高可用系统

    一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...

  2. 视频(video)属性

    Figure 3视频相关的属性: 属性 值 描述  muted muted  定义音频的初始状态,目前仅支持muted.   crossorigin  空  定义当前视频是否是一个跨域的项目.  me ...

  3. 十三、IntelliJ IDEA 中的版本控制介绍(下)

    我们已经简单了解了 IntelliJ IDEA 的版本控制机制,那么接下来,就让我们一起看看在 IntelliJ IDEA 中进行具体的版本控制操作. 标注1:Checkout from Versio ...

  4. C#实现双向链表

    原文:http://www.cnblogs.com/skywang12345/p/3561803.html#a33 没有C#版本的..是不是很方..不过图和说明很好,引用一下 双向链表 双向链表(双链 ...

  5. webservice 从客户端中检测到有潜在危险的 Request.Form 值

    webservice中传递xml格式的参数时报错 webservice 从客户端中检测到有潜在危险的 Request.Form 值解决方案: 1.在web.config的system.web节点中添加 ...

  6. 每日笔记---使用@ConfigurationProperties读取yml配置

    每日笔记---使用@ConfigurationProperties读取yml配置 参考地址  https://www.cnblogs.com/mycs-home/p/8352140.html 1.添加 ...

  7. Java关于NIO类的详解

    一.IO与NIO的区别: 前提我们先说一说java IO: Java中使用IO(输入输出)来读取和写入,读写设备上的数据.硬盘文件.内存.键盘......,根据数据的走向可分为输入流和输出流,这个走向 ...

  8. IOS 枚举 enum

    前言:oc中枚举的正确使用,可以增强代码的可读性,减少各种“错误”,让代码更加的规范.下面先介绍枚举的用法,最后介绍个人对枚举的理解,什么是枚举,为什么用枚举. 一. OC中,枚举的使用 1. 写法1 ...

  9. DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池

    DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池 liuyuhang原创,未经允许禁止转载  系列目录连接 DB数据源之SpringBoot+Mybatis踏坑 ...

  10. Office365完整离线安装包下载及自定义安装教程

    Office 365是微软打造的一款适用于教育机构使用的office办公软件,这里为大家提供了一个Office 365离线安装包下载工具,让office 365离线包下载到本地再安装,而不是联网下载安 ...