一、环境光(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:平面颜色
运行结果如下:
二、点光源(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:光的衰减量
运行结果:
三、聚光灯光源(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:是否停止光源移动
运行结果:
四、平行光(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)来理解,控制变量就不多说了,结果如下:
五、半球光光源(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
此光源需要多调节位置来理解,结果如下: