gpt4 book ai didi

c++ - 用于 OpenSceneGraph 的迷你 map /画中画

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:53 28 4
gpt4 key购买 nike

所以我正在尝试创建一个迷你 map /PIP。我有一个现有程序,其场景在 Qt Widget 中运行。我有一个类 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();
}

我一直在查看几个相机示例并寻找解决方案一段时间但无济于事。我真正想要的是背景是我的主相机,它占据了大部分屏幕并显示场景图,而我的迷你 map 出现在右下角。它与主摄像机具有相同的场景,但覆盖在主摄像机之上,并且具有自己的一组用于选择等的控件,因为它将具有不同的功能。

我在想,也许通过添加另一个相机作为从属相机,我可以做到这一点:

      camera = createCamera(40,40,50,50) ;
viewer->addSlave(camera) ;

但这似乎行不通。如果我禁用另一个相机,我确实会看到一个清晰的区域,看起来这个相机应该在(它的视口(viewport))中渲染,但这没有帮助。我玩过渲染顺序,认为它可能无济于事。

有什么想法吗?做这样一个小 map 的最好方法是什么?我究竟做错了什么?还有无论如何要使小 map 的呈现为圆形而不是矩形?

最佳答案

我个人并没有使用 OpenSceneGraph,所以我无法就您的代码提供建议。我觉得最好去官方论坛问问。但是我对小 map 有一些想法:

首先,您必须指定您的小 map 的基本特征。你想让它强调场景的某些元素,还是只显示场景(即类似 RTS 的小 map 与简单的场景顶部显示)?

我假设您不想强调场景的某些元素。我还假设您的主摄像头并不是真正的“小 map 友好型”。因此,最简单的方法是创建具有以下属性的相机:

  • direction = (0,-1,0)(Y为纵轴)
  • 模式=正交
  • position = 由你想要的控制,例如你的主摄像头

现在,对于图像的整合。您可以:

  • 如果您的迷你 map 是矩形的,请将迷你 map 相机的视口(viewport)设置为您想要的。
  • 将迷你 map 渲染为纹理 (RTT),然后通过额外的渲染 channel 将其混合。

您还可以搜索其他引擎论坛(如 Irrlicht 和 Ogre),看看他们是如何制作小 map 的。

关于c++ - 用于 OpenSceneGraph 的迷你 map /画中画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13204861/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com