携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情 >>
接上一篇,继续探索光源
点光源
点光源,顾名思义,就是从一个点向四面八方发射的光源
{
const color = 0xFFFFFF;
const intensity = 1;
const light = new THREE.PointLight(color, intensity, 0);
light.position.set(0, 10, 0);
scene.add(light);
const helper = new THREE.PointLightHelper(light);
scene.add(helper);
}
为了便于理解,我同样为点光源添加了GUI HELPER,之后再代码片段内体现,点光源需要注意的是他的第三个参数,distance, 默认是0,指的是光源强度intensity衰减至0时的距离,0为无穷大
聚光灯
聚光灯可以看成是一个点光源被一个圆锥体限制住了光照的范围。实际上有两个圆锥,内圆锥和外圆锥。光照强度在两个锥体之间从设定的强度递减到 0,怎么去理解呢,恩。。。农村的孩子应该对挂在房梁上的电灯有印象吧?挂在房梁上的电灯外面会有一个壳子,是圆锥状的,罩起来以后光会更聚合,这里大概也是指类似的效果
{
const color = 0xFFFFFF;
const intensity = 1;
const light = new THREE.SpotLight(color, intensity);
light.position.set(0, 12, 0);
scene.add(light);
const helper = new THREE.SpotLightHelper(light);
function updateLight() {
helper.update();
}
scene.add(helper);
const gui = new GUI();
gui.add(light, 'penumbra', 0, 1, 0.01);
gui.add(new DegRadHelper(light, 'angle'), 'value', 0, 90).name('angle').onChange(updateLight);
gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('color');
gui.add(light, 'intensity', 0, 2, 0.01);
gui.add(light, 'distance', 0, 40).onChange(updateLight);
makeXYZGUI(gui, light.position, 'position', updateLight);
}
这里有几点需要注意,1,光源的位置我同样设为了(0,12,0),Y轴正向为高度,相当于是把聚光灯吊了起来,只有吊起来,才能照射的范围更广,光线从一个点沿一个方向射出,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大,构造聚光灯的类支持多个参数,下面就依次进行说明
SpotLight( color : Integer, intensity : Float, distance : Float, angle : Radians(弧度), penumbra : Float, decay : Float )
- color - (可选参数) 十六进制光照颜色。 缺省值 0xffffff (白色)。
- intensity - (可选参数) 光照强度。 缺省值 1。
- distance - 从光源发出光的最大距离,其强度根据光源的距离线性衰减。
- angle -光线散射角度,最大为Math.PI/2
- penumbra - 聚光锥的半影衰减百分比。在0和1之间的值。默认为0。
- decay- 沿着光照距离的衰减量。
这里需要注意的是,角度由angle控制,penumbra控制的是光照边缘的模糊程度,相当于是给圆锥形的光又套了一个壳子,调整penumbra的大小可以看出清晰边缘与模糊边缘
矩形区域光
Three.js 中还有一种类型的光照,矩形区域光, 顾名思义,表示一个矩形区域的发射出来的光照,例如长条的日光灯或者天花板上磨砂玻璃透进来的自然光。这个涉及到的额外知识点比较多,本身的话也比较好理解,所以先mark一下,之后再进行学习和探索
本文中涉及到的代码依旧以代码片段的形式引入