我有一架巨大的飞机作为地面,我有一个方向光作为太阳光。
问题是,这个方向光源不能在所有平面上投射阴影,所以我决定让定向光源的阴影摄像机跟随主透视摄像机。
所以,这是我的代码:
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-如何在不改变方向的情况下更改阴影相机位置光的位置?
2-有没有办法在不使用疯狂资源的情况下覆盖大面积投射阴影?
我无法更改阴影摄像机的位置,但我找到了解决方法。
解决方法是,使用主摄像机更改整个 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 开始的。其余的固定数字是我想在主相机和阴影相机之间保持的偏移量。
希望这可以帮助某人。
最简单的方法是将光目标添加到包括光在内的场景中。
scene.add(light.target);
然后移动光目标和灯光
light.position.set(robot.position.x,light.position.y,robot.position.z);
light.target.position.set(robot.position.x,light.target.position.y,robot.position.z);