QML 3D入门知识路线
目前使用的版本
v5.14.0
模块导入
使用QML 3D时需要 import Qt3D.Core 2.14
核心模块类
V6以上的版本已经发布,所以有很多module会发生变化,主要有核心module、输入、逻辑、渲染、动画和扩展module,以及2D/3D场景模块
| 类名 | 能力 |
| 为绘制3D数据提供了在2D场景中显示的窗口 | |
| OrbitCameraController | 按照轨道路线来控制场景相机 |
| QAbstractAnimation | 3D动画的顶层root类,派生的动画类提供了动画效果能力 |
学习路线
3d效果中离不开动画,所以要想学好3d部分,需要将动画部分也掌握。然后再从最基础的3d理论知识入门
Demo
官方给出了很多例子,可以根据官方demo进行由浅入深的学习。地址在source code中:SourceCode Root Path/qt3d/
此外,网络上还提供了不少入门的demo,从较小的纬度(基础的加载3d资源、鼠标处理等操作)提供了演示操作,下面是收集来的各种操作集合。
1、加载3D模型资源+将.obj文件转换成.mesh类型文件
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")View3D {id: view3Danchors.fill: parentenvironment: sceneEnvironmentSceneEnvironment {id: sceneEnvironmentantialiasingQuality: SceneEnvironment.HighantialiasingMode: SceneEnvironment.MSAA}Node {id: nodeDirectionalLight {id: directionalLight}PerspectiveCamera {id: cameraz: 15}Model {id: cubeModelsource: "test.mesh"DefaultMaterial {id: cubeMaterialdiffuseColor: "#4aee45"}materials: cubeMaterial}}}
}
2、鼠标控制场景缩放和旋转
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")View3D {id: view3Danchors.fill: parentenvironment: sceneEnvironmentSceneEnvironment {id: sceneEnvironmentantialiasingQuality: SceneEnvironment.HighantialiasingMode: SceneEnvironment.MSAA}MouseArea{id:mouseanchors.fill: parentproperty int cx: 0property int cy: 0onWheel: {if(wheel.angleDelta.y>0)camera.z = camera.z+5elsecamera.z = camera.z-5}onPressed: {cx = mouse.xcy = mouse.y}onPositionChanged: {var intervalX = mouse.x-cxvar intervalY = mouse.y-cycameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.ycameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalYcx = mouse.xcy = mouse.y}}Node {id: nodeDirectionalLight {id: directionalLight}Model {id: cubeModelsource: "test.mesh"DefaultMaterial {id: cubeMaterialdiffuseColor: "#4aee45"}materials: cubeMaterial}}Node{id:cameraNodePerspectiveCamera {id: cameraz: 15}}}
}
3、设置模型的金属光泽材质
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")View3D {id: view3Danchors.fill: parentenvironment: sceneEnvironmentSceneEnvironment {id: sceneEnvironmentantialiasingQuality: SceneEnvironment.HighantialiasingMode: SceneEnvironment.MSAA}MouseArea{id:mouseanchors.fill: parentproperty int cx: 0property int cy: 0onWheel: {if(wheel.angleDelta.y>0)camera.z = camera.z+5elsecamera.z = camera.z-5}onPressed: {cx = mouse.xcy = mouse.y}onPositionChanged: {var intervalX = mouse.x-cxvar intervalY = mouse.y-cycameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.ycameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalYcx = mouse.xcy = mouse.y}}Node {id: nodeDirectionalLight {id: directionalLight}Model {id: cubeModelsource: "test.mesh"materials: PrincipledMaterial {id: cubeMaterialbaseColor: "#e9d805"roughness: 0.4metalness: 0.8}}}Node{id:cameraNodePerspectiveCamera {id: cameraz: 15}}}
}
4、使用2d的动画类来操作3d模型
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello Qt Quick 3D")View3D {id: view3Danchors.fill: parentenvironment: sceneEnvironmentSceneEnvironment {id: sceneEnvironmentantialiasingQuality: SceneEnvironment.HighantialiasingMode: SceneEnvironment.MSAA}Node {id: nodeDirectionalLight {id: directionalLight}Model {id: cubeModelsource: "test.mesh"DefaultMaterial {id: cubeMaterialdiffuseColor: "#4aee45"}materials: cubeMaterial}}Node{id:cameraNodePerspectiveCamera {id: cameraz: 15}NumberAnimation {id:camerAnimationtarget: cameraNodeproperty: "eulerRotation.y"duration: 5000from: 0to: -360loops: Animation.Infiniterunning: true}}}
}
5、综合性的显示3D模型(材质颜色、动画以及鼠标缩放等)
如果需要自定义背景图片时,需要设置View3D的背景色为透明,方法在上面链接中
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15Window {width: 480height: 450visible: truetitle: qsTr("Hello Qt Quick 3D")color: "#00192e"Image{opacity: 0.3anchors.fill: parentsource: "qrc:/bg1.png"fillMode: Image.PreserveAspectCrop}View3D {id: view3Danchors.fill: parentenvironment: SceneEnvironment {id: sceneEnvironment//需要设置3D视图背景透明backgroundMode: SceneEnvironment.TransparentclearColor: "transparent"antialiasingQuality: SceneEnvironment.HighantialiasingMode: SceneEnvironment.MSAA}MouseArea{id:mouseanchors.fill: parentproperty int cx: 0property int cy: 0onWheel: {if(wheel.angleDelta.y>0)cameraPerspective.z = cameraPerspective.z+5elsecameraPerspective.z = cameraPerspective.z-5}onPressed: {camerAnimation.pause()cx = mouse.xcy = mouse.y}onReleased: {camerAnimation.resume()}onPositionChanged: {var intervalX = mouse.x-cxvar intervalY = mouse.y-cycameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.ycameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalYcx = mouse.xcy = mouse.y}}Node {id: sceneDirectionalLight {x: 56eulerRotation.y: 90ambientColor: "#1c1a17"brightness: 163}Node {id: rootNodescale:Qt.vector3d(0.1,0.1,0.1)Node {x: 12.4775y: 36.2141z: 10.5153eulerRotation.x: 180eulerRotation.y: 32.0597eulerRotation.z: -180Model {x: 121.16y: -17.21z: 86.29eulerRotation.x: 180eulerRotation.y: -32.0597eulerRotation.z: -180source: "meshes/Plane.mesh"materials: PrincipledMaterial {baseColor: "#a0a2a3"roughness: 0.6metalness: 0.5}}}PointLight {x: 80.1709y: 382.888z: -150.021eulerRotation.x: -69.997eulerRotation.y: 59.9021eulerRotation.z: -180color: "#fffff5e1"}PointLight {x: -305.432y: 199.762z: 163.037eulerRotation.x: 173eulerRotation.y: -59.9035color: "#ffecf9ff"}PointLight {x: 238.189y: 380.379z: 252.482eulerRotation.x: 138.592eulerRotation.y: 36.109color: "#ff3b5966"}}Node{id:cameraNodeeulerRotation.x: -20eulerRotation.y: 120PerspectiveCamera {id: cameraPerspectivey: 5clipNear: 0.1fieldOfView: 50z:90clipFar: 800}NumberAnimation {id:camerAnimationtarget: cameraNodeproperty: "eulerRotation.y"duration: 5000from: 0to: 360loops: Animation.Infiniterunning: true}}}Text {text: qsTr("鼠标左键:旋转;鼠标滚轮:缩放")anchors.right: parent.rightanchors.bottom: parent.bottomfont.pointSize: 12font.bold: trueanchors.rightMargin: 10anchors.bottomMargin: 10font.family: "微软雅黑"color:"ghostwhite"}}
}
基本元素
三维坐标
两个坐标,连接起来就是北面墙。什么意思?想象一下,其中一个坐标是东北方的下墙角,以墙角为原点,往南是X轴;往上是Y轴;往西是Z轴。另一个坐标是西北方的下墙角,还是以墙角为原点,往南是X轴;往上是Y轴;往东是Z轴。两个坐标系相互延伸、连接起来就是一面北墙。
坐标旋转方向
半握右手,大拇指朝上,从手背到四指的延伸方向就是坐标轴旋转方向
相关文章:
QML 3D入门知识路线
目前使用的版本 v5.14.0 模块导入 使用QML 3D时需要 import Qt3D.Core 2.14 核心模块类 V6以上的版本已经发布,所以有很多module会发生变化,主要有核心module、输入、逻辑、渲染、动画和扩展module,以及2D/3D场景模块 类名 能…...
蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)
蓝牙学习系列,借鉴卫东上老师的蓝牙视频教程。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现有很多main.c,都是…...
c++ 类内可以定义引用数据成员吗?
在C中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象。下面是一个简单的示例: …...
MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X
CleanMyMac X是一款专业的Mac清理软件,具备多种强大功能。首先,它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包,从而快速释放电脑内存。其次,CleanMyMac X可以轻松管理和升级Mac上的应用,同时强力卸载恶意软件并修…...
Vue.js计算属性:实现数据驱动的利器
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
10-ARM gicv3/gicv4的总结-基础篇
目录 1、gic的版本2、GICv3/gicv4的模型图3、gic中断号的划分4、GIC连接方式5、gic的状态6、gic框架7、gic Configuring推荐 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,s…...
数据库系统概论(超详解!!!) 第三节 关系数据库
1.基本概念 1. 域(Domain) 域是一组具有相同数据类型的值的集合。 2. 笛卡尔积(Cartesian Product) 给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2…...
Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费
证书准备:springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换,因为kafka里面是jks 需要通过openssl进行转换。 证书处理: KeyStore 用于存储客户端的证…...
spark 实验二 RDD编程初级实践
目录 一. pyspark交互式编程示例(学生选课成绩统计) 该系总共有多少学生; 该系DataBase课程共有多少人选修; 各门课程的平均分是多少; 使用累加器计算共有多少人选了DataBase这门课。 二.编写独立应用程序实现数…...
【MySQL】not in遇上null的坑
今天遇到一个问题: 1、当 in 内的字段包含 null 的时候,正常过滤; 2、当 not in 内的字段包含 null 的时候,不能正常过滤,即使满足条件,最终结果也为 空。 测试如下: select * from emp e;当…...
鸿蒙4.0-DevEco Studio界面工程
DevEco Studio界面工程 DevEco Studio 下载与第一个工程新建的第一个工程界面回到Project工程结构来看 DevEco Studio 下载与第一个工程 DevEco Studio 下载地址:点击跳转 https://developer.harmonyos.com/cn/develop/deveco-studio#download 学习课堂以及文档地址…...
前端将html导出pdf文件解决分页问题
这是借鉴了qq_251025116大佬的解决方案并优化升级完成的,原文链接 1.安装依赖 npm install jspdf html2canvas2.使用方法 import htmlToPdffrom ./index.jsconst suc () > {message.success(success);};//记得在需要打印的div上面添加 idlet dom document.que…...
openssl3.2 - exp - 产生随机数
文章目录 openssl3.2 - exp - 产生随机数概述笔记END openssl3.2 - exp - 产生随机数 概述 要用到openssl产生的随机数, 查了资料. 如果用命令行产生随机数, 如下: openssl rand -hex -num 6 48bfd3a64f54单步跟进去, 看到主要就是调用了一个RAND_bytes(), 没其他了. 官方说…...
【三两波折】char *foo[]和char(*foo)[]有何不同?
1、先谈优先级 最高级别 —— 有四个,他们并不像运算符: []数组下标左到右结合()用于(表达式) or 函数名(形参表)左到右结合.读取结构体成员左到右结合->读取结构体成员(通过指针)左到右结合 第二级别…...
k8s(kubernetes)怎么查看pod服务对应哪些docker容器
Kubernetes(k8s)中的Pod是一组共享网络和存储资源的容器集合。每个Pod都包含一个或多个Docker容器,这些容器共享网络命名空间和存储卷,并在同一主机上运行。因此,可以将Pod视为一组紧密相关的Docker容器的逻辑主机&…...
[2023年]-hadoop面试真题(二)
[2023年]-hadoop面试真题(一) (北京) Maptask的个数由什么决定?(北京) 如何判定一个job的map和reduce的数量 ?(北京) MR中Shuffle过程 ?(北京) MR中处理数据流程 ?(…...
蓝桥杯备战刷题-滑动窗口
今天给大家带来的是滑动窗口的类型题,都是十分经典的。 1,无重复字符的最长子串 看例三,我们顺便来说一下子串和子序列的含义 子串是从字符串里面抽出来的一部分,不可以有间隔,顺序也不能打乱。 子序列也是从字符串里…...
LLM(十一)| Claude 3:Anthropic发布最新超越GPT-4大模型
2024年3月4日,Anthropic发布最新多模态大模型:Claude 3系列,共有Haiku、Sonnet和Opus三个版本。 Opus在研究生水平专家推理、基础数学、本科水平专家知识、代码等10个维度,超过OpenAI的GPT-4。 Haiku模型更注重效率,能…...
20-Java备忘录模式 ( Memento Pattern )
Java备忘录模式 摘要实现范例 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象 备忘录模式属于行为型模式 摘要 1. 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对…...
整合生成型AI战略:从宏观思维到小步实践
“整合生成型AI战略:从宏观思维到小步实践” 在这篇文章中,我们探讨了将生成型AI和大型语言模型融入企业核心业务的战略开发方法。我们的方法基于敏捷开发原则,技术专家和数据科学家需要采纳商业思维,而执行官则需理解生成型AI和…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
