qml开发3D车载HMI界面-----灯光场景测试

下面我们进入一个场景灯光测试案例:

qmlscene 2023-08-17 12-30-48

首先新建一个LightTestView3D.qml文件,整合代码如下:

import QtQuick 2.15
import QtQuick3D 1.15
import QtQuick.Timeline 1.0
import QtQuick3D.Helpers 1.15

View3D{
    id:view3D
    anchors.fill: parent

    property bool renderScene:true   //true表示场景

    //无照明的话NoLighting就是各个面都一样,fragmentLighting,各个面的光照不一样
    property string matLighting:renderScene ? PrincipledMaterial.FragmentLighting:PrincipledMaterial.NoLighting  //生成材质时的照明
    property int lightBrightness:renderScene ? 100 : 0  //光照亮度
    property int envBrightness:renderScene ? 150:0  //环境亮度 150:0

    environment: sceneEnvironment
    SceneEnvironment{
        id:sceneEnvironment
        backgroundMode: renderScene ? SceneEnvironment.SkyBox: SceneEnvironment.Transparent
        lightProbe: Texture{  //HDRI贴图为天空背景时使用
//            source:"hdr/city01.hdr"
            source:"hdr/333.hdr"
        }
        clearColor:"#000000"
        antialiasingQuality: SceneEnvironment.High  //抗锯齿的质量
        antialiasingMode: SceneEnvironment.MSAA   //应用多样本抗锯齿
        probeBrightness: envBrightness  //此属性修改光照探针发出的光量。(模型的光照亮度,若亮度为0,则模型不显示)
    }

    Node{
        id:scene

        PerspectiveCamera{
            id:camera
            eulerRotation.y:330 //330
            pivot.z:-242
            z:0
        }

        DirectionalLight{
            id:directionalLight
            z:160.96004
            brightness:lightBrightness
        }

        Model{
            id:cubeModel
            source: "#Cube"
            eulerRotation.x: 0
            eulerRotation.y: 0
            PrincipledMaterial {
                id: principledMaterial
                lighting: PrincipledMaterial.FragmentLighting
                roughness: 0.3
                baseColor: "#ff334455"
                metalness: 1
            }
            materials: [principledMaterial]

            Model{
                id: cylinder
                y: 0
                source: "#Cylinder" //圆柱体
                scale.x: 0.3
                scale.z: 0.3
                scale.y: 1.04
                eulerRotation.x: 88.9

                DefaultMaterial {
                    id: lightEmission
                    lighting: DefaultMaterial.NoLighting
                    diffuseColor: "#ffffff"
                }

                PrincipledMaterial {
                    id: lightsTurnedOff
                    lighting: PrincipledMaterial.FragmentLighting
                    roughness: 0.05
                    baseColor: "#efe8c7"
                    metalness: 1
                }
                materials: renderScene ? lightEmission:lightEmission
            }

            Model {
                id: cylinder1
                y: 0
                source: "#Cylinder"
                scale.x: 0.2
                eulerRotation.x: 88.9
                scale.z: 0.2
                scale.y: 1.13

                PrincipledMaterial {
                    id: principledMaterial1
                    roughness: 0.05
                    baseColor: "#ff112233"
                    metalness: 1
                }

                materials: [principledMaterial1]
            }
        }
    }

    Timeline {
        id: timeline
        animations: [
            TimelineAnimation {
                id: timelineAnimation
                pingPong: true
                loops: -1
                running: true
                duration: 5000
                to: 100
                from: 0
            }
        ]
        endFrame: 100
        enabled: true
        startFrame: 0

        KeyframeGroup {
            target: camera
            property: "eulerRotation.y"
            Keyframe {
                easing.bezierCurve: [0.645,0.045,0.355,1,1,1]
                value: -50
                frame: 0
            }

            Keyframe {
                easing.bezierCurve: [0.645,0.045,0.355,1,1,1]
                value: 330
                frame: 100
            }
        }
    }
}

下面是进行各个模块的分解:

1、首先需要对Timeline时间线的理解:

Timeline主要是对摄像机y轴的一个控制,让摄像机绕y轴遵循一个缓动曲线去运动。

Timeline {
        id: timeline
        animations: [
            TimelineAnimation {
                id: timelineAnimation
                pingPong: true  //动画完成后,是否向后播放.这是一种创建循环动画的简单方法
                loops: -1   //一直循环
                running: true  //运行
                duration: 5000 //时间
                to: 100
                from: 0
            }
        ]
        endFrame: 100
        enabled: true
        startFrame: 0

        KeyframeGroup {
            target: camera
            property: "eulerRotation.y"
            Keyframe {
//                easing.bezierCurve: [0.645,0.045,0.355,1,1,1]
                easing.type:"Linear"
                value: -50
                frame: 0
            }

            Keyframe {
//                easing.bezierCurve: [0.645,0.045,0.355,1,1,1]   //贝塞尔曲线
                easing.type: "Linear"
                value: 330
                frame: 100
            }
        }
    }

注意:easing是调整缓动曲线的函数,可以自己试着去调整一下。

 

2、在场景View3D中需要设置渲染环境

    environment: sceneEnvironment
    SceneEnvironment{
        id:sceneEnvironment
        backgroundMode: renderScene ? SceneEnvironment.SkyBox: SceneEnvironment.Transparent
        lightProbe: Texture{  //HDRI贴图为天空背景时使用
//            source:"hdr/city01.hdr"
            source:"hdr/333.hdr"
        }
        clearColor:"#000000"
        antialiasingQuality: SceneEnvironment.High  //抗锯齿的质量
        antialiasingMode: SceneEnvironment.MSAA   //应用多样本抗锯齿
        probeBrightness: envBrightness  //此属性修改光照探针发出的光量。(模型的光照亮度,若亮度为0,则模型不显示)
    }

backgroundMode:当SceneEnvironment.SkyBox时,lightProbe才会起作用,背景才会显示source里面的HDR照片。当SceneEnvironment.Transparent时,背景为白色。当SceneEnvironment.Color时,背景以clearColor的颜色为背景。

probeBrightness:此属性的值设置的大小,关系到模型表面的亮度,即天空盒的背景在模型表面的显示亮度。当此值为0时,模型表面近似黑色。

3、Node节点的解析:

    Node{
        id:scene

        PerspectiveCamera{
            id:camera
            eulerRotation.y:330 //330
            pivot.z:-242
            z:0
        }

        DirectionalLight{
            id:directionalLight
            z:160.96004
            brightness:lightBrightness
        }

        Model{
            id:cubeModel
            source: "#Cube"
            eulerRotation.x: 0
            eulerRotation.y: 0
            PrincipledMaterial {
                id: principledMaterial
                lighting: PrincipledMaterial.FragmentLighting
                roughness: 0.3
                baseColor: "#ff334455"
                metalness: 1
            }
            materials: [principledMaterial]

            Model{
                id: cylinder
                y: 0
                source: "#Cylinder" //圆柱体
                scale.x: 0.3
                scale.z: 0.3
                scale.y: 1.04
                eulerRotation.x: 88.9

                DefaultMaterial {
                    id: lightEmission
                    lighting: DefaultMaterial.NoLighting
                    diffuseColor: "#ffffff"
                }

                PrincipledMaterial {
                    id: lightsTurnedOff
                    lighting: PrincipledMaterial.FragmentLighting
                    roughness: 0.05
                    baseColor: "#efe8c7"
                    metalness: 1
                }
                materials: renderScene ? lightEmission:lightEmission
            }

            Model {
                id: cylinder1
                y: 0
                source: "#Cylinder"
                scale.x: 0.2
                eulerRotation.x: 88.9
                scale.z: 0.2
                scale.y: 1.13

                PrincipledMaterial {
                    id: principledMaterial1
                    roughness: 0.05
                    baseColor: "#ff112233"
                    metalness: 1
                }

                materials: [principledMaterial1]
            }
        }
    }

PerspectiveCamera:透视摄像机:

eulerRotation.y:相机绕y轴旋转。

pivot.z:对节点应用旋转时用作枢轴点,

pivot.x:模型向右偏移200

DirectionalLight:方向光

brightness:方向光的亮度

此节点中添加了三个model:分别为两个圆柱体和一个立方体。下一节我们介绍新建一个

LightTest.qml来测试一下这个例子。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: QML-QianWindow-V1版本界面是一款用户界面设计程序,它为开发人员提供了大量可自定义的UI组件,使得开发者可以轻松地创建美观、直观且易于使用的界面QML-QianWindow-V1版本界面具有界面美观,易用性强以及可扩展性强的特点。该程序提供了多种UI组件如窗口、按钮、文本框、下拉框、进度条等等。每个组件都可以基于开发需求进行个性化设计,提高了程序的可读性和可维护性。 QML-QianWindow-V1版本界面的窗口设计功能令人称赞。用户可以定制窗口的样式、位置和大小等属性,使其符合自己的需求。同时,该程序支持类似IOS与Android风格的Tab、Panel、Dialog等视图控件,让应用的界面更具丰富性和交互性,提升用户体验。 此外,QML-QianWindow-V1版本界面可让用户通过实用的数据模型,快速地创建和管理表格和列表,包括多行、多列的表格和单选或多选列表,使得用户可以方便地处理大量数据。 总之,QML-QianWindow-V1版本界面通过提供易用性和可扩展性强的UI组件来简化界面设计过程,使得开发人员可以迅速开发出优秀的桌面应用程序界面,以满足用户高品质的界面需求。 ### 回答2: QML-Qianwindow-v1版本是一款基于QML语言开发的桌面应用程序,其主要特点是界面设计美观、简单易用,适用于多种应用场景。 该软件的主界面包含五个主要区域:侧边栏、消息中心、主视图、小部件和设置菜单。 侧边栏主要用于导航,其中包含主要的应用程序和功能,使用户可以轻松地进入不同的模块。 消息中心用于显示来自其他应用程序的通知,例如电子邮件或要完成的任务。 主视图是QML-Qianwindow-v1的核心区域,其中包含常见的功能和工具,例如打开的文件、书签和搜索栏。 小部件区域用于显示用户选择的小部件,例如天气预报和日历。 设置菜单区域包含应用程序的设置菜单,用户可以在此处更改应用程序的选项、主题和常规设置。 总体来说,QML-Qianwindow-v1版本的界面设计非常简洁,用户友好,易于使用。它增强了用户的生产力和效率,为用户提供了一种令人愉悦的使用体验。 ### 回答3: QML-QianWindow-v1是一种基于Qt QML开发的简单易用的窗口界面库。其设计风格简洁明了,适用于各种桌面应用开发。 该库主要由三个部分组成:Title Bar、Main Body和Sidebar。其中,Title Bar是窗口的标题栏,可以自定义标题、图标、按钮、菜单等。Main Body是页面的主体内容,可以显示各种控件、窗口和布局。Sidebar是侧边栏,可以显示常用的菜单、工具、快捷方式等。 在QML-QianWindow-v1中,可以使用QianWindow来创建窗口。QianWindow提供了常用的窗口操作方法,例如最小化、最大化、关闭等。同时,该库还提供了很多常用的QML组件,例如按钮、文本框、下拉框、列表框等,这些组件可以方便快捷地进行页面设计。此外,在QML-QianWindow-v1中还支持自定义样式,可以根据需要修改组件的颜色、形状、大小等。 QML-QianWindow-v1的界面设计风格简洁明了,同时具有一定的美观度。尤其是Title Bar部分的设计非常灵活,可以根据需要自由定制。Main Body部分支持多种布局方式,可以满足不同页面设计的需求。Sidebar部分则提供了丰富的快捷操作方式,提高了用户的使用效率。 总的来说,QML-QianWindow-v1是一款非常实用的界面库,可以方便快捷地进行桌面应用开发。无论是初学者还是有经验的开发者,都可以轻松使用该库进行界面设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41392061

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值