查看: 2835|回复: 4

求教Camera问题

[复制链接]

该用户从未签到

发表于 2008-8-21 16:42:18 | 显示全部楼层 |阅读模式
我用一个程序开了两个Window,然后用一个osgView 的viewer,slave了两个Camera,我的两个window这时显示的是一个视点的观察位置,并且控制一个窗口,这两个窗口的视点一起运动.(就是例子osgwindow那个两窗口的程序一样)

   我现在的问题是:我想运用两个camera 分别控制两个Window,并且让每个camera单独运动,不受其它窗口影响.
   老大们,我该怎么做啊?搞了好久啊,期待高手解决!

该用户从未签到

发表于 2008-8-21 17:25:16 | 显示全部楼层
这个就很容易实现了,,,你使用CompositeViewer就可以了~~~~分别对两个osgViewer::Viewer进行设置~~~~

刚改了下,,代码如下:
  1. /* OpenSceneGraph example, osgwindows.
  2. *
  3. *  Permission is hereby granted, free of charge, to any person obtaining a copy
  4. *  of this software and associated documentation files (the "Software"), to deal
  5. *  in the Software without restriction, including without limitation the rights
  6. *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. *  copies of the Software, and to permit persons to whom the Software is
  8. *  furnished to do so, subject to the following conditions:
  9. *
  10. *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  11. *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  12. *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  13. *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  14. *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  15. *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  16. *  THE SOFTWARE.
  17. */

  18. #include <osgDB/ReadFile>
  19. #include <osgUtil/Optimizer>
  20. #include <osgViewer/Viewer>
  21. #include <osgViewer/CompositeViewer>


  22. #include <iostream>

  23. int main( int argc, char **argv )
  24. {
  25.     // use an ArgumentParser object to manage the program arguments.
  26.     osg::ArgumentParser arguments(&argc,argv);

  27.     // read the scene from the list of file specified commandline args.
  28.     osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);

  29.     // if not loaded assume no arguments passed in, try use default mode instead.
  30.     if (!loadedModel) loadedModel = osgDB::readNodeFile("cow.osg");
  31.    
  32.     // if no model has been successfully loaded report failure.
  33.     if (!loadedModel)
  34.     {
  35.         std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
  36.         return 1;
  37.     }

  38.     // construct the viewer.
  39.     //osgViewer::Viewer viewer;

  40.         osg::ref_ptr<osgViewer::CompositeViewer> viewer = new osgViewer::CompositeViewer();

  41.         osg::ref_ptr<osgViewer::Viewer> viewer1= new osgViewer::Viewer() ;
  42.         osg::ref_ptr<osgViewer::Viewer> viewer2= new osgViewer::Viewer() ;

  43.     int xoffset = 40;
  44.     int yoffset = 40;

  45.     // left window + left slave camera
  46.     {
  47.         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
  48.         traits->x = xoffset + 0;
  49.         traits->y = yoffset + 0;
  50.         traits->width = 600;
  51.         traits->height = 480;
  52.         traits->windowDecoration = true;
  53.         traits->doubleBuffer = true;
  54.         traits->sharedContext = 0;

  55.         osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

  56.         osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  57.         camera->setGraphicsContext(gc.get());
  58.         camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height));
  59.         GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
  60.         camera->setDrawBuffer(buffer);
  61.         camera->setReadBuffer(buffer);

  62.         // add this slave camera to the viewer, with a shift left of the projection matrix
  63.         viewer1->addSlave(camera.get(), osg::Matrixd::translate(0.0,0.0,0.0), osg::Matrixd());

  64.                 viewer1->setSceneData(osgDB::readNodeFile("cow.osg")) ;
  65.     }
  66.    
  67.     // right window + right slave camera
  68.     {
  69.         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
  70.         traits->x = xoffset + 600;
  71.         traits->y = yoffset + 0;
  72.         traits->width = 600;
  73.         traits->height = 480;
  74.         traits->windowDecoration = true;
  75.         traits->doubleBuffer = true;
  76.         traits->sharedContext = 0;

  77.         osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

  78.         osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  79.         camera->setGraphicsContext(gc.get());
  80.         camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height));
  81.         GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
  82.         camera->setDrawBuffer(buffer);
  83.         camera->setReadBuffer(buffer);

  84.         // add this slave camera to the viewer, with a shift right of the projection matrix
  85.        viewer2->addSlave(camera.get(), osg::Matrixd::translate(0.0,0.0,0.0), osg::Matrixd());

  86.            viewer2->setSceneData(osgDB::readNodeFile("cow.osg")) ;
  87.     }


  88.         viewer->addView(viewer1.get()) ;
  89.         viewer->addView(viewer2.get()) ;

  90.     // optimize the scene graph, remove rendundent nodes and state etc.
  91.     osgUtil::Optimizer optimizer;
  92.     optimizer.optimize(loadedModel.get());

  93.     // set the scene to render
  94.    // viewer.setSceneData(loadedModel.get());

  95.     return viewer->run();
  96. }
复制代码

该用户从未签到

发表于 2008-8-22 11:07:03 | 显示全部楼层
这个问题提的太及时了 :victory:

该用户从未签到

 楼主| 发表于 2008-8-25 18:35:45 | 显示全部楼层

还有问题

非常感谢! 可是又有了新的问题,就是我用 camera的SetViewMetrix()做一些位置移动 和角度变换,在程序中怎么不变换呢?
    还有两个问题,就是用CompositeViewer,这个类没有done()函数,也就是说不能在while()循环中每桢来调用我想做的功能.是不是我用两个单独的viewer掉done()函数来做呢?
    另一个就是,我是在MFC下调用的这个程序,是用例子中的那种方式,但例子是用osgView类.就像你说用CompositeViewer的方式,在例子程序下改动的地方具体要怎么做呢?
    非常感谢,我又问了这么多问题.

该用户从未签到

发表于 2008-8-25 20:02:32 | 显示全部楼层
原帖由 sgdgoodboy 于 2008-8-25 18:35 发表
非常感谢! 可是又有了新的问题,就是我用 camera的SetViewMetrix()做一些位置移动 和角度变换,在程序中怎么不变换呢?
    还有两个问题,就是用CompositeViewer,这个类没有done()函数,也就是说不能在while()循环中每桢 ...


setViewMatrix是可用的,关键是您在什么地方调用它。在回调中应该是可以的;在进入仿真循环之前执行的话,观察矩阵可能会被漫游器重置

CompositeViewer当然有done()函数。这个函数是ViewerBase的成员,而CompositeViewer和Viewer都是ViewerBase的派生类。还有就是done()函数的作用仅仅是判断是否退出仿真循环,更新和渲染工作都是在frame()函数中完成的(参见本站原创的教程《最长的一帧》)

在MFC中使用CompositeViewer的原理和使用Viewer是一样的,参考osgviewerMFC,注意这一次要提供给OSG两个窗口句柄hWnd,也就是要创建两个MFC窗口来承载视景器

[ 本帖最后由 array 于 2008-8-25 20:04 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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