Блуждающие тени, когда DirectionalLight прикреплен к объекту игрока - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь заставить направленный свет двигаться вместе с игроком. Я делаю это, чтобы улучшить качество тени, чтобы размеры теневой камеры могли быть меньше. Когда игрок двигается, тени немного бродят. Похоже, что он не следует за игроком достаточно близко.

У меня есть следующая проблема, проиллюстрированная в этом ОЧЕНЬ БЕДНОМ качественном гифке; enter image description here

Есть ли лучший способ сделать это? Или я забыл что-то обновить? Любой совет приветствуется:)

В классе игрока у меня есть объект, к которому я прикрепляю камеру и использую этот объект в качестве цели для освещения. Затем в функции player.update я устанавливаю положение источника света со смещением относительно положения объекта.

class Player{

    constructor(){
        this.object = new THREE.Object3D();
        scene.add( this.object );
        this.object.add( camera );

        this.directionalLightOffset = new THREE.Vector3(-5000, 2, 5);

        this.directionalLight = new THREE.DirectionalLight( 0xffffff, 0.85 );        
        scene.add( this.directionalLight);

        this.directionalLight.position.copy( this.directionalLightOffset );

        this.directionalLight.castShadow = true;
        this.directionalLight.shadow.mapSize.width = 750; 
        this.directionalLight.shadow.mapSize.height = 750;     
        this.directionalLight.shadow.camera.left = -2000;
        this.directionalLight.shadow.camera.right = 2000;
        this.directionalLight.shadow.camera.top = -2000;
        this.directionalLight.shadow.camera.bottom = 2000;
        this.directionalLight.shadow.camera.near = 0.5;    
        this.directionalLight.shadow.camera.far = 90000;

        this.directionalLight.target = this.object;
    }

    update(){
        this.directionalLight.position.copy( this.object.position );
        this.directionalLight.add( this.directionalLightOffset );
    }
}

1 Ответ

2 голосов
/ 14 января 2020

Попробуйте перемещать камеру только с шагом, равным размеру пикселя карты теней или подобному. Даже просто задерживая частоту перемещения камеры, можно свести к минимуму мерцание ... поэтому установите радиус вокруг игрока и сбросьте положение камеры только тогда, когда игрок отклонился от этого радиуса.

...