three学习(十一)—— 阴影

558 阅读2分钟

前言

上节介绍光源时提到了光源用法就是照亮物体产生阴影,阴影的产生也有相关的属性与计算方式,本节就来看下three中的阴影。

类别与属性

three文档中有四种阴影构造函数:

  • LightShadow:基类阴影,需要跟其他阴影类结合使用。
  • PointLightShadow:点光源阴影。
  • DirectionalLightShadow:平行光光源阴影。
  • SpotLightShadow:聚光灯光源阴影。 后面三个对应之前的是三种光源,而它们的属性大部分也都继承于LightShadow,下面我们看下LightShadow常用的属性:
  • .camera:生成观察光源的相机对象,就像我们拿着一个相机去观察前面的物体,后面的物体会处于前面物体的阴影中。
  • .map:用来生成深度图,如果物体位置超出像素深度的位置就会处在阴影中。
  • .mapSize:用来设置阴影图的宽度和高度。
  • .radius:用来模糊阴影边缘,属性值大于1将会模糊。

生成

了解了阴影的种类与属性,下一步就是渲染出阴影,要想产生阴影的效果,光有阴影可不够。现实生活中我们走在路上阴影是在路面展示的,所以我们需要把物体放到一个平面上,用平面去显示物体,最后我们还得设置一下光源阴影相关的属性,总结下来我们阴影有三部分构成:

  • 模型:用来产生阴影的物体模型。模型对象有阴影相关的属性需要我们设置才能产生对应的阴影:
    --.castShadow:是否产生阴影投影效果,默认值是false。
  • 平面:用来展示阴影的模型对象。平面模型也要设置一个属性:
    --.receiveShadow:是否接受模型的阴影投影,默认值是false。
  • 光源:用来照射物体产生阴影。光源有两个阴影相关属性:
    --.castShadow:是否投影动态阴影,默认是false。 --.shadow:阴影相关设置的属性,属性值就是上面介绍三个类别,阴影与光源是匹配的,所以.shadow的具体属性值取决那种光源,比如:DirectionalLight的.shadow属性值是DirectionalLightShadow。 前置知识已到位,我们将三部分创建出来将对应属性设置好就能得到阴影。
   //添加物体
const boxGeometry = new THREE.BoxGeometry();
const boxMaterial = new THREE.MeshLambertMaterial({color:0x8888});
const box = new THREE.Mesh(boxGeometry, boxMaterial);
//设置阴影属性
box.castShadow = true;
//创建平台
const floorGeometry = new THREE.PlaneGeometry(8,8);
const floorMaterial = new THREE.MeshLambertMaterial({
  color: 0x999999
});
const floor = new THREE.Mesh(floorGeometry, floorMaterial);
floor.receiveShadow = true;
floor.position.set(0,-2,0)
floor.rotateX(-Math.PI/2)
// 创建光源
const light = new THREE.SpotLight();
light.position.set(0, 10, 0);
light.angle = Math.PI /4;
light.castShadow = true;
scene.add(box, floor,light);
//开启阴影计算
renderer.shadowMap.enabled = true

注意最后一行代码,我们要开启渲染器阴影计算才可以。

{YWH`7ATL)_Z%GMHQBC266Q.png

总结

生产阴影需要三部分,每个部分都需要设置一些属性,所以创建阴影会有些繁琐,我们可以自己敲下代码加深印象。