我正在使用OpenSceneGraph和Qt开发一个仿真软件。在同一个虚拟世界中,模拟可以涉及多个机器人。我对意见的要求如下:
为了完成这些任务,我制作了一个“OSGWidget”,它使用OSGWidget在QGLWidget中呈现场景。这个OSGWidget又被放置在可以移动和/或堆叠的QDockWidget中,从而满足了这一要求。
问题是,当使用多个奇异查看器在不同的小部件中呈现同一个场景时,我会得到奇怪的呈现行为。也就是说,纹理不正确地显示,有时甚至根本不显示。
我已经环顾过这样和OSG论坛,虽然人们有类似的问题,但我看到的唯一反应是建议切换到Osg CompositeViewer。为了我的目的,我想避免使用它,因为它打破了我想要的可移动和可堆叠的小部件呈现相同场景的要求。
这是一个难以处理的情况,只是不容易被Osg处理?我见过一些帖子说OSG不是这样工作的,但他们并没有提供事实来支持这一说法。是否有人做过类似的事情,或有任何想法或洞察力?如果需要的话,我可以提供代码片段,但由于这可能与Osg的意识形态相矛盾,我将等待得到一些响应。
发布于 2013-04-12 15:21:03
感谢来自评论和其他几个网站的一些帮助,我成功地从CompositeViewer获得了我想要的行为。
基本上,所有OSG视图都经过我的"WidgetDriver“,其中包含一个CompositeViewer。
class OsgWidgetDriver {
public:
void init() {
compositeViewer = new osgViewer::CompositeViewer;
compositeViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
compositeViewer->setReleaseContextAtEndOfFrameHint(false);
}
void start() {
initialized = true;
}
void stop() {
compositeViewer->stopThreading();
compositeViewer->setDone(true);
}
void updateFrame() {
if (initialized)
compositeViewer->frame();
}
void addView(osgViewer::View *view) { compositeViewer->addView(view); }
bool isInitialized() { return initialized; }
protected:
bool initialized;
osgViewer::CompositeViewer *compositeViewer;
};然后,每当我做一个新的,我就把osg::View交给驱动程序。我让驱动程序更新呈现窗口,而Qt仍然可以相应地更新QWidget。它甚至允许我将小部件放置在QDockWidget中,这样我就可以移动它们,并根据需要将它们堆叠起来。
如果有其他人想这样做的话,请在这个过程中做一些最后的说明:
https://stackoverflow.com/questions/15207076
复制相似问题