各种光源
2022年6月26日1. 光源基类
在Threejs中,光源用Light表示,它是所有光源的基类。它的构造函数是:
1 |
THREE.Light ( hex ) |
它有一个参数hex,接受一个16进制的颜色值。例如要定义一种红色的光源,我们可以这样来定义:
1 |
Var redLight = new THREE.Light(0xFF0000); |
2. 由基类派生出来的其他种类光源
THREE.Light只是其他所有光源的基类,要让光源除了具有颜色的特性之外,我们需要其他光源。看看,下面的类图,是目前光源的继承结构。
可以看出,所有的具体光源都继承与THREE.Light类。下面我们来具体看一下,其他光源。
3. 环境光
环境光是经过多次反射而来的光称为环境光,无法确定其最初的方向。环境光是一种无处不在的光。环境光源放出的光线被认为来自任何方向。因此,当你仅为场景指定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度。 (这是因为,反射光可以从各个方向进入您的眼睛)
环境光用THREE.AmbientLight来表示,它的构造函数如下所示:
1 |
THREE.AmbientLight( hex ) |
它仍然接受一个16进制的颜色值,作为光源的颜色。环境光将照射场景中的所有物体,让物体显示出某种颜色。环境光的使用例子如下所示:
1 2 3 |
var light = new THREE.AmbientLight( 0xff0000 ); scene.add( light ); |
只需要将光源加入场景,场景就能够通过光源渲染出好的效果来了。
4. 点光源
点光源:由这种光源放出的光线来自同一点,且方向辐射自四面八方。例如蜡烛放出的光,萤火虫放出的光。
点光源用PointLight来表示,它的构造函数如下所示:
1 |
PointLight( color, intensity, distance ) |
这个类的参数稍微复杂一些,我们花点时间来解释一下:
1 2 3 |
Color:光的颜色 Intensity:光的强度,默认是1.0,就是说是100%强度的灯光, distance:光的距离,从光源所在的位置,经过distance这段距离之后,光的强度将从Intensity衰减为0。 默认情况下,这个值为0.0,表示光源强度不衰减。 |
5. 聚光灯
聚光灯:这种光源的光线从一个锥体中射出,在被照射的物体上产生聚光的效果。使用这种光源需要指定光的射出方向以及锥体的顶角α。聚光灯示例如图所示:
聚光灯的构造函数是:
1 |
THREE.SpotLight( hex, intensity, distance, angle, exponent ) |
函数的参数如下所示:
1 2 3 4 5 6 7 8 9 |
Hex:聚光灯发出的颜色,如0xFFFFFF Intensity:光源的强度,默认是1.0,如果为0.5,则强度是一半,意思是颜色会淡一些。和上面点光源一样。 Distance:光线的强度,从最大值衰减到0,需要的距离。 默认为0,表示光不衰减,如果非0,则表示从光源的位置到Distance的距离,光都在线性衰减。到离光源距离Distance时,光源强度为0. Angle:聚光灯着色的角度,用弧度作为单位,这个角度是和光源的方向形成的角度。 exponent:光源模型中,衰减的一个参数,越大衰减约快。 |
6. 材质与光源的关系
材质与光源有什么关系,这是一个容易傻傻分不清的问题。在没有深入讲解前,我们只能说它们是相互联系,相互依托的关系。
我们会在后面的章节专门来解释什么是材质,不过这里也需要简单的给你介绍一下。
材质是啥子(四川话),材质就是物体的质地。我们可以用撤分文字的方法来理解。材质就是材料和质感的完美结合。
如果你还不理解,那么看看下面我引用的这段话:
在渲染程序中,它是表面各可视属性的结合,这些可视属性是指表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等。正是有了这些属性,才能让我们识别三维中的模型是什么做成的,也正是有了这些属性,我们计算机三维的虚拟世界才会和真实世界一样缤纷多彩。
这就是材质的真相吗?答案是否定的。不要奇怪,我们必须仔细分析产生不同材质的原因,才能让我们更好的把握质感。那么,材质的真相到底是什么呢?仍然是光,离开光材质是无法体现的。举例来说,借助夜晚微弱的天空光,我们往往很难分辨物体的材质,因为他们很多都表现出黑色,我们难以区分是铝合金,还是塑料的。而在正常的照明条件下,则很容易分辨。另外,在彩色光源的照射下,我们也很难分辨物体表面的颜色,在白色光源的照射下则很容易。这种情况表明了物体的材质与光的微妙关系。下面,我们将具体分析两者间的相互作用。
首先,我们来看一些例子。这些例子是一系类的,掌握一个,我们就印下了一个脚