three.js实现阴影、投影效果
效果:
基本思路
//一定要加上这两行,不然无法显示阴影
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
//创建网格物体
//将网格物体设置为产生阴影的物体
//创建一个平面
//调整平面角度、配置
//将平面设置为接受阴影的平面
//创建一个方向光
//调整光源方向位置、目标物体、角度(对于聚光灯来说需要调节角度)
//将光设置为用于计算阴影的光源
//计算阴影的区域:最近、最远、最左、最右、最上、最下;如果是聚光灯则只需:最近、最远、fov
具体实现
//创建网格物体
var geometry = new THREE.BoxGeometry(100,100,100);
var material = new THREE.MeshLambertMaterial({color:0x0000ff});
var mesh = new THREE.Mesh(geometry,material);
mesh.position.y+=1;
//将网格物体设置为产生阴影的物体
mesh.castShadow = true;
scene.add(mesh);
//创建第一个平面
var geometry2 = new THREE.PlaneGeometry(400,300);
var material2 = new THREE.MeshLambertMaterial({color:0xffffff});
var plant = new THREE.Mesh(geometry2,material2);
//调整平面角度、位置
plant.rotateX(-Math.PI / 2);
plant.position.y = -200;
//将平面设置为接受阴影的平面
plant.receiveShadow = true;
scene.add(plant);
//创建一个方向光
var light = new THREE.DirectionalLight(0xffffff,1.0);
//调整光源方向位置、目标物体、角度(对于聚光灯来说需要调节角度)
light.position.set(0,50,0);
// light.target = mesh;
//将光设置为用于计算阴影的光源
light.castShadow = true;
//计算阴影的区域:最近、最远、最左、最右、最上、最下;如果是聚光灯则只需:最近、最远、fov
light.shadow.camera.near = 0.5;
light.shadow.camera.far = 300;
light.shadow.camera.left = -50;
light.shadow.camera.right = 200;
light.shadow.camera.top = 200;
light.shadow.camera.bottom = -100;
scene.add(light);
//创建第二个平面
var geometry3 = new THREE.PlaneGeometry(400,300);
var material3 = new THREE.MeshLambertMaterial({color:0xffffff});
var plant3 = new THREE.Mesh(geometry3,material3);
//调整平面角度、位置
//plant3.rotateX(-Math.PI / 4);
plant3.position.z = -200;
//将平面设置为接受阴影的平面
plant3.receiveShadow = true;
scene.add(plant3);
//创建一个方向光
var light2 = new THREE.DirectionalLight(0xffffff,1);
//调整光源方向位置、目标物体、角度(对于聚光灯来说需要调节角度)
light2.position.set(10,-10,40);
// light.target = mesh;
//将光设置为用于计算阴影的光源
light2.castShadow = true;
//计算阴影的区域:最近、最远、最左、最右、最上、最下;如果是聚光灯则只需:最近、最远、fov
light2.shadow.camera.near = 0.5;
light2.shadow.camera.far = 300;
light2.shadow.camera.left = -50;
light2.shadow.camera.right = 200;
light2.shadow.camera.top = 200;
light2.shadow.camera.bottom = -100;
scene.add(light2);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)