前言
前面的相機hud可以單獨顯示圖形,繼續深入研究相機hud,技術就是子檢視了,實現該功能的直接技術是從相機技術。
本篇描述osg從相機技術
pCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
如果不清除顏色快取,渲染的視窗中若無內容,則將其他視窗渲染的內容顯示到當前視窗。
// 設定POST渲染順序(最後渲染)
pCamera->setRenderOrder(osg::Camera::POST_RENDER);
後渲染的優先順序比較高(最後顯示,顯示優先順序最高)。
// 設定為不接收事件,始終得不到焦點
pCamera->setAllowEventFocus(false);
// 視口就是引擎三維的區域,但是注意區別於螢幕的座標系(螢幕是左上為0,0,而三維引擎是左下為0,0)
pSlaveFrontCamera->setViewport(0,
0,
rect().width() / 4,
rect().height() / 4);
osg::ref_ptr<osg::Camera> pSlaveFrontCamera = new osg::Camera;
pSlaveFrontCamera->setGraphicsContext(_pViewer->getWindow());
// 視口就是引擎三維的區域,但是注意區別於螢幕的座標系(螢幕是左上為0,0,而三維引擎是左下為0,0)
pSlaveFrontCamera->setViewport(0,
0,
rect().width() / 4,
rect().height() / 4);
pSlaveFrontCamera->setRenderOrder(osg::Camera::POST_RENDER);
第二個引數是縮放矩陣,第三個引數是旋轉矩陣
_pViewer->addSlave(pSlaveFrontCamera,
osg::Matrix(),
osg::Matrix::rotate(osg::DegreesToRadians(0.0), 0.0, 0.0, 0.0),
true);
osg::ref_ptr<osg::Node> OsgWidget::getMulViewCameraNode()
{
// 隱藏整個demo全域性的按鈕皮膚(沒用到按鍵的直接隱藏,不影響此Demo)
{
ui->groupBox_pannel->setVisible(false);
ui->label_cursor->setVisible(false);
ui->label_cursor_2->setVisible(false);
ui->label_msg->setVisible(false);
ui->label_state->setVisible(false);
}
osg::ref_ptr<osg::Group> pGroup = new osg::Group;
// 繪製盒體(立方體、長方體)
{
osg::ref_ptr<osg::Geode> pGeode = new osg::Geode;
// 建立專門指明精細度的類osg::TessellationHints,並設定對應精細度
osg::ref_ptr<osg::TessellationHints> pHints = new osg::TessellationHints;
pHints->setDetailRatio(0.5);
// 繪製幾何型別(幾何體)
qreal width = 5.0f;
// 函式1
pGeode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0, 0, 0), width), pHints));
#if 1
// 設定關閉光照:OFF,同時旋轉都能看到了(光照關閉,法向量不起作用)
{
osg::StateSet *pStateSet = pGeode->getOrCreateStateSet();
pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
// pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
}
#endif
pGroup->addChild(pGeode);
}
// 建立多視口相機
{
#if 0
// 這裡改用了自己視窗已經建立的,這塊廢掉了,但是保留,基本的核心思想是一樣的
osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> pWindowingSystemInterface
= osg::GraphicsContext::getWindowingSystemInterface();
if(!pWindowingSystemInterface.get())
{
LOG << "if(!pWindowingSystemInterface.get())";
return pGroup.get();
}
unsigned int width = 0;
unsigned int height = 0;
pWindowingSystemInterface->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
width,
height);
osg::ref_ptr<osg::GraphicsContext::Traits> pTraits = new osg::GraphicsContext::Traits;
{
pTraits->x = 0;
pTraits->y = 0;
pTraits->width = width;
pTraits->height = height;
pTraits->windowDecoration = false;
pTraits->doubleBuffer = true;
pTraits->sharedContext =