gpt4 book ai didi

qt - OpenSceneGraph 和多个查看器

转载 作者:行者123 更新时间:2023-12-04 09:46:04 26 4
gpt4 key购买 nike

我正在使用 OpenSceneGraph 和 Qt 来开发模拟软件。模拟可能涉及同一虚拟世界中的多个机器人。我对 View 的要求如下:

  • 能够显示静态世界相机
  • 能够显示机器人摄像头
  • 能够移动这些 View 和/或堆叠它们

  • 为了完成这些任务,我制作了一个“OSGWidget”,它使用 Osg 查看器在 QGLWidget 中渲染场景。这个 OSGWidget 又被放置在一个 QDockWidget 中,它可以四处移动和/或堆叠,以满足该要求。

    问题是,当使用多个单一查看器在不同的小部件中渲染相同的场景时,我会得到奇怪的渲染行为。也就是说,纹理不能正确显示,有时甚至根本不能显示。

    我环顾了 SO 和 OSG 论坛,虽然人们遇到了类似的问题,但我看到的唯一回应建议切换到 Osg CompositeViewer。出于我的目的,我想避免使用它,因为它打破了我对可移动和可堆叠小部件呈现相同场景的期望要求。

    这是Osg 不容易处理的棘手情况吗?我看过几篇帖子说这不是 OSG '应该如何工作',但他们并没有真正提供事实来支持这一说法。有没有人做过类似的事情或有任何想法/见解?如果需要,我可以提供代码片段,但由于这可能与 Osg 的意识形态相矛盾,我将等待得到一些回应。

    最佳答案

    感谢评论和其他几个网站的帮助,我能够成功地从 CompositeViewer 获得我想要的行为。

    基本上,所有 OSG View 都通过我的“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;
    };

    然后,每当我制作一个新的 Qt OSG Widget 时,我都会将 osg::View 交给驱动程序。我让驱动程序更新渲染窗口,而 Qt 仍然可以相应地更新 QWidget。它甚至允许我将小部件放置在 QDockWidget 中,以便我可以根据需要移动它们并堆叠它们。

    如果其他人想要这样做,则有关该过程的一些最终说明:
  • 当多个 OSG 查看器正在查看一个场景时,您很可能会遇到奇怪的纹理显示问题。如果发生这种情况,请使用 osgUtil::Optimizer::TextureVisitor 将所有纹理设置为“UnrefImageAfterApply = false”。这将允许跨多个 osg::View 实例正确显示纹理。
  • 我在上面设置的 CompositeViewer 选项,将线程模型设置为 SingleThreaded 并将 releaseContextAtEndOfFrame 设置为 false,如果您希望单个线程作用于多个 View ,则是必要的。如果您像我一样使用小部件驱动程序,您会想要这样做。
  • 关于qt - OpenSceneGraph 和多个查看器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15207076/

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