查看: 2715|回复: 7

关于osghud例子的疑问

[复制链接]

该用户从未签到

发表于 2008-12-19 20:51:50 | 显示全部楼层 |阅读模式
osghud例子里有这么一段:
       group->addChild(createHUD());
       // set the scene to render
        viewer.setSceneData(group.get());

将createHUD()得到的camera作为scene的子节点加到viewer里面,在例子里的效果和将camera直接加到viewer里面一样。

我有两个疑问:
首先,这种方法起作用的机制是什么,因为我发现按这种方法添加的camera并不在viewer的camera列表里,那么renderingTraversals是怎么进行渲染的?
另外,在应用方面,这种方法有什么特殊的用处吗,是不是就和一个带ABSOLUTE_RF,并且_useMastersSceneData为false的slave camera作用一样?

我看过robert关于osghud的一篇文章,但无法在里面找到答案,求教达人

该用户从未签到

发表于 2008-12-20 00:25:34 | 显示全部楼层
这个你可以理解为一个单视图主从相机的渲染过程~~~~~

该用户从未签到

发表于 2008-12-20 10:10:09 | 显示全部楼层
渲染遍历的时候会遍历整个节点树,如果遇到一个Camera节点,则它和它的子树都会按照这个Camera的设置进行渲染,这事实上是正规的添加摄像机窗口的方法。
Viewer的从摄像机组与之相比反而有些迷惑人了,从摄像机组的观察矩阵,投影矩阵与主摄像机始终是一致的,顶多有个偏移值,却不能设置单独的观察视角,这一点从osgcamera例子中可以看出来。另外注意场景的主摄像机不是由用户给出的,而是系统在setSceneData时自动创建的,作为整个场景树的根节点。

该用户从未签到

 楼主| 发表于 2008-12-20 13:57:54 | 显示全部楼层
多谢array的解释,仔细看过代码发现参与渲染过程的摄像机不取决于viewer的摄像机列表。
但我第二个问题还是不明白。
就如在osghud例子里展现的一样,当slave camera设置成ABSOLUTE_RF,并且_useMastersSceneData设为false时,可以分别实现独立的观察视角和独立场景。相关代码如下:
    // createhud()
   // set the view matrix   
    camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
    camera->setViewMatrix(osg::Matrix::identity());
    ...
    return camera;

    // main()
   osg::Camera* hudCamera = createHUD();
     viewer.addSlave(hudCamera, false);

那么我的疑惑是:假设我需要在同一个GraphicContext中,加入一组独立的摄像机视角,我是应该参照上面的代码设置不同的slave camera,还是把这些camera放在不同的view下并用compositeviewer管理,还是让这些camera不通过viewer而是作为独立的子节点加载在scene底下?从应用的角度看,它们的区别是什么?

呵呵,也不知道问题说清楚没

[ 本帖最后由 leon 于 2008-12-20 14:01 编辑 ]

该用户从未签到

发表于 2008-12-20 17:03:09 | 显示全部楼层
我想都是可以的,的确也有所不同。
设置从摄像机(slave camera)的时候,我记得是不使用独立的观察矩阵和投影矩阵的,从摄像机的观察视角始终与主摄像机相同,或者存在一个固定的偏移,其用途在osgcamera这个例子中可以充分体现出来。
设置CompositeViewer的时候,观察和投影矩阵是独立的,使用不同的场景树来保存场景数据,也就是程序中会存在多个场景根节点。但也可以把同一个根节点赋给每个Viewer的主摄像机,在设计诸如鹰眼图、雷达小地图的时候,这样可以直接在各个视图中表达同一个场景物体的位置,不用人为再做干涉。
设置Camera为子节点的时候,观察和投影矩阵也是独立的,显示在这个摄像机视角中的将是这个Camera的场景子树。这些场景子树的内容通常是各不相同的。

其中有些细节抱歉我没有去深究源代码,只是凭印象说的。从昨晚到现在都在发高烧呢~~见谅~~

该用户从未签到

 楼主| 发表于 2008-12-20 17:47:45 | 显示全部楼层
多谢array,保重身体

从摄像机好像是可以设置独立观察矩阵和投影矩阵的,普通渲染模式和RTT模式都行,只需设置ABSOLUTE_RF。其场景也可以与主摄像机不同,调用addslave的时候给第二个参数false就行。但我个人觉得这样做没什么意义

我现在的想法是:当不同摄像机的投影和观察矩阵之间只相差一个常数矩阵的时候,就可以把它们放在同一个view里,作为主从摄像机(或者都是从摄像机);如果一个摄像机没有相对它静止的其他摄像机,就没必要为它设置一个view,直接作为子节点放在scene里就可以了。
不知道这个想法对不对

该用户从未签到

发表于 2008-12-20 18:34:41 | 显示全部楼层
多多保重身体~~~~~~~~~~~~

该用户从未签到

发表于 2010-9-26 16:24:43 | 显示全部楼层
你好
能否把制作鹰眼图的createHUD(),这个函数的详细代码发布一下
谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表