3
votes

Three.js - Pourquoi l'ombre n'apparaît que dans une petite zone

J'ai importé un modèle et j'ai trouvé que l'ombre n'apparaissait que dans une petite zone (zone verte sur l'image). Que puis-je faire pour que tous les objets montrent leur ombre.

 entrez la description de l'image ici

Voici mon code.

var gui = new dat.GUI();
gui.add( light.shadow.camera, 'top' ).min( 1 ).max( 100000 ).onChange( function ( value ) {
    light.shadow.camera.bottom = -value;
    light.shadow.camera.left = value;
    light.shadow.camera.right = -value;
});


0 commentaires

3 Réponses :


0
votes

Voici une fonction que j'utilise pour définir les dimensions et la zone de couverture shadowMap:

//sz is the size in world units that the shadow should cover. (area)
// mapSize is the width,height of the texture to be used for shadowmap (resolution)
    var setShadowSize=(light1, sz, mapSz)=>{
        light1.shadow.camera.left = sz;
        light1.shadow.camera.bottom = sz;
        light1.shadow.camera.right = -sz;
        light1.shadow.camera.top = -sz;
        if(mapSz){
            light1.shadow.mapSize.set(mapSz,mapSz)
        }
    }
    setShadowSize(myLight,15.0,1024);


0 commentaires

3
votes

Cela se produit parce que les lumières directionnelles utilisent une OrthographicCamera pour dessiner une shadowmap afin de projeter des ombres. S'il y a des objets en dehors de la vue de cette caméra, elle ne pourra pas calculer leurs ombres et aura l'effet que vous voyez en dehors de la boîte verte. Si vous souhaitez étendre la zone couverte par cette caméra, vous pouvez modifier les propriétés .left .right .top .bottom de cette caméra d'ombre pour couvrir toute votre scène. J'utilise une boîte de 100 unités dans l'exemple ci-dessous;

var side = 100;
light.shadow.camera.top = side;
light.shadow.camera.bottom = -side;
light.shadow.camera.left = side;
light.shadow.camera.right = -side;

... mais vous pouvez modifier les dimensions en fonction de vos besoins. Gardez à l'esprit que .fov ne fait rien dans votre exemple de code car les ortho caméras n'utilisent pas la propriété de champ de vision.


2 commentaires

Salut, merci pour votre réponse. J'essaye de changer light.shadow.camera.top / light.shadow.camera.bottom / light.shadow.camera.left / < code> light.shadow.camera.right , mais rien ne se passe: (j'ai édité ma question.


Essayez de modifier les valeurs directement avant de les ajouter à l'interface graphique. Sinon, vous ajoutez trop de modifications simultanément et vous ne saurez pas quelle partie les rompt.



3
votes

Très bien, ce serait formidable si vous pouviez me montrer un exemple en direct de votre code car j'ai déjà corrigé cela pour un projet dans boxelizer.com

Le problème peut être résolu en modifiant les propriétés light.shadow.camera.left, right, bottom et top comme suggéré avant, cependant, nous pourrions ne pas être en mesure de voir quelle pourrait être la zone effective de notre ombre et par conséquent, nous pourrions être vraiment près de la réparer, mais pas du tout. Ma suggestion consiste à utiliser un assistant momentanément juste pour voir la zone d'ombre effective de votre lumière avec:

var shadowHelper = new THREE.CameraHelper( light.shadow.camera );
scene.add( shadowHelper );

Vous êtes également invités à voir tout le code que j'ai utilisé dans le lien que j'ai référencé à.


7 commentaires

Bonjour, j'ai ajouté mon code complet dans ma question. J'utilise new THREE.CameraHelper (light.shadow.camera) et je trouve que l'échelle est trop petite. Pouvez-vous me dire comment y remédier? Merci!!


@Tiffany Je pense avoir repéré le problème ici, essayez de ne pas définir les valeurs de light.shadow.camera.left, à droite, en bas et en haut à l'intérieur du widget GUI, veuillez les définir avant même d'appeler la lumière dans la scène avec scene.add (léger), je parie que ça devrait régler ton truc. (Et si c'est le cas, je modifierai ma réponse)


Ça marche! mais semble câblé. Voici la capture d'écran .


Oh, tu as raison ça a l'air bizarre, combien de lumières directionnelles (projection d'ombre) avez-vous sur scène?


Juste une lumière directionnelle: (Je change également la position de la lumière directionnelle. Toutes les ombres sont rendues mais cela provoque un autre proplem. Voici le capture d'écran .


Peut-être que je devrais créer une question à poser sur stackoverflow. CameraHelper m'aide vraiment beaucoup. Merci!


Donnez-vous le lien de mon nouvelle question bien que vous ayez supprimé le commentaire. :)