You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法更新THREE.DirectionalLight方向,阴影相机始终看向原点求助

解决Three.js DirectionalLight阴影始终看向原点的问题

嗨,这个问题我之前踩过坑!你遇到的核心问题是对Three.js里DirectionalLight的lookAt()方法逻辑理解错了——它和普通3D对象的lookAt()不一样,直接这么调用并不会正确更新阴影相机的指向。

问题根源

平行光的阴影相机方向是跟着灯光的target属性走的,但默认情况下light.target是场景本身。你调用light.lookAt(new THREE.Vector3(400,400,400))时,内部其实是试图把场景的位置设为目标点,这显然不会生效,反而会导致阴影相机依然盯着原点(场景默认位置)。

两种可行的解决方案

方案1:给灯光单独设置目标对象

给平行光指定一个独立的target,然后修改这个目标的位置,最后更新矩阵让Three.js识别变化:

var light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(20, 0, 20);

// 创建一个新的Object3D作为灯光的专属目标
light.target = new THREE.Object3D();
// 设置目标点位置
light.target.position.set(400, 400, 400);
// 必须更新目标的矩阵,让Three.js感知到位置变化
light.target.updateMatrixWorld();

light.castShadow = true;

方案2:直接调整阴影相机的朝向

如果你不想额外创建目标对象,也可以直接手动设置阴影相机的看向:

var light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(20, 0, 20);
light.castShadow = true;

// 直接让阴影相机看向目标点
light.shadow.camera.lookAt(new THREE.Vector3(400, 400, 400));

额外提示

如果你的场景里有动画,记得在每一帧更新light.target的位置后,都要调用light.target.updateMatrixWorld(),否则阴影相机的方向不会实时更新哦。

内容的提问来源于stack exchange,提问作者欧阳维杰

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:13:45