だから私はミニマップ/PIPを作成しようとしています。Qtウィジェット内で実行されるシーンを持つ既存のプログラムがあります。CompositeViewerを拡張するクラスNetworkViewerがあります。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) ;
しかし、これはうまくいかないようです。他のカメラを無効にすると、このカメラが(そのビューポートで)レンダリングされているように見える明確な領域が表示されますが、それは役に立ちません。私はそれが役に立たないかもしれないと思ってレンダリング順序をいじってみました。
何か案は?そのようなミニマップを作成するための最良の方法は何ですか?私は何が間違っているのですか?また、とにかくミニマップのレンダリングを長方形ではなく円形にするのですか?