kel*_*ano 5 opengl qt openscenegraph qglwidget
我正在使用 OpenSceneGraph 和 Qt 开发模拟软件。模拟可以涉及同一虚拟世界中的多个机器人。我对视图的要求如下:
为了完成这些任务,我制作了一个“OSGWidget”,它使用 Osg 查看器在 QGLWidget 内渲染场景。该 OSGWidget 又被放入 QDockWidget 中,该 QDockWidget 可以移动和/或堆叠,从而满足该要求。
问题是,当使用多个单一查看器在不同的小部件中渲染同一场景时,我会得到奇怪的渲染行为。也就是说,纹理无法正确显示,有时甚至根本无法显示。
我浏览过 SO 和 OSG 论坛,虽然人们也遇到了类似的问题,但我看到的唯一回应是建议切换到 Osg CompositeViewer。出于我的目的,我想避免使用它,因为它破坏了我对渲染同一场景的可移动和可堆叠小部件的期望要求。
这是一个棘手的情况,Osg 不容易处理吗?我见过几篇帖子说这不是 OSG “应该工作的方式”,但他们并没有真正提供事实来支持这一说法。有没有人做过类似的事情或有任何想法/见解?如果需要,我可以提供代码片段,但由于这可能与 Osg 的意识形态相矛盾,我将等待得到一些答复。
感谢评论和其他几个网站的帮助,我能够从 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;
};
Run Code Online (Sandbox Code Playgroud)
然后,每当我创建一个新的 Qt OSG Widget 时,我都会将 osg::View 交给驱动程序。我让驱动程序更新渲染窗口,而 Qt 仍然可以相应地更新 QWidget。它甚至允许我将小部件放置在 QDockWidget 中,以便我可以移动它们并根据需要堆叠它们。
如果其他人想这样做的话,关于该过程的一些最后说明:
| 归档时间: |
|
| 查看次数: |
2936 次 |
| 最近记录: |