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
有没有办法防止定向光照亮特定物体?我想这也适用于聚光灯。这样做的原因是我想使用两个定向灯,但是用一个光照射一个物体来给它'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