2012-11-03 42 views
2

所以我想創建一個迷你地圖/ PIP。我有一個在Qt Widget中運行的現有程序。我有一個類NetworkViewer,它擴展了CompositeViewer。在NetworkViewer的構造函數中,我調用以下函數。注意根是在別處填充的場景。MiniMap/PIP OpenSceneGraph


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) ;

但這似乎並沒有工作。如果我禁用另一臺攝像機,我確實看到一個清晰的區域,看起來這臺攝像機假設是在渲染(它的視口)中,但這沒有幫助。我已經玩過渲染順序,認爲這可能無濟於事。

任何想法?做這種小地圖的最好方法是什麼?我究竟做錯了什麼?無論如何,使小地圖的圓形而不是矩形的渲染?

回答

0

我不是人爲地使用OpenSceneGraph,所以我不能告訴你你的代碼。我認爲最好的是在官方論壇上提問。但我在小地圖上有一些想法:

首先,您必須指定小地圖的基本功能。你想讓它強調一些場景元素,還是僅僅展示場景(即RTS般的小地圖vs場景的簡單頂級秀)?

我假設你不想強調場景的某些元素。我也假設你的主攝像頭並不真正'迷你地圖'。所以,最簡單的是創建一個相機具有以下屬性:

  • 方向=(0,-1,0)(Y是垂直軸)
  • 模式=正投影
  • 位置=通過受控你想要什麼,例如你的主相機

現在,爲圖像的整合。您可以:

  • 如果您的小地圖是長方形,則將小地圖相機的視口設置爲所需的視口。
  • 將小地圖渲染爲紋理(RTT),然後通過額外的渲染過程進行混合。

您還可以搜索其他引擎論壇(如Irrlicht和食人魔),看看他們如何做小型地圖。

+0

謝謝,我在此之前在官方論壇上詢問過,但不幸的是沒有回覆。 –

+0

恐怕唯一要看的是人們如何用其他引擎來做。您也可以在遊戲中搜索(但請記住有幾種不同類型的迷你地圖)。 – Synxis