我有一个简单的THREE.js场景,我希望点光源可以用相机动态移动。机芯效果很好,但场景中的灯光不会立即更新。当我改变摄像机位置(以及因此轻的位置)时,它需要一些时间(大约2-3秒),直到场景中的照明相对于新的光位置正确呈现。我已经更新了每一帧中灯光的矩阵/矩阵世界。需要进一步更新吗?如何告诉Three.js轻位置已经改变了?
答案 0 :(得分:2)
没有特别的方法可以告诉THREE.js光源改变了他们的位置。这里重要的是如何更新转换矩阵。我有一个lightGroup(Object3D的实例),它是我场景中所有光源的父节点。根据相机更新lightGroup转换使用此设置:
if (camera !== undefined)
{
lightGroup.position.x = camera.position.x;
lightGroup.position.y = camera.position.y;
lightGroup.position.z = camera.position.z;
lightGroup.lookAt(camera.target);
lightGroup.updateMatrix();
lightGroup.updateMatrixWorld();
}
转换矩阵的更新就是这里的重点。另一种方法是将相机挂在THREE.js场景图中,并将灯作为其子项附加,如果您想避免单独的lightGroup节点。
顺便说一下:只有在更改场景中的光源数量时,才需要对THREE.js场景进行特定更新。请参阅材料中的https://github.com/mrdoob/three.js/wiki/Updates。
答案 1 :(得分:0)
我知道这是旧帖子,但也许有人需要其他解决方案。
使用相机动态移动灯光您只需将它们附加到相机即可。
directionalLight = new THREE.DirectionalLight(0xffffff,0.6);
directionalLight.position.set(0,20,0);
directionalLight.rotation.set(+20/180*Math.PI,0,0);
directionalLight.castShadow = true;
camera.add(directionalLight);
scene.add(camera);