我有一个要用作地面的巨大飞机,我有向光作为太阳光。
问题是,这个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-有没有办法在不使用疯狂资源的情况下覆盖大面积的投射阴影?
答案 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开始的。其余的固定数字是我要在主摄像机和阴影摄像机之间保留的偏移量。
希望这可以对某人有所帮助。