最小值/PIP用于开放式图

MiniMap/PIP for OpenSceneGraph

本文关键字:开放式 用于 PIP 最小值      更新时间:2023-10-16

,所以我正在尝试创建一个迷你映射/pip。我有一个现有的程序,其场景在QT小部件内部运行。我有一个类,网络视图,它扩展了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) ;

但这似乎不起作用。如果我禁用另一个相机,我确实会看到一个清晰的区域,看来该相机被认为是在(其视口)中呈现的,但这无济于事。我已经玩了订单,以为可能无济于事。

有什么想法吗?做这样的最小值的最佳方法是什么?我究竟做错了什么?无论如何,也可以使minimap圆形呈现而不是矩形?

我不使用OpenSceneGraph,所以我无法就您的代码告知您。我认为最好的是在官方论坛中询问。但是我对MiniMap有一些想法:

首先,您必须指定最小值的基本功能。您是否希望它强调场景的某些元素,或者只是展示场景(即,类似RTS的Minimap vs Simple Topshow)?

)?

我假设您不想强调场景的某些元素。我还认为您的主相机并不是真正的"最小值友好型"。因此,最简单的是创建具有以下属性的相机:

  • 方向=(0,-1,0)(y是垂直轴)
  • 模式=正交
  • 位置=由您想要的控制,例如您的主相机

现在,用于图像的集成。您可以:

  • 如果您的Minimap是矩形的,将MiniMap相机的视口设置为您想要的。
  • 将最小值渲染为纹理(RTT),然后通过额外的渲染通行证将其混合。

您还可以搜索其他引擎论坛(例如Irrlicht和Ogre),以了解他们的最小值。