今天我们学习灯光类
首先来学习Light类,它是所有灯光的虚基类,该类是无法创建的,主要是为子类提供很多公共属性。
常用属性如下所示:
平行光可以理解为遥远的太阳,发出的光线都是平行的,并且被方向光照射的整个区域收到的光照强度都一样。
方向光发出的所有光线都是平行的,可以认为是距离很远的光源,例如遥远的太阳光就是方向光,方向光不像聚焦光那样距离目标越远越暗淡,被方向光照射的整个区域收到的光照强度都一样。
光的默认方向是从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类是一个网格助手类,需要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
}
效果如下所示:
和现实中的灯泡类似,,从光的中心向各个方向发射强度相同的光。 所以我们移动一个点光源将改变光源发出的位置。如下图所示:
它的光照亮度是通过constantFade、linearFade和SquadicFace属性的值向黑暗方向下降,其中灯光计算为constantFade+distance?*(linearFade*0.01)+distance?^2 *(SquadicFade*0.0001)
其中distance?就是每个被照射的位置的距离。
提供的属性介绍如下所示:
和现实中手电筒类似,聚光灯的行为类似于PointLight, 但是只会向一个方向发射光, 照亮空间内的一个锥形区域,如下图:
提供的光衰减公式:constantFade + distance * (linearFade * 0.01) + distance * (quadraticFade* 0.0001)^2
PS:该公式计算出来的值越大,则表示光线强度越暗,
提供的属性如下所示:
接下来我们便来写一个示例,来看看属性作用,效果图如下所示:
?
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类