三个js更改Directlight阴影相机的位置

时间:2018-09-07 17:46:23

标签: three.js

我有一个要用作地面的巨大飞机,我有向光作为太阳光。

问题是,这个directionalLight不能在整个平面上投射阴影,因此我决定使directionalLight的阴影摄像机跟随主PerspectiveCamera。

这是我的代码:

camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
lightCameraConstant = 40;
dirLight = new THREE.DirectionalLight( 0xffffff, 1 );
dirLight.color.setHSL( 0.1, 0.5, 1 );
dirLight.position.set( 1500, 2000, 1500 );
dirLight.castShadow = true;

dirLight.shadow.mapSize.width = 4096;
dirLight.shadow.mapSize.height = 4096;

dirLight.shadow.camera.left = -lightCameraConstant;
dirLight.shadow.camera.right = lightCameraConstant;
dirLight.shadow.camera.top = lightCameraConstant;
dirLight.shadow.camera.bottom = -lightCameraConstant;
dirLight.shadow.camera.far = 3000;
dirLight.shadow.camera.near = 0.01;
dirLight.shadow.bias = -0.0001;
scene.add( dirLight );
var helper = new THREE.CameraHelper( dirLight.shadow.camera );
    scene.add( helper );

然后在动画功能中,我使用以下内容:

dirLight.shadow.camera.position.x = camera.position.x;
helper.update();

但是这不起作用,阴影摄像机根本没有改变其位置。

1-如何在不更改directionalLight位置的情况下更改阴影摄像机的位置?

2-有没有办法在不使用疯狂资源的情况下覆盖大面积的投射阴影?

1 个答案:

答案 0 :(得分:0)

我无法更改阴影摄像机的位置,但是找到了解决方法。

解决方法是,使用主摄像机更改整个DirectLight位置和目标位置,以使目标位置和DirectLight之间的角度保持不变。

我用这个可以:

dirLight.position.x = camera.position.x - cameraStartPosition.x + 20 ;
dirLight.position.z = camera.position.z - cameraStartPosition.z + 20;
dirLight.target.position.set(( camera.position.x - cameraStartPosition.x),0,(camera.position.z - cameraStartPosition.z));

cameraStartPosition是摄像机的开始位置,因为我的摄像机不是从0,0,0开始的。其余的固定数字是我要在主摄像机和阴影摄像机之间保留的偏移量。

希望这可以对某人有所帮助。