three.js入门(6)光源

时间:2022-03-19 05:14:24

一、环境光(AmbientLight) —影响整个场景的光源

AmbientLight光源的颜色会影响整个场景,对场景中的对象一视同仁。AmbientLight的光线没有特定的来源,没有方向,当然不会生成阴影。你不能将环境光作为场景的唯一光源。在使用其它光源的同时使用环境光,目的是弱化一些阴影或添加一些颜色。环境光通常使用白色或者灰色,作为整体光照的基础。在设置环境光时,只需要指定光的颜色及光照强度即可:

THREE.AmbientLight( color, intensity )
//color — 十六进制光源颜色,默认0xffffff。
//intensity -- 光照的强度的数值,默认1
//使用
var light = new THREE.AmbientLight( 0x404040, 1 );
scene.add( light );

我们来看一个示例(查看06-AmbientLight.html)通过操作右上角面板,来理解AmbientLight具体作用,其中

ambientColor:环境光颜色
disableSpotlight:关闭聚光灯
disableAmbientLight:关闭环境光
boxColor:立方体颜色
sphereColor:球体颜色
planeColor:平面颜色
运行结果如下:

three.js入门(6)光源

二、点光源(PointLight)—照射所有方向的光源

PointLight是一种单点发光,照射所有方向的光源。夜空中的照明弹、生活中的蜡烛都是很好的点光源例子。点光源的构造函数如下:

new THREE.PointLight( color, intensity, distance, decay )
//使用
var light = new THREE.PointLight( 0xff0000, 1, 100, 1);
light.position.set( 50, 50, 50 );
light.castShadow = true;
light.shadow.mapSize.width = 1024;
light.shadow.mapSize.height = 1024;
light.shadow.camera.near = 1;
light.shadow.camera.far = 1000;
scene.add( light );
参数 描述
color 十六进制光源颜色,默认0xffffff
intensity 光照的强度的数值,默认1
distance 距离光源多远处的光照强度为0,如果设置为0,为无穷远。默认为0
decay 沿着光照的距离光的衰减量(亮→暗),现实中数值为2,默认为1


属性 描述
.position 光源位置
.color 光源颜色 值为THREE.Color实例
.power 光照的能量,和intensity有关,改变这个的值也会改变intensity
.distance 距离光源多远处的光照强度为0,即光照的距离,如果设置为0,为无穷远。默认为0
.decay 沿着光照的距离光的衰减量(亮→暗),现实中数值为2,默认为1
.castShadow 是否可以产生阴影,默认为false
.shadow LightShadow实例,用于计算光源的投影,此投影使用透视相机fov 90, aspect 1, near 0.5, far 500。我们可以不需要知道这个,但有下面几个投影的设置值
.shadow.camera.near 距离光源哪一点开始可以生产阴影
.shadow.camera.far 距离光源哪一点为止可以生产阴影
.shadow.mapSize.width 决定多少像素来生成阴影,通常阴影模糊参差不齐就是这个值比较小,默认512
.shadow.mapSize.height 决定多少像素来生成阴影,通常阴影模糊参差不齐就是这个值比较小,默认512


和环境光一样我们来通过一个示例(查看06-PointLight.html)来理解点光源,其中控制面板可控制变量如下:

ambientColor:环境光颜色
pointColor:点光源颜色
intensity:光照的强度的数值,
distance::光照的距离,
decay:光的衰减量
运行结果:

three.js入门(6)光源

三、聚光灯光源(SpotLight)—具有锥形效果的光源

聚光灯是一种特殊的点光源,它能够朝着一个方向投射光线,聚光灯投射出的是类似圆锥形的光线。像手电筒、电视舞台上投射锥形灯光单独照亮人等等都是聚光灯的例子。它有如下构造函数:

SpotLight( color, intensity, distance, angle, penumbra, decay )
//使用
var spotLight = new THREE.SpotLight( 0xffffff );
spotLight.position.set( 100, 1000, 100 );
spotLight.castShadow = true;
spotLight.shadow.mapSize.width = 1024;
spotLight.shadow.mapSize.height = 1024;
spotLight.shadow.camera.near = 500;
spotLight.shadow.camera.far = 4000;
spotLight.shadow.camera.fov = 30;
scene.add( spotLight );
参数 描述
color 十六进制光源颜色,默认0xffffff
intensity 光照的强度的数值,默认1
distance 距离光源多远处的光照强度为0,如果设置为0,为无穷远。默认为0
angle 灯光的锥形角度大小,最大为Math.PI/2,默认Math.PI/3
penumbra 锥形中心点沿四周光强减弱的百分比,(如果decay是水平方向的减弱,那么它就是垂直方向的减弱)值在0-1,默认为0,表示不减弱
decay 沿着光照的距离光的衰减量(亮→暗),现实中数值为2,默认为1


属性 描述
.position 光源位置
.color 光源颜色 值为THREE.Color实例
.angle 灯光的锥形角度大小,最大为Math.PI/2,默认Math.PI/3
.power 光照的能量,和intensity有关,改变这个的值也会改变intensity
.distance 距离光源多远处的光照强度为0,即光照的距离,如果设置为0,为无穷远。默认为0
.penumbra 锥形中心点沿四周光强减弱的百分比,(如果decay是水平方向的减弱,那么它就是垂直方向的减弱)值在0-1,默认为0,表示不减弱
.decay 沿着光照的距离光的衰减量(亮→暗),现实中数值为2,默认为1
.castShadow 是否可以产生阴影,默认为false
.shadow SpotLightShadow 实例,用于计算光源的投影,此投影使用透视相机fov 50, aspect 1, near 0.5, far 500。我们可以不需要知道这个,但有下面几个投影的设置值
.shadow.camera.near 距离光源哪一点开始可以生产阴影
.shadow.camera.far 距离光源哪一点为止可以生产阴影
.shadow.camera.fov 生成投影的视场有多大
.shadow.mapSize.width 决定多少像素来生成阴影,通常阴影模糊参差不齐就是这个值比较小,默认512
.shadow.mapSize.height 决定多少像素来生成阴影,通常阴影模糊参差不齐就是这个值比较小,默认512
.target 光源的投射点,默认为(0, 0, 0)。使用方式:
如果我们想把聚光灯投射的球体上,那么可以
spotLight.target = sphere(球体,看下面例子代码了解详情)
这样聚光灯的中心点和求的中心点对应起来了,注意这边的球体必须已经添加到场景中

如果我们想把聚光灯投影到场景中的某个点,可以这样:
var targetObject = new THREE.Object3D();
targetObject.position = new THREE.Vector3(5, 0, 0);
scene.add(targetObject);
light.target = targetObject;


同样,我们来通过一个示例(查看06-SpotLight.html)来理解聚光灯光源,其中控制面板可控制变量如下:
ambientColor:环境光颜色
spotColor:聚光灯颜色
intensity:光照强度
distance:光照距离
penumbra:锥形中心点沿四周光强减弱的百分比
decay:沿着光照的距离光的衰减量
angle:灯光的锥形角度大小
castShadow:是否可以产生阴影
target:光源的投射点
stopMovingLight:是否停止光源移动

运行结果:

three.js入门(6)光源

四、平行光(DirectinalLight)—类似太阳光线的光源

平行光光源可以看做距离很远很远的光源,这个光源发出的所有光线都是平行的,平行光的案例是太阳,太阳离我们如此之远以至于到达地球的光源都成了平行光,它的构造函数如下:

THREE.DirectionalLight( hex, intensity )
//color — 十六进制光源颜色,默认0xffffff。
//intensity -- 光照的强度的数值,默认1
//使用
var directionalLight= new THREE.DirectionalLight( 0x404040, 1 );
directionalLight.position.set(20,20,20);
scene.add( light );
属性 描述
.position 光源位置
.color 光源颜色 值为THREE.Color实例
.castShadow 是否可以产生阴影,默认为false
.shadow DirectionalLightShadow实例,用于计算光源的投影,此投影使用正视相机fnew OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 )。我们可以不需要知道这个,但有下面几个投影的设置值
.shdow.camera.near near、far、left、right、top、bottom形成一个矩形,在此矩形内的对象可以产品阴影可查看照相机那章
.shadow.camera.far
.shadow.camera.left
.shadow.camera.right
.shadow.camera.top
.shadow.camera.bottom
.shadow.mapSize.width 决定多少像素来生成阴影,通常阴影模糊参差不齐就是这个值比较小,默认512
.shadow.mapSize.height 决定多少像素来生成阴影,通常阴影模糊参差不齐就是这个值比较小,默认512
.target 光源的投射点,默认为(0, 0, 0)。用法同聚光灯target


对于平行光,我们也有示例(查看06-DirectinalLight.html)来理解,控制变量就不多说了,结果如下:

three.js入门(6)光源

五、半球光光源(HemisphereLight)—更贴近自然

使用半球光光源可以创建出更贴近自然的光照效果。如果不使用这种光源,要模拟室外光照,可以添加一个平行光光源模拟太阳,在添加一个环境光光源提供基础色,但是这看上去不怎么自然。当你在室外的时候,并不是所有的光都来自上方,很多来自空气的散射、地面的反射、以及其他物体的反射。它的构造函数如下:

HemisphereLight( skyColor, groundColor, intensity )
//使用
var light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );
light.position.set( 100, 1000, 100 );
scene.add( light );
参数 描述
skyColor 来自天空的颜色的十六进制光源颜色,默认0xffffff
groundColor 来自地面的颜色的十六进制光源颜色,默认0xffffff
intensity 光照的强度的数值,默认1


属性 描述
.position 光源位置
.color 来自天空的颜色 值为THREE.Color实例
.groundColor 来自地面的颜色 值为THREE.Color实例

不多说,来看示例(查看06-HemisphereLight.html)理解,半球光光源是不会产生阴影效果的,示例里以配合其它光源产生阴影。注意,此示例需要开启服务才可完整查看,可操作变量如下:
disableHemisphere:是否开启半球光
groundColor :来自地板的颜色
intensity:光照强度
skyColor :来自天空的颜色
y:半球光位置y
x:半球光位置x
z:半球光位置z
此光源需要多调节位置来理解,结果如下:

three.js入门(6)光源