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

相关文章

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho