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

2024-04-13 14:48

本文主要是介绍Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/multiviewport,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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);}}
}

在这里插入图片描述

这篇关于Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/multiviewport的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900436

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类