Qt 5.12--《Mastering Qt 5》介绍Qt3D

2023-10-15 03:59
文章标签 介绍 qt 5.12 mastering qt3d

本文主要是介绍Qt 5.12--《Mastering Qt 5》介绍Qt3D,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt 5.12--《Mastering Qt 5》介绍Qt3D

  • 1 Qt3D功能特色
  • 2 ECS 架构
  • 3 示例一
    • 3.1 创建Entity
    • 3.2 Apple.qml文件基本结构
    • 3.3 成为别的Entity的子类
    • 3.4 Qt3D处理为Item
  • 4 示例二
    • 4.1 定义场景
  • 5 知识点
    • 5.1 Qt3D模块的继承树
    • 5.2 笛卡尔坐标系
  • 参考

1 Qt3D功能特色

  • 2D和3D被C++和Quick支持
  • Meshes 网
  • Materials 材料
  • GLSL shaders GLSL着色器
  • Shadow mapping 阴影贴图
  • Deferred rendering 延迟渲染
  • Instance rendering 实例渲染
  • Uniform Buffer Object 统一缓冲区对象

2 ECS 架构

  • Entity Component System。
    Mesh + Material + shader 组成一个 component。
    多个 component 组成一个 Entity 。

3 示例一

绘画一个3D的红苹果

3.1 创建Entity

  • A mesh component, holding the vertices of your apple
    mesh 组件,确定苹果的轮廓
  • A material component,applying a texture on the mesh or coloring it
    材料组件,在网格上应用纹理或为其着色

这两个组件组成定义了苹果的Entity,这便是ECS定义的两个部分。
在这里插入图片描述

3.2 Apple.qml文件基本结构

import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12Entity {property alias position: transform.translationPhongMaterial {id: materialdiffuse: "red"}SphereMesh {id: mesh}Transform {id: transform}components: [material, mesh, transform]
}

Entity: 文件的根对象
PhongMaterial:定义材质
SphereMesh: 定义mesh的类型
Transform:定义了组件变换矩阵,变换、缩放、Entity元素位置
position:这是为派生类或者父类提供 transform.translation的属性,方便对模型移动操作
components:这是Entity元素包含的所有component控件ID的数组

3.3 成为别的Entity的子类

World.qml

import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12Entity {id:sceneRootRenderSettings {id: renderSettingsactiveFrameGraph: ForwardRenderer {clearColor: Qt.rgba(0, 0, 0, 1)}}Apple {id: appleposition: Qt.vector3d(3.0, 0.0, 2.0)}components: [frameGraph]
}

3.4 Qt3D处理为Item

Qt3D 类没有继承Item,所以不能直接和QML控件使用。可以使用Scene3D,成为Item。

Rectangle {Scene3D {id: sceneanchors.fill: parentfocus: trueworld {}}
}

4 示例二

4.1 定义场景

  • 初步定义场景
    定义场景root,文件GameArea.qml
import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12Entity {property alias gameRoot: rootid:rootCamera {property real x: 24.5property real y: 14.0id: cameraprojectionType: CameraLens.PerspectiveProjectionfieldOfView: 45aspectRatio: 16/9nearPlane: 0.1farPlane: 0.1position: Qt.vector3d(x, y, 33.0)upVector: Qt.vector3d(0.0, 1.0, 0.0)viewCenter: Qt.vector3d(x, y, 0.0)}RenderSettings {id: frameFraphactiveFrameGraph: ForwardRender {clearColor: Qt.rgba(0, 0, 0, 1)camera: camera}}components: [frameFraph]	
}

在这里插入图片描述
position: Qt.vector3d(x, y, 33.0)
相机的位置
在相对于父实体的坐标中保持摄影机的当前位置
upVector: Qt.vector3d(0.0, 1.0, 0.0)
相机的朝向
将相机的当前上矢量保持在相对于父实体的坐标中。
viewCenter: Qt.vector3d(x, y, 0.0)
此向量描述了从摄影机(位置)到目标(viewCenter)的位移
clearColor: Qt.rgba(0, 0, 0, 1)
背景颜色为黑色
camera: camera
决定视野所见

  • 添加用户输入
    准备渲染场景时,需要处理用户输入(键盘)捕捉键盘事件,修改GameArea.qml如下
import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Input 2.12
import Qt3D.Extras 2.12
import QtQuick 2.12Entity {property alias gameRoot: rootproperty alias timerInterval: timer.intervalproperty int initialTimeInterval: 80property int initialSnakeSize: 5property string state: ""id:rootCamera {property real x: 24.5property real y: 14.0id: cameraprojectionType: CameraLens.PerspectiveProjectionfieldOfView: 45aspectRatio: 16/9nearPlane: 0.1farPlane: 0.1position: Qt.vector3d(x, y, 33.0)upVector: Qt.vector3d(0.0, 1.0, 0.0)viewCenter: Qt.vector3d(x, y, 0.0)}RenderSettings {id: frameFraphactiveFrameGraph: ForwardRender {clearColor: Qt.rgba(0, 0, 0, 1)camera: camera}}KeyboardDevice {id: keyboardController}InputSettings { id: inputSettings }KeyboardHandler {id: inputsourceDevice: keyboardControllerfocus: trueonPressed: { }}Component.onCompleted: {console.log("start game ...")timer.start()}Timer {id: timerinterval: initialTimeIntervalrepeat: trueonTriggered: { }}components: [frameFraph, input]	
}interval: initialTimeInterval
定时器80ms响应一次,调用update()

5 知识点

5.1 Qt3D模块的继承树

Qt3D 类没有继承Item,所以不能直接和QML控件使用。可以使用Scene3D,成为Item。
在这里插入图片描述

5.2 笛卡尔坐标系

OpenGL中采用右手坐标系

  • 左手定则如图
  • 右手定则如图
    在这里插入图片描述

参考

1、笛卡尔坐标系左手坐标系与右手坐标系
2、《Mastering Qt 5》[2nd]
3、Camera QML Type

这篇关于Qt 5.12--《Mastering Qt 5》介绍Qt3D的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

QT 中ListView和ListWidget有什么区别

ListView和ListWidget在Qt框架中都是用于显示列表数据的控件,但它们在使用方法和特性上存在一些明显的差异。以下是关于它们用法不一样的地方的详细分析: 数据管理方式: ListView:使用QAbstractItemModel数据模型来管理和显示列表数据。QAbstractItemModel是一个抽象类,允许开发者自定义数据模型以适应特定的数据结构和需求。这使得ListView在处

C++标准模板库STL介绍

STL的六大组成部分 STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法,使得 C++ 编程变得更加高效和方便。STL 包括了 6 大类组件,分别是算法(Algorithm)、容器(Container)、空间分配器(Allocator)、迭代器(Iterator)、函数对象(Functor)、适配器(Adapter)

如何使用Qt的PIMPL习惯用法(PIMPL Idiom

) PIMPL是指“Pointer to IMPLementation”(指向实现的指针),意味着将实现细节隐藏起来,用户类无需关注这些实现细节。在Qt中常用PIMPL习惯用法来清晰地区分接口与实现,尽管Qt官方文档并未详细说明该机制。本文将演示如何在Qt中使用PIMPL习惯用法,并以一个简单的坐标输入对话框作为实例。 原理与动机 PIMPL的核心在于将类的实现细节封装在一个私有类中,这个私

【Qt6.3 基础教程 17】 Qt布局管理详解:创建直观和响应式UI界面

文章目录 前言布局管理的基础为什么需要布局管理器? 盒布局:水平和垂直排列小部件示例:创建水平盒布局 栅格布局:在网格中对齐小部件示例:创建栅格布局 表单布局:为表单创建标签和字段示例:创建表单布局 调整空间和伸缩性示例:增加弹性空间 总结 前言 当您开始使用Qt设计用户界面(UI)时,理解布局管理是至关重要的。布局管理不仅关系到UI的外观,更直接影响用户交互的体验。本篇博

【Qt6.3 基础教程 16】 掌握Qt中的时间和日期:QTimer和QDateTime的高效应用

文章目录 前言QTimer:定时任务的强大工具QTimer的基本用法高级特性:单次定时器 QDateTime:处理日期和时间获取当前日期和时间日期和时间的格式化输出日期和时间计算 用例:创建一个倒计时应用结论 前言 在开发桌面应用程序时,处理时间和日期是一个常见且重要的任务。Qt框架提供了强大的工具来处理与时间相关的功能,其中QTimer和QDateTime是最核心的类。本

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。

49-1 内网渗透 - Bypass UAC介绍

一、Bypass UAC         用户账户控制(UAC)是Windows操作系统的一种安全机制,旨在防止未经授权的应用程序自动安装并防止非授权修改系统设置。它确保应用程序和任务通常在非管理员账户的安全上下文中运行,除非明确需要管理员权限,用户才会被提示确认。         对于非RID 500的管理员用户(除了内置的Administrator账户),当他们登录时,系统会为其分配两个访

okhttp3的详细介绍

这篇文章说下OkHttp的基本用法,是最新的3哦,如果你曾经在网上搜索OkHttp怎么使用发现有些类没有了可能是因为人家说的是2。首先说下OkHttp3是Java和Android都能用,Android还有一个著名网络库叫Volley,那个只有Android能用。导入自己到入jar包,别漏了okio:okhttp-3.3.0.jarokio-1.8.0.jarmaven方式:<dependen