最小值/PIP用于开放式图
MiniMap/PIP for OpenSceneGraph
,所以我正在尝试创建一个迷你映射/pip。我有一个现有的程序,其场景在QT小部件内部运行。我有一个类,网络视图,它扩展了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();
}
我一直在寻找几个相机示例,并寻找解决方案一段时间以来无济于事。我真正寻找的是背景是我的主相机,它占用了大部分屏幕并显示了场景图,而我的迷你映射出现在右下角。它具有与主摄像头相同的场景,但在其顶部覆盖,并且具有自己的选择控制等,因为它具有不同的功能。
我在想,也许通过将另一台相机作为奴隶添加,我可以做到这一点:
camera = createCamera(40,40,50,50) ;
viewer->addSlave(camera) ;
但这似乎不起作用。如果我禁用另一个相机,我确实会看到一个清晰的区域,看来该相机被认为是在(其视口)中呈现的,但这无济于事。我已经玩了订单,以为可能无济于事。
有什么想法吗?做这样的最小值的最佳方法是什么?我究竟做错了什么?无论如何,也可以使minimap圆形呈现而不是矩形?
我不使用OpenSceneGraph,所以我无法就您的代码告知您。我认为最好的是在官方论坛中询问。但是我对MiniMap有一些想法:
首先,您必须指定最小值的基本功能。您是否希望它强调场景的某些元素,或者只是展示场景(即,类似RTS的Minimap vs Simple Topshow)?
)?我假设您不想强调场景的某些元素。我还认为您的主相机并不是真正的"最小值友好型"。因此,最简单的是创建具有以下属性的相机:
- 方向=(0,-1,0)(y是垂直轴)
- 模式=正交
- 位置=由您想要的控制,例如您的主相机
现在,用于图像的集成。您可以:
- 如果您的Minimap是矩形的,将MiniMap相机的视口设置为您想要的。
- 将最小值渲染为纹理(RTT),然后通过额外的渲染通行证将其混合。
您还可以搜索其他引擎论坛(例如Irrlicht和Ogre),以了解他们的最小值。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 最小值/PIP用于开放式图