Объект в цикле не будет отбрасывать тень на весь лопоп с Three.js - PullRequest
5 голосов
/ 17 октября 2019

Почему не каждый куб в моей петле отбрасывает тень?

Я работаю с направленным светом, все кубы должны отбрасывать тени. Но по какой-то причине он останавливается после примерно пяти столбцов.

let dirLight = new THREE.DirectionalLight(0xFFFFFF, 1.5);
dirLight.position.set(300, -300, 400);
dirLight.castShadow = true;
scene.add(dirLight);

dirLight.shadow.mapSize.width = 512;
dirLight.shadow.mapSize.height = 512;
dirLight.shadow.camera.near = 0.5;
dirLight.shadow.camera.far = 1000;

let cubeGeometry = new THREE.BoxGeometry(1, 3, 1);
let cubeMaterial = new THREE.MeshLambertMaterial({
    color: 0xf54242
});

function drawCubes() {
    for (let c = 0; c < 25; c++) {
        for (let r = 0; r < 10; r++) {
            for (let t = 0; t < 2; t++) {
                let cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
                cube.position.x = c * 1.3;
                cube.position.y = r * 3.02;
                cube.position.z = t * 1.01;
                cube.castShadow = true;
                cube.receiveShadow = true;
                scene.add(cube);
            }
        }
    }

}
drawCubes();

enter image description here

1 Ответ

3 голосов
/ 18 октября 2019

Ваши тени обрезаны, так как усеченная по умолчанию камера направленной тени слишком мала. Попробуйте так:

const d = 50;

dirLight.shadow.camera.left = - d;
dirLight.shadow.camera.right = d;
dirLight.shadow.camera.top = d;
dirLight.shadow.camera.bottom = - d;

Вы также можете использовать THREE.CameraHelper для отладки теневой камеры. Очень полезно для корректировки. Имейте в виду, что качество тени сильно зависит от усеченного конуса. Более плотные усеченные контуры создают более резкие тени.

scene.add( new THREE.CameraHelper( dirLight.shadow.camera ) );

three.js R109

...