当前位置: 首页 > news >正文

QML 3D入门知识路线

目前使用的版本

        v5.14.0

模块导入

        使用QML 3D时需要 import Qt3D.Core 2.14

核心模块类

        V6以上的版本已经发布,所以有很多module会发生变化,主要有核心module、输入、逻辑、渲染、动画和扩展module,以及2D/3D场景模块       

类名        能力

View3D

为绘制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和…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Kafka主题运维全指南:从基础配置到故障处理

#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

消息队列系统设计与实践全解析

文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...