4.qml 3D-Light、DirectionalLight、PointLight、SpotLight、AxisHelper类深入学习

news2024/11/19 0:51:51

今天我们学习灯光类

首先来学习Light类,它是所有灯光的虚基类,该类是无法创建的,主要是为子类提供很多公共属性。

常用属性如下所示:

  • ambientColor : color,该属性定义在被该光照亮之前应用于材质的环境颜色。默认值为黑色 rgb(0,0,0)。
  • bakeMode : enumeration, 该属性控制灯光在烘焙光照中是否处于活动状态,例如在生成光照贴图时,取值如下所示:
    • Light.BakeModeDisabled 默认值,该灯不用于烘焙照明
    • Light.BakeModeIndirect 间接照明烘焙。直接照明(漫反射、镜面反射、实时阴影贴图)通常在运行时计算。在运行时,当不处于烘焙模式时,渲染器将尝试对光照贴图进行采样以获取间接光照数据,并将其与实时计算的结果相结合。
    • Light.BakeModeAll 直接照明烘焙,(漫射、阴影)和间接照明均针对此光线进行烘焙, 从 Qt 6.4 开始,不支持镜面反射照明,因此此类灯光不会有镜面反射,也不会生成实时阴影贴图,但它始终会产生烘焙阴影。在运行时,当不处于烘焙模式时,渲染器将尝试对光照贴图进行采样,以代替漫反射光照和阴影贴图的标准实时计算。
  • brightness : real, 灯光亮度,默认为1.0
  • castsShadow : bool, 投射阴影开关。默认值为false,如果bakeMode设置为Light.BakeModeAll,该属性没有任何作用。直接照明烘焙会始终有阴影
  • color : color,此属性用于此灯光照明模型的颜色。默认值为白色,rgb(255, 255, 255)。
  • scope : Node,作用域属性,该属性用于选择场景中的节点。只有该节点及其子节点才会受到此光的影响。默认情况下该值为 null,表示未选择范围。
  • 需要注意的是,使用scope后,那么castsShadow属性将会不起作用,如果必须要阴影,可以将bakeMode设置为Light.BakeModeAll
  • shadowBias : real,阴影偏移, 当对象在自身上投射阴影时,此属性用于调整阴影效果。取值范围为[-1.0,1.0]。一般来说,[-0.1,0.1]内的值就足够了。默认值为 0。
  • shadowFactor : real, 阴影系数, 取值范围为[0,100],其中0表示没有阴影,100表示光线完全阴影。默认值为5。
  • shadowFilter : real,此属性设置阴影的模糊程度。默认值为5,为0表示不模糊
  • shadowMapFar : real, 该属性确定阴影映射的最大距离。较小的值可以提高地图的精度和效果。缺省值为5000。
  • shadowMapQuality : enumeration,该属性设置为阴影渲染创建的阴影映射的质量。低质量使用较少的资源,但产生较低质量的阴影,而高质量使用更多的资源,但产生更好质量的阴影。默认值Light.ShadowMapQualityLow。

1.DirectionalLight平行光

平行光可以理解为遥远的太阳,发出的光线都是平行的,并且被方向光照射的整个区域收到的光照强度都一样。

方向光发出的所有光线都是平行的,可以认为是距离很远的光源,例如遥远的太阳光就是方向光,方向光不像聚焦光那样距离目标越远越暗淡,被方向光照射的整个区域收到的光照强度都一样。

光的默认方向是从Z正方向照射到XY平面。

示例代码如下所示:

import QtQuick
import QtQuick.Window
import QtQuick3D
import QtQuick3D.Helpers
Window {
    width: 640
    height: 480
    visible: true 

    View3D {
        anchors.fill: parent
        environment: SceneEnvironment {
            clearColor: "#333"
            backgroundMode: SceneEnvironment.Color
            antialiasingMode: SceneEnvironment.MSAA
            antialiasingQuality: SceneEnvironment.High
        } 

        camera: camera
        PerspectiveCamera {
            id: camera
            position: Qt.vector3d(0, -500, 500)
            eulerRotation.x: 45
        }

        WasdController {
            id: wasd_control
            controlledObject: camera

         }


        DirectionalLight {
             eulerRotation: Qt.vector3d(0, 0, 0)
             castsShadow: true
             brightness: 3
             shadowFactor: 5
             shadowMapQuality : Light.ShadowMapQualityHigh
        }


        Model {
            source: "#Sphere"
            z: 200
            materials: DefaultMaterial {
                diffuseColor: Qt.rgba(0.6, 0.5, 0.2, 1.0)
            }
        }


        Model {
            source: "#Rectangle"

            scale: Qt.vector3d(10, 10, 1)
            materials: DefaultMaterial {
                diffuseColor: Qt.rgba(0.7, 0.2, 0.2, 1.0)
            }
        }
    }
}

效果如下所示:

PS: WasdController类是用来wasd按键控制辅助类,Model类是模型类,后面会学习,这里用的是一个自带的球体模型

如上图可以看到光照是从球体上方照射而下的。刚好从Z正方向照射到XY平面。

如果我们对xyz分布有时候分不清的话,可以使用AxisHelper网格类.

AxisHelper网格类

AxisHelper类是一个网格助手类,需要import QtQuick3D.Helpers,它用来区分3D中xyz方向, 默认X 轴为红色,Y 轴为绿色,Z 轴为蓝色。

我们在上个示例代码中添加AxisHelper:

运行后效果如下所示:

可以看到很奇怪,默认XZ平面为网络格,也就是底面的意思。3DMax导入的模型一般都是xz为底面,y为高度,所以我们导入模型的时候,一般通常它是以XZ为水平面。

如下图所示,通常只有y或者z为高度,很显然AxisHelper类默认是z-up类型:

如果我们要设置AxisHelper类为y-up,改为如下所示:

AxisHelper {

    enableXYGrid: true

    enableXZGrid : false

}

效果如下所示:

PointLight点光源

和现实中的灯泡类似,,从光的中心向各个方向发射强度相同的光。 所以我们移动一个点光源将改变光源发出的位置。如下图所示:

它的光照亮度是通过constantFade、linearFade和SquadicFace属性的值向黑暗方向下降,其中灯光计算为constantFade+distance *(linearFade*0.01)+distance ^2 *(SquadicFade*0.0001)

其中distance 就是每个被照射的位置的距离。

提供的属性介绍如下所示:

  • constantFade:光衰减项的常数因素。默认值是1.0,(值越大,灯光越暗,与距离无关)
  • linearFade: 这个属性增加了灯光效果与光线的距离成比例地变暗的速度。默认值是0.0,这意味着光线没有线性渐变,值越大时,距离越远越暗, 在计算光衰减之前,这里使用的值要乘以0.01。
  • quadraticFade: 这个特性增加了照明效果使光线变暗的比率,与平方反比定律成比例。默认值是1.0,值越大时,距离越远成平方比例变暗,,即当与物体的距离增加一倍时,光强度减少到1/4。在计算光衰减之前,这里使用的值乘以0.0001

SpotLight聚光灯

和现实中手电筒类似,聚光灯的行为类似于PointLight, 但是只会向一个方向发射光, 照亮空间内的一个锥形区域,如下图:

提供的光衰减公式:constantFade + distance * (linearFade * 0.01) + distance * (quadraticFade* 0.0001)^2

PS:该公式计算出来的值越大,则表示光线强度越暗,

提供的属性如下所示:

  • coneAngle : real,此属性定义边缘衰减截止角度,超过该角度后光线就会被截止掉。以 0 到 180 之间的度数定义。默认值为 40。
  • constantFade : real,该特性是光衰减项的常数因子。默认值为 1.0,值越大越暗(设置可见光的整体暗度)
  • innerConeAngle : real,内部的边缘衰减截止角度,默认值为30,超过该角度后就会出现光线衰减,如果值大于等于coneAngle后,那么内部边缘则没有光线衰减
  • linearFade : real,线性渐变比例,默认值为0,则表示照亮后的位置没有线性渐变,值越大渐变效果越暗
  • quadraticFade : real,二次方线性渐变比例,默认值为 1.0,当物体距离加倍后,光强度将会降至1/4,值越大渐变效果越暗

SpotLight使用示例

接下来我们便来写一个示例,来看看属性作用,效果图如下所示:


 

coneAngle 和innerConeAngle 区别

如下图所示,coneAngle 为50.668, innerConeAngle 为64时,由于innerConeAngle >=coneAngle ,所以内部边缘则没有渐变阴影

当我们设置innerConeAngle 为20度左右时,如下图所示,可以看到超过20度的范围有了光线衰减:

完整代码如下所示:

import QtQuick
import QtQuick.Window
import QtQuick3D
import QtQuick3D.Helpers
import QtQuick.Controls
Window {
    width: 640
    height: 480
    visible: true

    Column {
        z: 2
           Row {
                Slider {
                    id: slider1
                    from: 0
                    to: 180
                    value: 40
                    focusPolicy: Qt.NoFocus
                    width: 400
                }
                Text {
                    anchors.verticalCenter: slider1.verticalCenter
                    text: "coneAngle:" + slider1.value.toFixed(3)
                    color: "#F00"
                }
           }
           Row {
               Slider {
                   id: slider2
                   from: 0
                   to: 2
                   value: 1
                   focusPolicy: Qt.NoFocus
                    width: 400
               }
               Text {
                   anchors.verticalCenter: slider2.verticalCenter
                   text: "constantFade :" + slider2.value.toFixed(3)
                   color: "#F00"
               }
           }
           Row {
               Slider {
                   id: slider3
                   from: 0
                   to: 180
                   value: 30
                   focusPolicy: Qt.NoFocus
               }
               Text {
                   anchors.verticalCenter: slider3.verticalCenter
                   text: "innerConeAngle :" + slider3.value.toFixed(3)
                   color: "#F00"
               }
           }

           Row {
               Slider {
                   id: slider4
                   from: 0
                   to: 10.0
                   value: 0
                   focusPolicy: Qt.NoFocus
               }
               Text {
                   anchors.verticalCenter: slider4.verticalCenter
                   text: "linearFade :" + slider4.value.toFixed(3)
                   color: "#F00"
               }
           }
           Row {
               Slider {
                   id: slider5
                   from: 0
                   to: 100
                   value: 1
                   focusPolicy: Qt.NoFocus
               }
               Text {
                   anchors.verticalCenter: slider5.verticalCenter
                   text: "quadraticFade :" + slider5.value.toFixed(3)
                   color: "#F00"
               }
           }
    }


    View3D {
        anchors.fill: parent
        environment: SceneEnvironment {
            clearColor: "#333"
            backgroundMode: SceneEnvironment.Color
            antialiasingMode: SceneEnvironment.MSAA
            antialiasingQuality: SceneEnvironment.High
        }

        AxisHelper {
           enableXYGrid: true
           enableXZGrid : false
        }

        camera: camera
        PerspectiveCamera {
            id: camera
            position: Qt.vector3d(0, -300, 300)
            eulerRotation.x: 45
        }

        WasdController {
            id: wasd_control
            controlledObject: camera

         }


        SpotLight {
            z: 300
            brightness: 10
            castsShadow: true
            shadowFactor: 50
            shadowMapQuality : Light.ShadowMapQualityHigh
            bakeMode: Light.BakeModeIndirect

            coneAngle: slider1.value
            constantFade: slider2.value
            innerConeAngle: slider3.value
            linearFade: slider4.value
            quadraticFade: slider5.value

        }


        Model {
            source: "#Sphere"
            z: 100
            materials: DefaultMaterial {
                diffuseColor: Qt.rgba(0.6, 0.5, 0.2, 1.0)
            }
        }


        Model {
            source: "#Rectangle"

            scale: Qt.vector3d(10, 10, 1)
            materials: DefaultMaterial {
                diffuseColor: Qt.rgba(0.7, 0.2, 0.2, 1.0)
            }
        }
    }
}

未完待续,下章学习Model类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon参考手册异常检测知识总结

1.1异常检测介绍 本章将介绍如何使用基于深度学习的异常检测和全局上下文异常检测。通过这两种方法,我们想要检测图像是否包含异常(异常是指偏离正常的事物,未知的事物)。 异常检测或全局上下文异常检测模型学习无异常图像的共同特征。经过训练的模型将…

CentOS7 OpenSSL升级到OpenSSH9.5p1

原文链接: CentOS7 OpenSSL升级1.1.1w;OpenSSH 升级 9.5p1 保姆级教程 openssl从3.1.0升级到3.1.1遇到的问题 注意操作时需要联网请参考如下链接 内网服务器联网安装依赖参见我的另一篇文章 一、 前言 OpenSSH 的加密功能需要用到OpenSSL,所…

STM32-UART-DMA HAL库缓冲收发

文章目录 1、说明1.1、注意事项:1.2、接收部分1.3、发送部分 2、代码2.1、初始化2.2、缓冲接收2.3、缓冲发送2.4、格式化打印 1、说明 1.1、注意事项: HAL库的DMA底层基本都会默认开启中断使能,如果在STM32CubeMx禁用了中断相关的功能&…

基于ssm企业人事管理系统的设计与实现论文

摘 要 进入信息时代以来,很多数据都需要配套软件协助处理,这样可以解决传统方式带来的管理困扰。比如耗时长,成本高,维护数据困难,数据易丢失等缺点。本次使用数据库工具MySQL和编程技术SSM开发的企业人事管理系统&am…

人工智能与天文:技术前沿与未来展望

人工智能与天文:技术前沿与未来展望 一、引言 随着科技的飞速发展,人工智能(AI)在各个领域的应用越来越广泛。在天文领域,AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合,以及这种结合带…

动态规划习题

动态规划的核心思想是利用子问题的解来构建整个问题的解。为此&#xff0c;我们通常使用一个表格或数组来存储子问题的解&#xff0c;以便在需要时进行查找和使用。 1.最大字段和 #include <iostream> using namespace std; #define M 200000int main() {int n, a[M], d…

STM32 寄存器配置笔记——I2C 读写AT24C02 EEPROM

一、简介 本文主要介绍STM32F10xx系列如何使用软件模拟I2C总线读写AT24C02的EEPROM数据。 二、概述 I2C协议是一种用于同步、半双工、串行总线(由单片机时钟线、单数据交换器数据线组成)上的协议。规定了总线空闲状态、起始条件、停止条件、数据有效性、字节格式、响应确认信号…

设计模式之建造者模式(二)

目录 概述概念角色类图适用场景 详述画小人业务类的介绍代码解析 建造者基本代码类介绍代码解析 总结设计原则其他 概述 概念 建造者模式是一种创建型设计模式&#xff0c;它可以将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 角色 …

Win11 TensorRT环境部署

一、CUDA和CUDNN安装 cuda和cudnn网上有很多安装教程&#xff0c;这里列举了一些&#xff0c;就不详细说了&#xff0c;具体链接如下&#xff1a; csdn.net - CUDA安装教程&#xff08;超详细&#xff09; 原创 zhihu.com - 深度学习之CUDACUDNN详细安装教程 tencent.com - C…

《地理信息系统原理》笔记/期末复习资料(13. 地理信息系统的发展趋势)

目录 13. 地理信息系统的发展趋势 13.1. 互操作GIS 13.1.1. 传统GIS在数据标准化上的缺陷和面临的新课题 13.1.2. GIS互操作的概念 13.1.3. 开放式地理信息系统&#xff08;OGIS&#xff09;及其特点 13.1.4. OGIS的组成部分 13.1.5. OGIS的实现技术 13.2. GIS的集成化…

【C语言】C的面向对象

一、BREW接口实现 高通的BREW&#xff08;Binary Runtime Environment for Wireless&#xff09;是一个早期为手机设备开发的应用程序平台&#xff0c;用于开发在CDMA手机上运行的软件。尽管这个平台目前已经不太流行&#xff0c;但是在其使用高峰时期&#xff0c;开发者需要使…

2024年甘肃省职业院校技能大赛信息安全管理与评估赛项二三阶段样题一

2024年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项样题一 第二阶段 任务书 任务描述 随着网络和信息化水平的不断发展&#xff0c;网络安全事件也层出不穷&#xff0c;网络恶意代码传播、信息窃取、信息篡改、远程控制等各种网络攻击 行为已严重…

LVS负载均衡器(nat模式)+nginx(七层反向代理)+tomcat(多实例),实现负载均衡和动静分离

目录 前言 一、配置nfs共享存储 二、配置2个nginx节点服务的网页页面 节点1:192.168.20.10 步骤一&#xff1a;修改网关指向调度器的内网ip地址 步骤二&#xff1a;将nfs共享的目录进行挂载&#xff0c;并修改nginx的配置文件中location的root指向挂载点 步骤三&#xff…

GPT 魔力涌现

GPT 二、Prompt 的典型构成 角色&#xff1a;给 AI 定义一个最匹配任务的角色&#xff0c;比如&#xff1a;「你是一位软件工程师」「你是一位小学老师」指示&#xff1a;对任务进行描述上下文&#xff1a;给出与任务相关的其它背景信息&#xff08;尤其在多轮交互中&#xff…

“一键调整尺寸,轻松完成视频批量剪辑:批量放大视频尺寸“

你是否曾经遇到过需要批量调整视频尺寸的情况&#xff1f;无论是为了适应不同的播放平台&#xff0c;还是为了满足客户的特定需求&#xff0c;批量调整视频尺寸都是一项繁琐而耗时的工作。但是&#xff0c;现在有一种方法可以让你轻松完成这项任务&#xff0c;那就是使用我们的…

豪腾四海×实在RPA丨最懂财务的数字员工,为企业节省人天2000+

企业数字化转型&#xff0c;财务是一个重要的切入点。随着豪腾四海数字化业务不断展开&#xff0c;新的系统、流程和数据源被不断引入&#xff0c;财务部门面临的是不断暴增的对账、数电票处理、审计等日常工作。 “如此大的工作量&#xff0c;即使是经验丰富的资深财务&#…

设计模式——桥接模式(结构型)

引言 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 问题 抽象&#xff1f; 实现&#xff1f; 听上去挺吓人&#xff1f; 让我们慢慢来&#xff0c; 先考虑一个简单的…

【Oracle】创建表

目录 方法一&#xff1a;CREATE TABLE 语法 创建表示例1&#xff1a;创建stuinfo(学生信息表) 创建表示例2&#xff1a;添加stuinfo(学生信息表)约束 方法二&#xff1a;CREATE TABLE AS 语法 创建表示例3&#xff1a; 创建表示例4&#xff1a;实现对select查询的结果进行…

利用有限制通配符来提升API的灵活性

在Java中&#xff0c;有限制通配符&#xff08;bounded wildcard&#xff09;允许你在泛型中指定一个范围&#xff0c;从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子&#xff1a; 假设有一个简单的…

PR模板,复古怀旧电影效果视频制作PR项目工程文件

Premiere复古怀旧电影效果视频制作pr模板项目工程文件下载 这个PR模板以复古城市印象电影质感为特色&#xff0c;结合了电影和数字故障效果。包含6个场景。可以编辑文本、添加媒体和自定义颜色。包含视频教程。4K版本。不需要任何插件。 软件支持&#xff1a;PR2022 | 分辨率&a…