分析
- 在一个没有月亮,伸手不见五指的夜晚,路边的树有阴影吗?没有,因为没有月光,可见光是阴影产生的必要条件。
- 在一个月明的夜晚,空旷的操场上有影子吗?没有,因为没有障碍物,比如篮球框,可见物体是阴影产生的必要条件。
- 除了光源和物体以外,产生阴影还有一个必要条件,那就是地面,地面接受物体的阴影,可见地面也是阴影产生的必要条件。
光源
- 环境光会均匀的照亮场景中的所有物体。它没有方向,不能用来投射阴影。
- 平行光是沿着特定方向发射的光。平行光可以投射阴影。
- 点光源是从一个点向各个方向发射的光源。一个常见的例子是模拟一个灯泡发出的光。该光源可以投射阴影。
- 聚光灯是从一个点沿一个方向射出,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大。该光源可以投射阴影。
因此,在选择光源时,应该选择能够产生阴影的光源比如点光源,不能选择无法产生阴影的光源,比如环境光。
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
- 选择能够产生阴影的光源
参考代码
完整代码