threejs中的阴影

1.效果

2.实现要求

渲染器开启阴影渲染
this.renderer.shadowMap.enabled = true;
灯光需要开启“引起阴影”
dirLight.castShadow = true
物体需要开启“引起阴影”
svg.castShadow = true
平面开启“接受阴影”
plane.receiveShadow = true

shadowMap.autoUpdate : Boolean
启用场景中的阴影自动更新。默认是true,如果不需要动态光照/阴影, 则可以在实例化渲染器时将之设为false
shadowMap.needsUpdate : Boolean
当被设为true, 场景中的阴影贴图会在下次render调用时刷新。默认是false,如果你已经禁用了阴影贴图的自动更新(shadowMap.autoUpdate = false), 那么想要在下一次渲染时更新阴影的话就需要将此值设为true
shadowMap.type : Integer
定义阴影贴图类型 (未过滤, 关闭部分过滤, 关闭部分双线性过滤)
可选值有
THREE.BasicShadowMap:能够给出没有经过过滤的阴影映射 —— 速度最快,但质量最差
THREE.PCFShadowMap (默认) :使用Percentage-Closer Filtering (PCF)算法来过滤阴影映射
THREE.PCFSoftShadowMap:使用Percentage-Closer Soft Shadows (PCSS) 算法来过滤阴影映射

3.遇到的问题以及解决方法

上面都设置好了,但是就是没有阴影。

(一)plane的材质不对

一开始设置的材质是new this.THREE.MeshBasicMaterial({}),发现并没有什么效果。
后来修改之后new this.THREE.MeshLambertMaterial({})就可以啦。

(二)平行光设置
	 let dirLight = new this.THREE.DirectionalLight(0x666666)
	 dirLight.position.set(500,500,500)
     dirLight.shadow.camera.near = 2;
     dirLight.shadow.camera.far = 2000;
     dirLight.shadow.camera.left = -1000;
     dirLight.shadow.camera.right = 1000;
     dirLight.shadow.camera.top = 1000;
     dirLight.shadow.camera.bottom = -1000;

这里规定了平行光产生阴影的投影范围。
这里存在物体不在平行光投影范围内的情况,这里推荐使用灯光和阴影的helper

	  // 灯光,可以画出一个灯光的位置
	  var helper02 = new this.THREE.PointLightHelper(dirLight, 6);
      this.scene.add(helper02);
      // 阴影,可以给出阴影的范围
      var helper = new this.THREE.CameraHelper( dirLight.shadow.camera );
      this.scene.add( helper );

加上helper之后显示效果如下:

为了在Three.js设置阴影,需要执行以下四个步骤: 1. 首先,需要在渲染器启用阴影属性。这可以通过设置`renderer.shadowMap.enabled`为`true`来实现。 2. 接下来,需要为需要投射阴影的光源设置阴影属性。这可以通过设置光源的`castShadow`属性为`true`来实现。 3. 然后,需要为需要接收阴影的物体设置阴影属性。这可以通过设置物体的`receiveShadow`属性为`true`来实现。 4. 最后,需要为需要投射阴影的物体设置阴影属性。这可以通过设置物体的`castShadow`属性为`true`来实现。 下面是一个示例代码,演示如何在Three.js设置阴影: ```javascript // 创建渲染器 const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); renderer.shadowMap.enabled = true; // 启用阴影属性 document.body.appendChild(renderer.domElement); // 创建场景 const scene = new THREE.Scene(); // 创建相机 const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000); camera.position.set(0, 0, 5); // 创建光源 const light = new THREE.SpotLight(0xffffff); light.position.set(0, 10, 10); light.castShadow = true; // 设置光源投射阴影 scene.add(light); // 创建立方体 const cubeGeometry = new THREE.BoxGeometry(1, 1, 1); const cubeMaterial = new THREE.MeshStandardMaterial({ color: 0xffffff }); const cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.position.set(0, 0, 0); cube.receiveShadow = true; // 设置立方体接收阴影 cube.castShadow = true; // 设置立方体投射阴影 scene.add(cube); // 创建地面 const planeGeometry = new THREE.PlaneGeometry(10, 10); const planeMaterial = new THREE.MeshStandardMaterial({ color: 0xaaaaaa }); const plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.rotation.x = -Math.PI / 2; plane.position.y = -1; plane.receiveShadow = true; // 设置地面接收阴影 scene.add(plane); // 渲染场景 renderer.render(scene, camera); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值