2

所以我正在尝试创建一个迷你地图/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) ;

但这似乎不起作用。如果我禁用另一台相机,我确实会看到一个清晰的区域,表明该相机应该在(其视口)中渲染,但这无济于事。我玩过渲染顺序,认为这可能无济于事。

有任何想法吗?制作这种小地图的最佳方法是什么?我究竟做错了什么?无论如何也要使小地图的渲染为圆形而不是矩形?

4

1 回答 1

0

我个人没有使用 OpenSceneGraph,所以我无法就您的代码向您提供建议。我认为最好是在官方论坛中询问。但我对小地图有一些想法:

首先,您必须指定小地图的基本特征。您是希望它强调场景的某些元素,还是只显示场景(即类似 RTS 的小地图与场景的简单顶部显示)?

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

  • 方向 = (0,-1,0)(Y 为纵轴)
  • 模式 = 正交
  • 位置 = 由您想要的控制,例如您的主摄像头

现在,对于图像的整合。你可以:

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

您还可以搜索其他引擎论坛(如 Irrlicht 和 Ogre),看看他们是如何制作小地图的。

于 2012-11-11T18:47:19.730 回答