MiniMap / PIP для OpenSceneGraph

Поэтому я пытаюсь создать мини-карту / PIP. У меня есть существующая программа со сценой, которая работает внутри виджета Qt. У меня есть класс, 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) ;

Но это не похоже на работу. Если я отключаю другую камеру, я вижу четкую область, в которой, по-видимому, эта камера должна рендерить (ее окно просмотра), но это не помогает. Я играл с порядком рендеринга, думая, что это может быть бесполезно.

Есть идеи? Что это лучший способ сделать такую ​​миникарту? Что я делаю неправильно? Также в любом случае сделать рендеринг миникарты круглым, а не прямоугольным?

2

Решение

Я лично не использую OpenSceneGraph, поэтому не могу посоветовать вам ваш код. Я думаю, что лучше всего спросить на официальных форумах. Но у меня есть несколько идей о миникарте:

Во-первых, вы должны указать основные функции вашей миникарты. Вы хотите, чтобы это подчеркивало некоторые элементы сцены или просто показывало сцену (т. Е. Миникарту в стиле RTS против простого топ-шоу сцены)?

Я предполагаю, что вы не хотите подчеркивать некоторые элементы сцены. Я также предполагаю, что ваша основная камера не очень удобна для мини-карт. Итак, самое простое — создать камеру со следующими свойствами:

  • направление = (0, -1,0) (Y — вертикальная ось)
  • режим = орфографический
  • положение = контролируется тем, что вы хотите, например, вашей основной камерой

Теперь для интеграции изображения. Вы можете:

  • установите область просмотра камеры миникарты на то, что вы хотите, если ваша миникарта прямоугольная.
  • рендерим миникарту в текстуру (RTT), а затем смешиваем ее через дополнительный проход рендеринга.

Вы также можете искать на других форумах движков (таких как Irrlicht и Ogre), чтобы увидеть, как они делают мини-карты.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]