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

今天我们学习灯光类

首先来学习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: 640height: 480visible: true View3D {anchors.fill: parentenvironment: SceneEnvironment {clearColor: "#333"backgroundMode: SceneEnvironment.ColorantialiasingMode: SceneEnvironment.MSAAantialiasingQuality: SceneEnvironment.High} camera: cameraPerspectiveCamera {id: cameraposition: Qt.vector3d(0, -500, 500)eulerRotation.x: 45}WasdController {id: wasd_controlcontrolledObject: camera}DirectionalLight {eulerRotation: Qt.vector3d(0, 0, 0)castsShadow: truebrightness: 3shadowFactor: 5shadowMapQuality : Light.ShadowMapQualityHigh}Model {source: "#Sphere"z: 200materials: 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: trueenableXZGrid : 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: 640height: 480visible: trueColumn {z: 2Row {Slider {id: slider1from: 0to: 180value: 40focusPolicy: Qt.NoFocuswidth: 400}Text {anchors.verticalCenter: slider1.verticalCentertext: "coneAngle:" + slider1.value.toFixed(3)color: "#F00"}}Row {Slider {id: slider2from: 0to: 2value: 1focusPolicy: Qt.NoFocuswidth: 400}Text {anchors.verticalCenter: slider2.verticalCentertext: "constantFade :" + slider2.value.toFixed(3)color: "#F00"}}Row {Slider {id: slider3from: 0to: 180value: 30focusPolicy: Qt.NoFocus}Text {anchors.verticalCenter: slider3.verticalCentertext: "innerConeAngle :" + slider3.value.toFixed(3)color: "#F00"}}Row {Slider {id: slider4from: 0to: 10.0value: 0focusPolicy: Qt.NoFocus}Text {anchors.verticalCenter: slider4.verticalCentertext: "linearFade :" + slider4.value.toFixed(3)color: "#F00"}}Row {Slider {id: slider5from: 0to: 100value: 1focusPolicy: Qt.NoFocus}Text {anchors.verticalCenter: slider5.verticalCentertext: "quadraticFade :" + slider5.value.toFixed(3)color: "#F00"}}}View3D {anchors.fill: parentenvironment: SceneEnvironment {clearColor: "#333"backgroundMode: SceneEnvironment.ColorantialiasingMode: SceneEnvironment.MSAAantialiasingQuality: SceneEnvironment.High}AxisHelper {enableXYGrid: trueenableXZGrid : false}camera: cameraPerspectiveCamera {id: cameraposition: Qt.vector3d(0, -300, 300)eulerRotation.x: 45}WasdController {id: wasd_controlcontrolledObject: camera}SpotLight {z: 300brightness: 10castsShadow: trueshadowFactor: 50shadowMapQuality : Light.ShadowMapQualityHighbakeMode: Light.BakeModeIndirectconeAngle: slider1.valueconstantFade: slider2.valueinnerConeAngle: slider3.valuelinearFade: slider4.valuequadraticFade: slider5.value}Model {source: "#Sphere"z: 100materials: 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.mzph.cn/news/225310.shtml

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

相关文章

oracle 锁表解决办法

相关表介绍 V$LOCKED_OBJECT(记录锁信息的表)v$session(记录会话信息的表)v$sql(记录 sql 执行的表)dba_objects(用来管理对象,表、库等等) 查询锁表的 SID select b.…

Cockpit upload文件上传漏洞(CVE-2023-1313)

0x01 产品简介 Cockpit 是一个自托管、灵活且用户友好的无头内容平台,用于创建自定义数字体验。 0x02 漏洞概述 Cockpit assetsmanager/upload接口处存在文件上传漏洞,攻击者可通过该漏洞在服务器端任意上传代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x0…

基于SpringBoot的语言课学习系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的语言课学习系统,java项…

Web开发伴侣 Prepros 7.17 Crack

您友好的 Web 开发伙伴,Prepros 编译您的文件、转译您的 JavaScript、重新加载您的浏览器并 使开发变得非常容易测试您的网站,以便您可以专注于制作 他们完美。 编译一切 Prepros 可以编译 Sass、Less、Stylus、Pug/Jade、Haml、Slim、CoffeeScript 和 …

linux中core调度器

背景 开始把core调度器当成了linux的主调度器,导致查找网上资料时总觉得对不上,最后从linux的rust文档中明白了,core调度器是为了解决超线程场景下缓存漏洞(如mds、L1HF)而存在的。简单来说就是一个cpu上同时运行两个…

翻译: 为什么需要微调大模型 Why Fine-tuning LLM

虽然RAG提供了一种方式来给大型语言模型提供额外的信息,但还有另一种叫做微调(fine-tuning)的技术,也是给它更多信息的一种方式。特别是,如果你有的上下文比大型语言模型的输入长度或上下文窗口长度更大,那…

如何使用ArcGIS Pro拼接影像

为了方便数据的存储和传输,我们在网上获取到的影像一般都是分块的,正式使用之前需要对这些影像进行拼接,这里为大家介绍一下ArcGIS Pro中拼接影像的方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

PPT插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累? 使用大珩助手中的素材库功能,将Word中的,或系统中的文本文件、图片、其他word文档、pdf,所有见到的好素材,一键收纳。 步骤:选中文件,按住鼠标左键拖到素材库界面中&…

微服务架构之争:Quarkus VS Spring Boot

在容器时代(“Docker时代”),无论如何,Java仍然活着。Java在性能方面一直很有名,主要是因为代码和真实机器之间的抽象层,多平台的成本(一次编写,随处运行——还记得吗?&a…

轻松入门:Python 中的 Scipy 库初探

写在开头 Python在科学计算领域中的强大地位得益于其丰富的库和工具,而Scipy库则是这个生态系统中的一颗璀璨明珠。本文将带你轻松入门Scipy库,深入探索其基本用途和功能。 1.scipy库的简介 Scipy库是Scientific Python的缩写,是建立在Num…

虚拟电厂 能源物联新方向

今年有多热?据上海市气象局官微消息,5月29日13时09分,徐家汇站气温达36.1℃,打破了百年来的当地5月份气温*高纪录。不仅如此,北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

什么是PSR标准?有哪些常见的PSR标准?

PSR 是 PHP Standard Recommendation(PHP 标准推荐)的缩写,是由 PHP-FIG(PHP Framework Interop Group)组织提出并维护的一系列 PHP 编程规范。这些规范旨在促进 PHP 生态系统中各种项目的互操作性和可维护性。以下是一…

Gitee:远程仓库步骤

第一步:新建仓库 第二步:初始化本地仓库,git init 创建分支 git branch 新分支名 第三步:git add . :添加到暂存区 第四步:git config –global user.email关联邮箱,user.name用户名 第…

LeetCode137. Single Number II

文章目录 一、题目二、题解 一、题目 Given an integer array nums where every element appears three times except for one, which appears exactly once. Find the single element and return it. You must implement a solution with a linear runtime complexity and u…

用python编写九九乘法表

1 问题 我们在学习一门语言的过程中,都会练习到编写九九乘法表这个代码,下面介绍如何编写九九乘法表的流程。 2 方法 (1)打开pycharm集成开发环境,创建一个python文件,并编写第一行代码,主要构建…

WX小程序案例(一):弹幕列表

WXML内容 <!--pages/formCase/formCase.wxml--> <!-- <text>pages/formCase/formCase.wxml</text> --> <view class"bk bkimg"><!-- <image src"/static/imgs/ceeb653ely1g9na2k0k6ug206o06oaa8.gif" mode"scal…

coffee:使用AI构建和迭代React UI速度提高10

该项目的目的不仅仅是一个漂亮的演示&#xff0c;而是一个可以编写生产质量代码并与之交互的人体工学工具。 特征 适用于任何 React 代码库&#xff0c;包括 Next.js、Remix 等。对于大多数标准 UI 组件来说足够可靠支持最简单的 prop 类型&#xff08;数据、回调等&#xff…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

【论文阅读】Uncertainty-aware Self-training for Text Classification with Few Label

论文下载 GitHub bib: INPROCEEDINGS{mukherjee-awadallah-2020-ust,title "Uncertainty-aware Self-training for Few-shot Text Classification",author "Subhabrata Mukherjee and Ahmed Hassan Awadallah",booktitle "NeurIPS",yea…