ThreeJs入门14-光的初体验-点光源

523 阅读3分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

示例代码采用three.js-r73版本: cdnjs.cloudflare.com/ajax/libs/t…

yuque_diagram.jpg

上节我们介绍了光基类、环境光、平行光,这次我们再介绍一个光的种类-点光源PointLight,让我们来看看吧。

点光源

  • 点光源:由这种光源放出的光线来自同一点,且方向辐射自四面八方。
    • 蜡烛放出的光,萤火虫放出的光。
    • 手电筒的灯光,从一点发出
  • 点光源是理想化为质点的向四面八方发出光线的光源。
  • 点光源是抽象化了的物理概念,为了把物理问题的研究简单化。就像平时说的光滑平面,质点,无空气阻力一样,点光源在现实中也是不存在的,指的是从一个点向周围空间均匀发光的光源。

image.pngimage.png

  • 点光源时有一个衰减过程的,距离越近,光强越大,距离越远,光强越小
  • 点光源可以向四面八方发射光
  • 点光源用PointLight来表示,它的构造函数如下所示
THREE.PointLight = function ( color, intensity, distance, decay )
  • color:光的颜色
  • Intensity:光的强度,默认是1.0,就是说是100%强度的灯光,
  • distance:光的距离,从光源所在的位置,经过distance这段距离之后,光的强度将从Intensity衰减为0。 默认情况下,这个值为0.0,表示光源强度不衰减。
  • decay: 沿着光照距离的衰退量默认1

实战

  • 修改我们的代码,创建点光源和多个物体
let param;
let light;
let lightPos
function initLight() {
    var ParamObj = function () {
        this.x = 0;
        this.y = 0;
        this.z = 0;
        this.decay = 1; // 衰减程度
    }
    param = new ParamObj();
    var gui = new dat.GUI();
    gui.add(param, "x", -10000, 10000).name('点光源X的位置')
    gui.add(param, "y", -10000, 10000).name('点光源Y的位置')
    gui.add(param, "z", -2000, 2000).name('点光源Z的位置')
    gui.add(param, "decay", 0, 1).name('衰减程度')
    // 点光源定义为红色
    light = new THREE.PointLight(0xFF0000, 1, 1000, param.decay)
    light.position.set(param.x, param.y, param.z)
    scene.add(light)
}

function initObject() {
    var geometry = new THREE.CubeGeometry(200, 100, 50, 4, 4);
    var material = new THREE.MeshLambertMaterial({ color: 0xFF0000 });
    var mesh = new THREE.Mesh(geometry, material);
    mesh.position.set(0, 0, 0);
    scene.add(mesh);

    var geometry2 = new THREE.CubeGeometry(200, 100, 50, 4, 4);
    var material2 = new THREE.MeshLambertMaterial({ color: 0xFF0000 });
    var mesh2 = new THREE.Mesh(geometry2, material2);
    mesh2.position.set(-300, 0, 0);
    scene.add(mesh2);

    var geometry3 = new THREE.CubeGeometry(200, 100, 50, 4, 4);
    var material3 = new THREE.MeshLambertMaterial({ color: 0xFF0000 });
    var mesh3 = new THREE.Mesh(geometry3, material3);
    mesh3.position.set(0, -150, 0);
    scene.add(mesh3);

    var mesh4 = new THREE.Mesh(geometry3, material3);
    mesh4.position.set(0, 150, 0);
    scene.add(mesh4);

    var mesh5 = new THREE.Mesh(geometry3, material3);
    mesh5.position.set(300, 0, 0);
    scene.add(mesh5);

    var mesh6 = new THREE.Mesh(geometry3, material3);
    mesh6.position.set(0, 0, -100);
    scene.add(mesh6);
}


function changeLightPos() {
    light.position.set(param.x, param.y, param.z);
    light.decay = param.decay
}
  • 默认点光源的位置在(0,0,0),光对周围物体进行照射,我们可以看到中间物体周围物体对应的面显示成红色

image.png

  • 调整点光源的z位置到80,调整衰减为0.8,可以看到距离点光源越近,光越亮,所以点光源是一个发散的光源

image.png codepen示例代码

总结

这一节我们主要讲了以下内容:

  • 点光源介绍
  • 实战使用点光源