当前位置: 首页 > 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和…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

DAY 26 函数专题1

函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await&#xf…...

【Redis】Redis从入门到实战:全面指南

Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...