0

0

Three.js 阴影不显示?关键一步你可能写错了

花韻仙語

花韻仙語

发布时间:2026-01-22 09:54:10

|

202人浏览过

|

来源于php中文网

原创

Three.js 阴影不显示?关键一步你可能写错了

three.js 中阴影无法显示的常见原因包括光源、物体和接收面未正确配置;本文直击你代码中的关键拼写错误,并系统梳理阴影启用的完整必要条件。

在你的代码中,阴影未显示的直接原因是一个易被忽略的拼写错误:你为地面平面(planeObj)设置了 plane.receiveShadow = true,但变量名实际是 planeObj,因此这行赋值根本未生效——plane 是几何体(THREE.PlaneGeometry 实例),它没有 receiveShadow 属性;而真正需要接收阴影的是网格对象 planeObj(THREE.Mesh 实例)。

✅ 正确写法应为:

planeObj.receiveShadow = true; // ✅ 作用于 Mesh 实例

但这只是“冰山一角”。要让 Three.js 阴影正常工作,必须同时满足以下全部条件

? 四大必备条件(缺一不可)

  1. 渲染器启用阴影映射

    renderer.shadowMap.enabled = true;
    renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 推荐软阴影
  2. 光源启用阴影投射且配置合理尺寸

    千面数字人
    千面数字人

    千面 Avatar 系列:音频转换让静图随声动起来,动作模仿让动漫复刻真人动作,操作简单,满足多元创意需求。

    下载
    light.castShadow = true;
    light.shadow.mapSize.width = 1024; // 建议 ≥ 512,越大越清晰(但性能开销增加)
    light.shadow.mapSize.height = 1024;
    // ⚠️ 补充:点光源阴影需注意视锥范围(可选)
    light.shadow.camera.near = 0.1;
    light.shadow.camera.far = 10;
    light.shadow.camera.fov = 90;
  3. 投射阴影的物体显式开启 castShadow

    sphere.castShadow = true; // ✅ 已正确设置
  4. 接收阴影的物体显式开启 receiveShadow

    planeObj.receiveShadow = true; // ✅ 必须作用于 Mesh 对象,非 Geometry!

? 额外优化建议

  • 使用 MeshStandardMaterial 或 MeshPhysicalMaterial(你已正确选用)——基础 MeshBasicMaterial 和 MeshLambertMaterial 不支持阴影
  • 确保接收面(如地面)有足够几何细分(当前 PlaneGeometry(20,20,1,1) 足够),但若使用自定义着色器,需手动处理 shadow map 采样。
  • 若阴影仍模糊或缺失,检查光源位置是否被遮挡,或调用 light.shadow.camera.updateProjectionMatrix() 强制更新(尤其动态移动光源时)。

✅ 完整修正片段(关键行已高亮)

// ... 其他初始化保持不变

// add plane object: ground
const plane = new THREE.PlaneGeometry(20, 20);
const planeMaterial = new THREE.MeshStandardMaterial({ color: 0xeeeeee });
const planeObj = new THREE.Mesh(plane, planeMaterial);
planeObj.position.y = -1;
planeObj.rotation.x = -Math.PI / 2;
planeObj.receiveShadow = true; // ✅ 修正:作用于 planeObj,非 plane
scene.add(planeObj);
? 提示:可通过 renderer.debug = { showShadowMap: true }(Three.js r160+)临时可视化阴影贴图,快速定位映射问题。

只要严格满足上述四点,阴影将立即呈现。你遇到的问题看似微小,却恰恰暴露了 Three.js 渲染管线中「对象层级」的关键逻辑——阴影属性永远属于 Mesh,而非其几何体或材质。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

60

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.27

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5292

2023.08.17

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

1

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号