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

时间:2015-02-18 14:45:39

标签: three.js

有没有办法阻止定向光照射特定物体?我想这也适用于聚光灯。这样做的原因是我想使用两个方向灯,但是一个灯照射在一个物体上以使其“自我遮蔽”,并且不希望它发光以干扰另一个物体。

目前我有一个单向指示灯:

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;

所以我想创建一个仅影响其他物体的第二个定向灯,而不是这个物体,这个灯的亮度不得影响其他物体。 我创造了一个小提琴,但我正在测试的模型与纹理一起使得它在带宽方面变得相当大。

r70中的three.js版本。

1 个答案:

答案 0 :(得分:6)

您希望限制灯光影响的对象。直到three.js支持“图层”的时间,其中灯光只影响其自身图层中的对象,您可以通过解决方法实现您想要的效果:两个单独的场景和两个渲染过程

renderer.autoClear = false;

...

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

如果你有透明物体,他们必须在第二个场景中。此外,一个对象只能在一个场景中,因此如果你想在两个场景中都需要复制一个灯光。

three.js r.70