所以我正在尝试创建一个迷你地图/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) ;
但这似乎不起作用。如果我禁用另一台相机,我确实会看到一个清晰的区域,表明该相机应该在(其视口)中渲染,但这无济于事。我玩过渲染顺序,认为这可能无济于事。
有任何想法吗?制作这种小地图的最佳方法是什么?我究竟做错了什么?无论如何也要使小地图的渲染为圆形而不是矩形?