Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/multiviewport

el/2024/5/21 21:53:28

main.cpp

#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <QGuiApplication>
//演示从多个视口渲染场景图形的 QML 示例。
//多视口从四个虚拟摄像机的角度将场景图形渲染到窗口的四个象限中。
//这是 3D CAD 或建模工具的常见配置,或者可以进行调整以帮助渲染赛车游戏
//或闭路电视摄像机显示器中的后视镜。int main(int ac, char **av)
{QGuiApplication app(ac, av);Qt3DExtras::Quick::Qt3DQuickWindow view;view.setSource(QUrl("qrc:/main.qml"));view.show();return app.exec();
}

main.qml

import QtQuick 2.0
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0Entity {id: rootNodecomponents: [quadViewportFrameGraph, inputSettings]QuadViewportFrameGraph {id: quadViewportFrameGraphtopLeftCamera: cameraSet.cameras[0]topRightCamera: cameraSet.cameras[1]bottomLeftCamera: cameraSet.cameras[2]bottomRightCamera: cameraSet.cameras[3]}// Event Source will be set by the Qt3DQuickWindowInputSettings { id: inputSettings }Entity {id: cameraSetproperty var cameras: [camera1, camera2, camera3, camera4]CameraLens {id: cameraLensprojectionType: CameraLens.PerspectiveProjectionfieldOfView: 45aspectRatio: 16/9nearPlane: 0.01farPlane: 1000.0}CameraLens {id: cameraLens2projectionType: CameraLens.PerspectiveProjectionfieldOfView: 15aspectRatio: 16/9nearPlane: 0.01farPlane: 1000.0}CameraLens {id: cameraLens3projectionType: CameraLens.PerspectiveProjectionfieldOfView: 5aspectRatio: 16/9nearPlane: 0.01farPlane: 1000.0}SimpleCamera {id: camera1lens: cameraLens2position: Qt.vector3d(10.0, 1.0, 10.0)viewCenter: Qt.vector3d(0.0, 1.0, 0.0)}SimpleCamera {id: camera2lens: cameraLensposition: Qt.vector3d(0.0, 0.0, 5.0)viewCenter: Qt.vector3d(0.0, 0.0, 0.0)}SimpleCamera {id: camera3lens: cameraLens2position: Qt.vector3d(30.0, 30.0, 20.0)viewCenter: Qt.vector3d(0.0, 0.0, -8.0)}SimpleCamera {id: camera4lens: cameraLens3position: Qt.vector3d(100.0, 0.0, -6.0)viewCenter: Qt.vector3d(0.0, 0.0, -6.0)}}Entity {id: sceneRootproperty real rotationAngle: 0SequentialAnimation {running: trueloops: Animation.InfiniteNumberAnimation { target: sceneRoot; property: "rotationAngle"; to: 360; duration: 4000; }}Entity {components: [Transform {rotation: fromAxisAndAngle(Qt.vector3d(0, 0, 1), -sceneRoot.rotationAngle)},SceneLoader {source: "qrc:/Gear_scene.dae"}]}} // sceneRoot
} // rootNode

QuadViewportFrameGraph.qml

import Qt3D.Core 2.0
import Qt3D.Render 2.0RenderSettings {id: quadViewportFrameGraphproperty alias topLeftCamera: cameraSelectorTopLeftViewport.camera;property alias topRightCamera: cameraSelectorTopRightViewport.camera;property alias bottomLeftCamera: cameraSelectorBottomLeftViewport.camera;property alias bottomRightCamera: cameraSelectorBottomRightViewport.camera;property alias window: surfaceSelector.surface//保存当前活动的 FrameGraph。//提供一种指定渲染表面的方法。//RenderSurfaceSelector 可用于选择表面,Qt3D 在此渲染内容。 表面可以是窗口表面或屏幕外表面。//externalRenderTargetSize 用于在使用离屏表面时指定渲染目标的实际大小。//使用 Framegraph Rules 中定义的规则,我们从 FrameGraph 构造五个 RenderView 对象://顺序很重要。//如果 ClearBuffers 节点是最后一个而不是第一个,这将导致黑屏,原因//很简单,所有内容都将在经过如此仔细的渲染后立即被清除。//出于类似的原因,它不能用作 FrameGraph 的根//因为这会导致调用为我们的每个视口清除整个屏幕。//尽管 FrameGraph 的声明顺序很重要,但 Qt 3D 能够并行处理每个 RenderView//因为每个 RenderView 都独立于其他渲染视图,以便在 RenderView   //的状态有效时生成一组要提交的 RenderCommand。//Qt 3D 使用基于任务的并行方法,该方法自然会随着可用内核的数量而扩展。//RenderViews 的 RenderCommands 可以跨多个内核并行生成//只要我们注意在专用的 OpenGL 提交线程上以正确的顺序提交 RenderViews,生成的场景就会被正确渲染。activeFrameGraph: RenderSurfaceSelector {id: surfaceSelector//Viewport场景的视口指定 Qt3D 渲染到渲染表面的哪个部分。//视口外的区域保持不变。 它还控制该视口中渲染的全局参数,如 gamma。//指定视口的伽马系数。 默认值为 2.2,它应该在大多数屏幕上给出正确的结果。//创建多个渲染视图Viewport {id: mainViewport//指定视口的规范化矩形,即视口矩形是相对于渲染表面大小指定的。 //整个表面大小的视口指定为 [0.0, 0.0, 1.0, 1.0],这是默认值。normalizedRect: Qt.rect(0, 0, 1, 1)//Qt3DRender::QClearBuffers FrameGraph 节点可以清除具有特定值的特定渲染目标缓冲区。ClearBuffers {buffers: ClearBuffers.ColorDepthBufferclearColor: Qt.rgba(0.6, 0.6, 0.6, 1.0)}//CameraSelector 可用于选择相机,在绘制实体时由 FrameGraph 使用。Viewport {id: topLeftViewportnormalizedRect: Qt.rect(0, 0, 0.5, 0.5)CameraSelector { id: cameraSelectorTopLeftViewport }}Viewport {id: topRightViewportnormalizedRect: Qt.rect(0.5, 0, 0.5, 0.5)CameraSelector { id: cameraSelectorTopRightViewport }}Viewport {id: bottomLeftViewportnormalizedRect: Qt.rect(0, 0.5, 0.5, 0.5)CameraSelector { id: cameraSelectorBottomLeftViewport }}Viewport {id: bottomRightViewportnormalizedRect: Qt.rect(0.5, 0.5, 0.5, 0.5)CameraSelector { id: cameraSelectorBottomRightViewport }}}}
}

SimpleCamera.qml


import Qt3D.Core 2.0
import Qt3D.Render 2.0Entity {id: rootproperty vector3d position: Qt.vector3d(0.0, 0.0, 10.0)property vector3d viewCenter: Qt.vector3d(0.0, 0.0, 0.0)property vector3d upVector: Qt.vector3d(0.0, 1.0, 0.0)property CameraLens lens: nullcomponents: [lens, transform]Transform {id: transformmatrix: {var m = Qt.matrix4x4();m.translate(root.position)var zAxis = root.position.minus(root.viewCenter).normalized()var xAxis = root.upVector.crossProduct(zAxis).normalized();var yAxis = zAxis.crossProduct(xAxis);var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0,xAxis.y, yAxis.y, zAxis.y, 0,xAxis.z, yAxis.z, zAxis.z, 0,0, 0, 0, 1)return m.times(r);}}
}

在这里插入图片描述


http://www.ngui.cc/el/5239680.html

相关文章

Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/pbr-materials

main.cpp //演示使用 PBR 材料的 QML 应用程序。 //Pbr-Materials 演示了如何使用 Qt 3D 材料系统。#include <Qt3DQuickExtras/qt3dquickwindow.h> #include <Qt3DQuick/QQmlAspectEngine> #include <QGuiApplication> #include <QQmlEngine> #inclu…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/areachart

//创建Area Charts //要创建Area Charts&#xff0c;我们需要两个 QLineSeries 实例。 //他们将定义该区域的上下边界。 QLineSeries *series0 new QLineSeries();QLineSeries *series1 new QLineSeries();//我们将数据添加到两个系列并使用流运算符。 *series0 << QPo…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/barchart

//创建条形图 //条形图在所有条形图中的使用方式相同。 //为了说明各种条形图之间的差异 //我们在示例中使用了相同的数据。 //条形图可视化的数据由 QBarSet 实例定义。 //在这里&#xff0c;我们创建集合并将数据附加到它们。 //数据在此处附加了 << 运算符。 //或者&a…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/barmodelmapper

//为了显示两家公司的份额偏差&#xff0c; //我们首先创建两个 QBoxPlotSeries 来处理月度数据。 QBoxPlotSeries *acmeSeries new QBoxPlotSeries();acmeSeries->setName("Acme Ltd");QBoxPlotSeries *boxWhiskSeries new QBoxPlotSeries();boxWhiskSeries-&g…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/callout

//QChart 类提供了两种在场景坐标和系列域&#xff08;由轴范围定义&#xff09;之间映射的方法。 //QPointF QChart::mapToPosition(const QPointF &value, QAbstractSeries *series) //QPointF QChart::mapToValue(const QPointF &position, QAbstractSeries *series…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/candlestickchart

//创建股票图 //为了显示股票图表&#xff0c;我们首先创建 QCandlestickSeries 来处理每日数据。 //我们还指定了自定义增加和减少的车身颜色。 QCandlestickSeries *acmeSeries new QCandlestickSeries();acmeSeries->setName("Acme Ltd");acmeSeries->setI…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/chartthemes

//Creating Charts //不同类型的图表分别生成并添加到布局中 //如&#xff0c;折线图创建如下。 其他图表类型的创建与此类似。 //首先创建一个图表。 QChart *chart new QChart();chart->setTitle("Line chart");//生成一组通用的随机数据并将其放置在列表中。 …

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/datetimeaxis

//创建折线图 //要创建折线图&#xff0c;需要 QLineSeries 实例。 让我们创建一个。 QLineSeries *series new QLineSeries();//在图表上&#xff0c;我们将展示太阳黑子的数量如何随时间变化。 //数据&#xff08;来自空间天气预报中心&#xff09;是从文本文件中读取的。 /…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/donutbreakdown

//创建甜甜圈细分图表 //让我们首先为图表定义一些数据。 QPieSeries *series1 new QPieSerise();series1->setName("Fossil fuels");series1->append("Oil",353295);series1->append("Coal",188500);series1->append("Nature…

Qt例子学习笔记 - Examples/Qt-6.2.0/corelib/ipc/localfortuneclient

main.cpp #include <QApplication>#include "client.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);//[since 5.0] applicationDisplayName : QString//此属性包含此应用程序的用户可见名称//该名称显示给用户&#xff0c;例如在窗口标题…