无法更新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,提问作者欧阳维杰
相关产品推荐
相关产品推荐

