QT3D Multiview - 小部件中的单一视图

Posted

技术标签:

【中文标题】QT3D Multiview - 小部件中的单一视图【英文标题】:QT3D Multiview - Single View in Widget 【发布时间】:2018-11-24 17:52:47 【问题描述】:

我对“Qt 3D:多视口 QML 示例”有疑问Link

是否可以将单个视图(示例中的四个视图之一)添加到单独的小部件中。我尝试更改示例,但只能将所有四个视图添加到一个小部件。

下面的代码创建了一个相机,它应该显示在一个单独的小部件中。看图

我不确定这是否可能以及如何解决。

SimpleCamera 
    id: camera4
    lens: cameraLens3
    position: Qt.vector3d(100.0, 0.0, -6.0)
    viewCenter: Qt.vector3d(0.0, 0.0, -6.0)

【问题讨论】:

尝试将链接中的相关细节添加到您的问题中,并更具体地展示您想要实现的目标 我只知道如何使用 C++ 实现这一点:在这种情况下,您创建 Qt3DWindow 并将其放置在使用 QWidget::createWindowContainer 的小部件中。这将返回一个小部件,然后您可以在 UI 中使用它。您可以对多个不同的 3D 窗口执行此操作,尽管在某些时候性能会受到影响。我不确定您是否可以重用框架图,尽管 Qt 的文档经常指出不应共享对象,但您可以尝试看看会发生什么。 我已经创建了一个 windowContainer 但我不知道如何显示单个视图(例如四个视图之一)。目前所有四个视图都显示在小部件内。如果我能解决这个问题,我想扩展它,所有四个视图都显示在四个单独的小部件中。 【参考方案1】:

在示例中,四个视图是使用 Viewport 和 CameraSelector 类创建的。

视口类

Viewport 类定义了框架图的分支(Viewport 节点是其中的一部分)被渲染到的屏幕部分。该部分定义为(x, y, width, height)。整个屏幕的坐标是(0, 0, 1, 1)

如果您查看示例中的 QuadViewportFrameGraph 类,您会看到定义了四个视口 - 每个摄像头一个。左上角的相机渲染到屏幕的矩形(0, 0, 0.5, 0.5)。另一方面,右上角的相机渲染到(0.5, 0, 0.5, 0.5),即它使用屏幕大小的一半作为其x 偏移量。

CameraSelector 类

这个类定义了框架图的分支使用哪个相机来渲染内容。如果您查看该示例,您将在每个 Viewport 实例中看到一个 CameraSelector id: someCamera 。这样,每个Viewport 都有自己的摄像头。

结论

如果您只想要一个视图,请删除主 Viewport 中的四个 Viewports 并添加一个相机选择器作为其子级。所以你的QuadViewportFrameGraph 应该是这样的(没有导入语句):

RenderSettings 
    id: quadViewportFrameGraph

    property alias camera: cameraSelector.camera;
    property alias window: surfaceSelector.surface

    activeFrameGraph: RenderSurfaceSelector 
        id: surfaceSelector

        Viewport 
            id: mainViewport
            normalizedRect: Qt.rect(0, 0, 1, 1)

            ClearBuffers 
                buffers: ClearBuffers.ColorDepthBuffer
                clearColor: Qt.rgba(0.6, 0.6, 0.6, 1.0)

                CameraSelector  id: cameraSelector 
            
        
    

当然,您还必须调整实例化QuadViewportFrameGraph 的代码,并且只设置一个摄像头。如果您现在希望所有四个视图都显示在单独的小部件中,您需要创建四个 3D 窗口和窗口容器,并为每个视图创建一个这样的框架图(当然,使用不同的相机)。

但请注意,如果您创建不同的 3D 窗口,性能可能会很糟糕。据我所知,目前没有其他获取 3D 小部件的解决方案。

【讨论】:

不错的答案。对this issue 有任何想法吗?

以上是关于QT3D Multiview - 小部件中的单一视图的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的Qt3d输入

Qt3d用c ++输入

如何在标准GUI应用程序中使用Qt3D进行渲染?

jquery/jquery 移动插件 - 小部件 - 调用私有方法不起作用

在 Qt3D 场景上绘制 2D 图形的最佳方法是啥?

如何使用单一小部件与多个供应商?