1. View3D介绍

View3D控件和QML中其它控件类似,只是在其中可以显示三维模型,类似在界面中创建一个场景,所有的模型将在这个场景中被加载出来。

效果展示:

View3D三维模型加载

1.1 常用属性介绍

camera:相机(三维场景中加入相机,才能显示三维模型,控制相机的姿态进而控制三维模型的姿态)
PerspectiveCamera:透视相机,可以模拟人眼所看到的景象,可以显示物体的真是投影,用的较多
OrthographicCamera:正投影相机,平行投影没有视角缩放,可理解为2D相机
FrustumCamera:视锥体相机
CustomCamera:自定义相机
environment :设置场景环境,一般使用 SceneEnvironment
importScene:值类型为 Node 类型,用于设置需要渲染的东西,Node类型可以理解为一个Item,方便对多个组件进行控制。
renderMode :场景渲染模式
View3D.Offscreen
View3D.Underlay
View3D.Overlay
View3D.Inline

2. 场景中添加必要组件

在场景中除了添加相机外,还需要添加灯光模型本身,如果不添加灯光,及时添加了模型,也无法显示,看到的时黑乎乎的屏幕。

2.1 灯光介绍

DirectionalLight:工作原理类似于太阳,可以在场景中均匀投射灯光

DirectionalLight {//eulerRotation:控制坐标轴的旋转角度eulerRotation.x: 200eulerRotation.y: 20//castsShadow设置为 true ,将会显示阴影效果castsShadow: true
}

PointLight:点光源,类似于将光源定位在某一个位置点,在这个位置点发射光线

PointLight {position: Qt.vector3d(100, 100, 150)  //设定光源的位置点castsShadow: true   //开启阴影效果
}

SpotLight :聚光灯,在某一个方向上发生光锥形式的光线,形式类似于家里安装的小射灯样式。

SpotLight {position: Qt.vector3d(50, 200, 50)eulerRotation.x: -90brightness: 5 //控制光源的强度,每一个光源都有这个属性ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)  //控制光源照亮前应用与材质的基色,每一个光源都有这个属性castsShadow: true
}

2.2 模型加载

加载模型使用 Model 组件,在这个组件中必须要设置的属性是 source 和 materials ,即模型路径来源和材质。
source:url (内置的几个模型可以直接以字符串形式给出,包括:“#Rectangle"矩形,”#Sphere"球体,“#Cube"立方体,”#Cone"圆锥体,"#Cylinder"圆柱体)
materials:CustomMaterial, DefaultMaterial, and PrincipledMaterial
例如:在一个 Node 组件中添加光照,模型

Node {id: standAloneScene//! [rootnode]DirectionalLight {ambientColor: Qt.rgba(1.0, 1.0, 1.0, 1.0)}Model {source: "#Cube"y: -104scale: Qt.vector3d(3, 3, 0.1)eulerRotation.x: -90materials: [DefaultMaterial {diffuseColor: Qt.rgba(0.8, 0.8, 0.8, 1.0)}]}}

3. 加载三维模型框架一:

将上述的所有组件都单独写入到 View3D 组件中,这样有个缺点:不方便统一控制组件。示例代码如下:

import QtQuick 2.15
import QtQuick.Window 2.15
import Qt.labs.qmlmodels 1.0
import QtQuick.Controls 2.5
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.15
import QtQuick.Controls.Styles 1.4
import QtQuick3D 1.15ApplicationWindow {id:rootwidth: 640height: 480visible: truetitle: qsTr("Hello World")View3D{anchors.fill: parentenvironment: SceneEnvironment{  //设定渲染环境clearColor: "#1e1e1e"backgroundMode: SceneEnvironment.Color}PerspectiveCamera{              //设定相机position: Qt.vector3d(0,250,300)Component.onCompleted: lookAt(Qt.vector3d(0,0,0))}DirectionalLight{               //设定光源ambientColor: Qt.rgba(1.0,1.0,1.0,1.0)}Model{                          //加载模型一position: Qt.vector3d(0,0,0)source: "#Cone"materials: [PrincipledMaterial{baseColor: "yellow";}]}Model{                          //加载模型二position: Qt.vector3d(0,-10,0)scale: Qt.vector3d(3,3,0.05)eulerRotation.x:90source: "#Cube"materials: [PrincipledMaterial{baseColor: "white";}]} }}

3.1 运行效果:

4. 加载三维模型框架二:

以设置属性的方式,将相关组件设定为 View3D 的属性值,此时需要用到上述提及到的 Node 组件,便于对组件统一控制。示例代码如下:

import QtQuick 2.15
import QtQuick.Window 2.14
import QtQuick3D 1.15
import QtQuick.Controls 2.14Window {id: windowwidth: 1280height: 720visible: truetitle: "View3Ds with Different Cameras"Node { //节点,不可见控件id: standAloneSceneDirectionalLight {ambientColor: Qt.rgba(1.0, 1.0, 1.0, 1.0)}OrthographicCamera {id: cameraOrthographicLeftx: -600eulerRotation.y: -90}Model {source: "#Cube"y: -104scale: Qt.vector3d(3, 3, 0.1)eulerRotation.x: -90materials: [DefaultMaterial {diffuseColor: Qt.rgba(0.8, 0.8, 0.8, 1.0)}]}Model {source: "teapot.mesh"y: -100scale: Qt.vector3d(50, 50, 50)materials: [PrincipledMaterial {baseColor: "#41cd52"metalness: 0.75roughness: 0.1specularAmount: 1.0indexOfRefraction: 2.5opacity: 1.0}]PropertyAnimation on eulerRotation.y {    //添加旋转动画loops: Animation.Infiniteduration: 5000to: 0from: -360}}}Rectangle {id: topLeftanchors.centerIn: parentwidth: parent.width * 0.5height: parent.height * 0.5color: "#848895"border.color: "black"View3D {id: topLeftViewanchors.fill: parentimportScene: standAloneScenecamera: cameraOrthographicLeft}Label {text: "三维模型加载"anchors.top: parent.topanchors.left: parent.leftanchors.margins: 10color: "#222840"font.pointSize: 14}}
}

4.1 运行效果:

View3D三维模型加载

持续更新中,请大家多多关注…

2. QML使用View3D控件显示三维模型相关推荐

  1. Qt基于Qml实现分页控件

    演示效果 分页控件实现Qml PageNavigation.qml import QtQuick 2.12 import QtQuick.Controls 2.12Row{id: pageNaviga ...

  2. Qt使用C++封装qml自定义图形控件(QQuickPaintedItem)

    C++封装qml自定义图形控件 QtWidget.qml简介 通过继承QQuickPaintedItem封装控件 描述 公用接口定义 代码示例 效果图 QtWidget.qml简介 Qt提供了2套UI ...

  3. VB高效导入Excel2003和Excel2007文件到MSHFlexGrid控件显示

    1.VB高效导入Excel2003和Excel2007文件到MSHFlexGrid控件显示 2.以前也有Excel导入通用功能,但速度有些慢一会把两种实现方式都提供出为参考对比. 一.原通用导入exc ...

  4. C#之windows桌面软件第十二课:电脑ADC值显示(上位机),记忆上次串口号,并用TrackBar控件显示ADC值

    C#之windows桌面软件第十二课:电脑ADC值显示(上位机),记忆上次串口号,并用TrackBar控件显示ADC值 using System; using System.Collections.G ...

  5. Qt QML页面翻转控件封装

    前言 用QML实现页面翻转,QML自带控件Flipable已实现该功能,但是无法满足我要的功能需求,于是在Flipable基础上封装了一下,添加翻转过程中的动画,在翻转过程中修改页面opacity.s ...

  6. 演练GridView控件显示目录图片

    本博文,将带你学习使用GridView控件显示站点目录的图片.如果你已经学会怎样做图片缩略图:怎样应用接口来实现统一的属性,方法或函数:怎样动态加载用户控件,等等.就不必往下看了.因为此篇博文就是演练 ...

  7. 部门树形结构,使用Treeview控件显示部门

    部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...

  8. delphi7 mysql控件_Delphi7连接MySql数据库-DBGrid控件显示数据

    一个简单的Delphi7小程序,使用MySql数据库做简单查询,用DBGrid控件显示结果,实现过程如下: (1)在MySql中新建demouser表,插入记录用于测试. (2)在Delphi7中新建 ...

  9. html设置控件位置大小,下面那个代码段设置myButton控件显示在HTML页左上角100px的位置 - 问答库...

    问题: [多选] 下面那个代码段设置myButton控件显示在HTML页左上角100px的位置?() A . B . C . D . 调度例行会议形式有什么() 生产平衡会. 事故分析会. 调度专业会 ...

最新文章

  1. python myqr 二维码生成
  2. oracle绑定变量赋值,Oracle教程之绑定变量
  3. CSS选择器笔记,element element和element element 的区别
  4. index row函数出现日期变数字_VBA-003.多表日期汇总求和
  5. 如何在SAP云平台上使用MongoDB服务 1
  6. 玩转oracle 11g(47):oracle删除非空表空间
  7. MongoDB的快速手动安装
  8. 【学习笔记】第一章——操作系统的中断和异常
  9. python语法基础题你好_Python基础要打牢,先学会基本语法
  10. WCF入门(七)——异常处理1
  11. PHP DDOS攻击的处理办法
  12. Java面试智力题逻辑题汇总2021
  13. a20 linux qt,全志A83T开发板,超树莓派/A20/A31S/banana pi M3/八核/Android5
  14. 什么是Saas,以及什么是PLG下的Saas
  15. 如何用计算机表达无理数,科学网—刘瑞祥:计算机表示无理数的一些设想 - 孙冰的博文...
  16. Cytoscape.js学习记录
  17. 关于tomcat启动时的警告 :maxActive is not used inDBCP2
  18. Spark 场景题详解
  19. 用数据说话,看Google 怎样被陷害(转自sina)
  20. 手把手教你如何一键备份和恢复微信聊天记录

热门文章

  1. 1.在cocos2d里面如何使用texture-packer和像素格式来优化spritesheet.html
  2. 农村人口统计系统代码
  3. 日记侠:朋友圈文案秘籍
  4. 做分页时取整数的计算以及js取整数、取余数的方法
  5. C++提高编程(四)—— STL函数对象
  6. 最大心率值=220一年龄
  7. Acala Mandala 糖果节第二季圆满落幕
  8. python panda 库箱线图_Python数据可视化:箱线图多种库画法
  9. 356,青蛙跳台阶相关问题
  10. 计算机网络中的各种攻击(转)