2

だから私はミニマップ/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) ;

しかし、これはうまくいかないようです。他のカメラを無効にすると、このカメラが(そのビューポートで)レンダリングされているように見える明確な領域が表示されますが、それは役に立ちません。私はそれが役に立たないかもしれないと思ってレンダリング順序をいじってみました。

何か案は?そのようなミニマップを作成するための最良の方法は何ですか?私は何が間違っているのですか?また、とにかくミニマップのレンダリングを長方形ではなく円形にするのですか?

4

1 に答える 1

0

私は個人的に OpenSceneGraph を使用していないので、あなたのコードについてアドバイスすることはできません。公式フォーラムで質問するのが一番だと思います。しかし、ミニマップについていくつかのアイデアがあります。

まず、ミニマップの基本機能を指定する必要があります。シーンのいくつかの要素を強調したいですか、それとも単にシーンを表示したいですか (つまり、RTS のようなミニマップとシーンの単純なトップショー)?

シーンの一部の要素を強調したくないと思います。また、あなたのメインカメラは実際には「ミニマップ対応」ではないと思います. したがって、最も簡単な方法は、次のプロパティを持つカメラを作成することです。

  • 方向 = (0,-1,0) (Y は縦軸)
  • モード = 正投影
  • 位置 = メインカメラなど、必要なものによって制御されます

さて、画像の統合です。あなたはできる:

  • ミニマップが長方形の場合は、ミニマップ カメラのビューポートを希望するものに設定します。
  • ミニマップをテクスチャ (RTT) にレンダリングし、追加のレンダリング パスを介してブレンドします。

他のエンジン フォーラム (Irrlicht や Ogre など) を検索して、ミニマップがどのように機能しているかを確認することもできます。

于 2012-11-11T18:47:19.730 に答える