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.15
 
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
 
    View3D {
        id: view3D
        anchors.fill: parent
        environment: sceneEnvironment
        SceneEnvironment {
            id: sceneEnvironment
            antialiasingQuality: SceneEnvironment.High
            antialiasingMode: SceneEnvironment.MSAA
        }
 
        Node {
            id: node
            DirectionalLight {
                id: directionalLight
            }
 
            PerspectiveCamera {
                id: camera
                z: 15
            }
 
            Model {
                id: cubeModel
                source: "test.mesh"
                DefaultMaterial {
                    id: cubeMaterial
                    diffuseColor: "#4aee45"
                }
                materials: cubeMaterial
            }
        }
    }
}

      2、鼠标控制场景缩放和旋转

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15
 
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
 
    View3D {
        id: view3D
        anchors.fill: parent
        environment: sceneEnvironment
        SceneEnvironment {
            id: sceneEnvironment
            antialiasingQuality: SceneEnvironment.High
            antialiasingMode: SceneEnvironment.MSAA
        }
 
        MouseArea{
            id:mouse
            anchors.fill: parent
            property int cx: 0
            property int cy: 0
            onWheel: {
                if(wheel.angleDelta.y>0)
                    camera.z = camera.z+5
                else
                    camera.z = camera.z-5
            }
            onPressed: {
                cx = mouse.x
                cy = mouse.y
            }
 
            onPositionChanged: {
                var intervalX = mouse.x-cx
                var intervalY = mouse.y-cy
                cameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.y
                cameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalY
                cx = mouse.x
                cy = mouse.y
            }
        }
        Node {
            id: node
            DirectionalLight {
                id: directionalLight
            }
 
            Model {
                id: cubeModel
                source: "test.mesh"
                DefaultMaterial {
                    id: cubeMaterial
                    diffuseColor: "#4aee45"
                }
                materials: cubeMaterial
            }
        }
 
        Node{
            id:cameraNode
            PerspectiveCamera {
                id: camera
                z: 15
            }
        }
    }
}

     

        3、设置模型的金属光泽材质

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15
 
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
 
    View3D {
        id: view3D
        anchors.fill: parent
        environment: sceneEnvironment
        SceneEnvironment {
            id: sceneEnvironment
            antialiasingQuality: SceneEnvironment.High
            antialiasingMode: SceneEnvironment.MSAA
        }
 
        MouseArea{
            id:mouse
            anchors.fill: parent
            property int cx: 0
            property int cy: 0
            onWheel: {
                if(wheel.angleDelta.y>0)
                    camera.z = camera.z+5
                else
                    camera.z = camera.z-5
            }
            onPressed: {
                cx = mouse.x
                cy = mouse.y
            }
 
            onPositionChanged: {
                var intervalX = mouse.x-cx
                var intervalY = mouse.y-cy
                cameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.y
                cameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalY
                cx = mouse.x
                cy = mouse.y
            }
        }
        Node {
            id: node
            DirectionalLight {
                id: directionalLight
            }
 
            Model {
                id: cubeModel
                source: "test.mesh"

                materials: PrincipledMaterial {
                    id: cubeMaterial
                    baseColor: "#e9d805"
                    roughness: 0.4
                    metalness: 0.8
                }
            }
        }
 
        Node{
            id:cameraNode
            PerspectiveCamera {
                id: camera
                z: 15
            }
        }
    }
}

        4、使用2d的动画类来操作3d模型

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15
 
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello Qt Quick 3D")
 
    View3D {
        id: view3D
        anchors.fill: parent
        environment: sceneEnvironment
        SceneEnvironment {
            id: sceneEnvironment
            antialiasingQuality: SceneEnvironment.High
            antialiasingMode: SceneEnvironment.MSAA
        }
 
        Node {
            id: node
            DirectionalLight {
                id: directionalLight
            }
 
            Model {
                id: cubeModel
                source: "test.mesh"
                DefaultMaterial {
                    id: cubeMaterial
                    diffuseColor: "#4aee45"
                }
                materials: cubeMaterial
            }
        }
 
        Node{
            id:cameraNode
 
            PerspectiveCamera {
                id: camera
                z: 15
            }
 
            NumberAnimation {
                id:camerAnimation
                target: cameraNode
                property: "eulerRotation.y"
                duration: 5000
                from: 0
                to: -360
                loops: Animation.Infinite
                running: true
            }
        }
    }
}

 

        5、综合性的显示3D模型(材质颜色、动画以及鼠标缩放等)

         如果需要自定义背景图片时,需要设置View3D的背景色为透明,方法在上面链接中

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15

Window {
    width: 480
    height: 450
    visible: true
    title: qsTr("Hello Qt Quick 3D")
    color: "#00192e"

    Image{
        opacity: 0.3
        anchors.fill: parent
        source: "qrc:/bg1.png"
        fillMode: Image.PreserveAspectCrop
    }

    View3D {
        id: view3D
        anchors.fill: parent
        environment: SceneEnvironment {
            id: sceneEnvironment
            //需要设置3D视图背景透明
            backgroundMode: SceneEnvironment.Transparent
            clearColor: "transparent"
            antialiasingQuality: SceneEnvironment.High
            antialiasingMode: SceneEnvironment.MSAA
        }


        MouseArea{
            id:mouse
            anchors.fill: parent
            property int cx: 0
            property int cy: 0
            onWheel: {
                if(wheel.angleDelta.y>0)
                    cameraPerspective.z = cameraPerspective.z+5
                else
                    cameraPerspective.z = cameraPerspective.z-5
            }
            onPressed: {
                camerAnimation.pause()
                cx = mouse.x
                cy = mouse.y
            }
            onReleased: {
                camerAnimation.resume()
            }
            onPositionChanged: {
                var intervalX = mouse.x-cx
                var intervalY = mouse.y-cy
                cameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.y
                cameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalY
                cx = mouse.x
                cy = mouse.y

            }
        }

        Node {
            id: scene

            DirectionalLight {
                x: 56
                eulerRotation.y: 90

                ambientColor: "#1c1a17"
                brightness: 163
            }
            Node {
                id: rootNode
                scale:Qt.vector3d(0.1,0.1,0.1)
                Node {
                    x: 12.4775
                    y: 36.2141
                    z: 10.5153
                    eulerRotation.x: 180
                    eulerRotation.y: 32.0597
                    eulerRotation.z: -180

                    Model {
                        x: 121.16
                        y: -17.21
                        z: 86.29
                        eulerRotation.x: 180
                        eulerRotation.y: -32.0597
                        eulerRotation.z: -180
                        source: "meshes/Plane.mesh"

                        materials: PrincipledMaterial {
                            baseColor: "#a0a2a3"
                            roughness: 0.6
                            metalness: 0.5

                        }
                    }
                }


                PointLight {
                    x: 80.1709
                    y: 382.888
                    z: -150.021
                    eulerRotation.x: -69.997
                    eulerRotation.y: 59.9021
                    eulerRotation.z: -180
                    color: "#fffff5e1"
                }

                PointLight {
                    x: -305.432
                    y: 199.762
                    z: 163.037
                    eulerRotation.x: 173
                    eulerRotation.y: -59.9035
                    color: "#ffecf9ff"
                }

                PointLight {
                    x: 238.189
                    y: 380.379
                    z: 252.482
                    eulerRotation.x: 138.592
                    eulerRotation.y: 36.109
                    color: "#ff3b5966"
                }
            }

            Node{
                id:cameraNode
                eulerRotation.x: -20
                eulerRotation.y: 120
                PerspectiveCamera {
                    id: cameraPerspective
                    y: 5
                    clipNear: 0.1
                    fieldOfView: 50
                    z:90
                    clipFar: 800
                }
                NumberAnimation {
                    id:camerAnimation
                    target: cameraNode
                    property: "eulerRotation.y"
                    duration: 5000
                    from: 0
                    to: 360
                    loops: Animation.Infinite
                    running: true
                }
            }



        }

        Text {
            text: qsTr("鼠标左键:旋转;鼠标滚轮:缩放")
            anchors.right: parent.right
            anchors.bottom: parent.bottom
            font.pointSize: 12
            font.bold: true
            anchors.rightMargin: 10
            anchors.bottomMargin: 10
            font.family: "微软雅黑"
            color:"ghostwhite"
        }
    }
}

 

基本元素

        三维坐标

        两个坐标,连接起来就是北面墙。什么意思?想象一下,其中一个坐标是东北方的下墙角,以墙角为原点,往南是X轴;往上是Y轴;往西是Z轴。另一个坐标是西北方的下墙角,还是以墙角为原点,往南是X轴;往上是Y轴;往东是Z轴。两个坐标系相互延伸、连接起来就是一面北墙。

        坐标旋转方向

        半握右手,大拇指朝上,从手背到四指的延伸方向就是坐标轴旋转方向

        

相关推荐

  1. QML 3D入门知识路线

    2024-03-11 00:14:02       41 阅读
  2. [Open3d]: 知识记录

    2024-03-11 00:14:02       40 阅读
  3. kanzi 3d知识

    2024-03-11 00:14:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 00:14:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 00:14:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 00:14:02       82 阅读
  4. Python语言-面向对象

    2024-03-11 00:14:02       91 阅读

热门阅读

  1. 1672.最富有的客户的资产总量

    2024-03-11 00:14:02       43 阅读
  2. ArrayLIst和linkedlist的区别

    2024-03-11 00:14:02       49 阅读
  3. Linux acl权限

    2024-03-11 00:14:02       45 阅读
  4. (力扣题库)跳跃游戏II(C++)

    2024-03-11 00:14:02       36 阅读
  5. 力扣爆刷第90天之hot100五连刷36-40

    2024-03-11 00:14:02       44 阅读
  6. Android 中为什么要使用 Binder 机制?

    2024-03-11 00:14:02       38 阅读
  7. Docker入门简介

    2024-03-11 00:14:02       38 阅读
  8. HTML知识点

    2024-03-11 00:14:02       43 阅读
  9. gitlab仓库迁移

    2024-03-11 00:14:02       40 阅读