为物体产生阴影的必要因素

91 阅读2分钟

分析

  • 在一个没有月亮,伸手不见五指的夜晚,路边的树有阴影吗?没有,因为没有月光,可见光是阴影产生的必要条件。
  • 在一个月明的夜晚,空旷的操场上有影子吗?没有,因为没有障碍物,比如篮球框,可见物体是阴影产生的必要条件。
  • 除了光源和物体以外,产生阴影还有一个必要条件,那就是地面,地面接受物体的阴影,可见地面也是阴影产生的必要条件。

光源

  • 环境光会均匀的照亮场景中的所有物体。它没有方向,不能用来投射阴影。
  • 平行光是沿着特定方向发射的光。平行光可以投射阴影。
  • 点光源是从一个点向各个方向发射的光源。一个常见的例子是模拟一个灯泡发出的光。该光源可以投射阴影。
  • 聚光灯是从一个点沿一个方向射出,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大。该光源可以投射阴影。 因此,在选择光源时,应该选择能够产生阴影的光源比如点光源,不能选择无法产生阴影的光源,比如环境光。
    const pointLight = new PointLight(0xffffff, 1, 0, 2);
    pointLight.castShadow = true; // 注意开启能够投下阴影属性
    scene.add(pointLight);

物体

    const sphere = new SphereGeometry(15, 15, 10);
    const object2 = new Mesh(sphere, material);
    object2.castShadow = true; // 注意开启能够投下阴影属性
    scene.add(object2);

地面

    const plane = new PlaneGeometry(400, 240);
    const object3 = new Mesh(plane, material);
    object3.receiveShadow = true; // 注意开启能够接受阴影属性
    scene.add(object3);

渲染器

    const renderer = new WebGLRenderer();
    renderer.shadowMap.enabled = true; // 注意

注意事项(缺一不可)

  • 光源的 castShadow
  • 物体的 castShadow
  • 地面的 receiveShadow
  • 渲染器的 shadowMap.enabled
  • 选择能够产生阴影的光源

参考代码

完整代码