适用于OpenSceneGraph的MiniMap / PIP

时间:2012-11-03 00:35:12

标签: c++ openscenegraph

所以我想创建一个迷你地图/ PIP。我有一个现有的程序,在Qt Widget中运行场景。我有一个类NetworkViewer,它扩展了CompositeViewer。在NetworkViewer的构造函数中,我调用以下函数。请注意,根是在其他地方填充的场景。


void NetworkViewer::init() {
  root = new osg::Group() ;

  viewer = new osgViewer::View( );
  viewer->setSceneData( root ) ;

  osg::Camera* camera ;
  camera = createCamera(0,0,100,100) ;
  viewer->setCamera( camera );
  viewer->addEventHandler( new NetworkGUIHandler( (GUI*)view ) ) ;
  viewer->setCameraManipulator(new osgGA::TrackballManipulator) ;
  viewer->getCamera()->setClearColor(
    osg::Vec4( LIGHT_CLOUD_BLUE_F,0.0f));
  addView( viewer );

  osgQt::GraphicsWindowQt* gw =
    dynamic_cast( camera->getGraphicsContext() );
  QWidget* widget = gw ? gw->getGLWidget() : NULL;

  QGridLayout* grid = new QGridLayout( ) ;
  grid->addWidget( widget );
  grid->setSpacing(1);
  grid->setMargin(1);
  setLayout( grid );

  initHUD( ) ;
}

创建相机功能如下:

osg::Camera* createCamera( int x, int y, int w, int h ) {
  osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
  osg::ref_ptr traits
    = new osg::GraphicsContext::Traits;
  traits->windowName = "" ;
  traits->windowDecoration = false ;
  traits->x = x;
  traits->y = y;
  traits->width = w;
  traits->height = h;
  traits->doubleBuffer = true;
  traits->alpha = ds->getMinimumNumAlphaBits();
  traits->stencil = ds->getMinimumNumStencilBits();
  traits->sampleBuffers = ds->getMultiSamples();
  traits->samples = ds->getNumMultiSamples();

  osg::ref_ptr camera = new osg::Camera;
  camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );

  camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
  camera->setViewMatrix(osg::Matrix::translate(-10.0f,-10.0f,-30.0f));
  camera->setProjectionMatrixAsPerspective(
    20.0f,
    static_cast(traits->width)/static_cast(traits->height),
    1.0f, 10000.0f );
  return camera.release();
}

我一直在寻找几个相机示例,并寻找解决方案一段时间无济于事。我真正想要的是背景是我的主摄像头占据了大部分屏幕并显示场景图,而我的迷你地图出现在右下角。它与主摄像机具有相同的场景,但覆盖在它的顶部,并具有自己的一组控件供选择等,因为它将具有不同的功能。

我在想,或许通过添加另一台相机作为奴隶,我可以做到这一点:

      camera = createCamera(40,40,50,50) ;
      viewer->addSlave(camera) ;

但这似乎不起作用。如果我禁用另一个摄像头,我确实看到一个清晰的区域,看起来这个摄像机假设要渲染(它的视口),但这没有帮助。我玩过渲染顺序,认为它可能无济于事。

有什么想法吗?这样的小地图最好的方法是什么?我究竟做错了什么?另外,无论如何要渲染小地图圆形而不是矩形?

1 个答案:

答案 0 :(得分:0)

我并非个人使用OpenSceneGraph,因此我无法就您的代码提供建议。我认为最好是在官方论坛上提问。但我对小地图有一些想法:

首先,您必须指定小地图的基本功能。你想要它强调场景的一些元素,或者只是显示场景(即,类似RTS的小地图与场景的简单顶级节目)?

我假设您不想强调场景的某些元素。我还假设您的主摄像头并非真正的“迷你地图”#39;因此,最简单的方法是创建具有以下属性的摄像头:

  • direction =(0,-1,0)(Y是垂直轴)
  • mode = orthographic
  • position =由你想要的东西控制,例如你的主摄像头

现在,为了整合图像。你可以:

  • 如果您的小地图为矩形,则将小地图相机的视口设置为您想要的。
  • 将小地图渲染为纹理(RTT),然后通过额外的渲染过程将其混合。

您还可以搜索其他引擎论坛(如Irrlicht和Ogre),了解他们如何进行迷你游戏。