Three.js - 如何防止光线照射到物体上

Three.js - How to prevent a light from shining on an object

有没有办法防止定向光照亮特定物体?我想这也适用于聚光灯。这样做的原因是我想使用两个定向灯,但是用一个光照射一个物体来给它'self shadowing',并且不希望那个光干扰另一个物体。

目前我有一个这样声明的定向光:

function addpointlight()
{

    var SHADOW_MAP_WIDTH = 4096, SHADOW_MAP_HEIGHT = 2048;
    //Enabling this this light just creates serious artifacts on the obj I am trying to shadow.
    //var newlight=new THREE.DirectionalLight(0xeeeeee,0.7);
    //newlight.position.set( 0, 100, 300 );
    //newlight.castShadow=false;
    //scene.add(newlight);

// create a directional light
    pointLight = new THREE.DirectionalLight(0xeeeeee,0.80);

    //pointLight.onlyShadow=true;
    pointLight.position.set( 0, 100, 300 );
    pointLight.shadowCameraVisible=true;

    pointLight.shadowCameraNear = 10;
    pointLight.shadowCameraFar = 1500;
    pointLight.shadowCameraFov = 90;
    pointLight.castShadow=true;


    var d = 4;
    pointLight.shadowCameraLeft = -d;
    pointLight.shadowCameraRight = d;
    pointLight.shadowCameraTop = -d;
    pointLight.shadowCameraBottom = d;

    pointLight.shadowBias = 0.00;
    pointLight.shadowDarkness = 0.7;
    pointLight.shadowMapWidth = SHADOW_MAP_WIDTH;
    pointLight.shadowMapHeight = SHADOW_MAP_HEIGHT;

    // add to the scene
    scene.add(pointLight);
}

这盏灯很好地包裹了我想要自我阴影的物体,消除了阴影伪影。它随着移动的物体一起移动,它正在使用它创建阴影:-

pointLight.position.set(obj.position.x+40,obj.position.y+5,obj.position.z+300);
pointLight.target=obj;

所以我想创建第二个定向光,它只影响其他物体,而不影响这个物体,而且这个物体的光不能影响其他物体。 我会创建一个 fiddle,但我正在测试的模型以及纹理使其在带宽方面相当大 fiddle。

r70 中的 three.js 版本。

您想限制灯光影响的对象。在 three.js 支持 "layers" 之前,灯光只会影响其自身图层中的对象,您可以通过变通方法实现您想要的效果:两个独立的场景和两个渲染通道。

renderer.autoClear = false;

...

renderer.clear();
renderer.render( scene1, camera );
renderer.render( scene2, camera );

如果你有透明物体,它们必须在第二个场景中。另外,一个物体只能出现在一个场景中,所以如果你想在两个场景中都需要复制一盏灯。

three.js r.70