三个方向灯的阴影范围。

时间:2016-01-02 22:19:01

标签: javascript three.js

在三个.js中,定向光的阴影计算范围是基于从定向光源发出的边界框定义的。因此,如果我希望限制阴影的计算距离,我会限制边界框的几何。例如:

var directionalLight = new THREE.DirectionalLight( 0xffffff );
directionalLight.position.set( 50, 50, 50 );
directionalLight.intensity = 0.5;
directionalLight.castShadow = true;
directionalLight.shadowCameraLeft = -10;
directionalLight.shadowCameraRight = 10;
directionalLight.shadowCameraTop = 10;
directionalLight.shadowCameraBottom = -10;

可以将shadowCamera变量调整到光源FOV的距离,从而创建阴影。我希望这个边界框跟随用户相机,以便阴影渲染到远离相机的一定距离。

因为边界框几何是基于光相对于场景原点(或目标)的位置,所以不可能只将边界框移动到相机创建我想要的效果的位置。

我试图用相机移动光源,假设边界几何体相对于相机的位置。这不起作用,因为我似乎无法设置定向光的目标,它总是试图指向原点,所以如果我改变光的位置,它基本上会改变它的方向。

例如,以下内容无效:

directionalLight.target.position.set(100,100,100);

如果上述方法有效,我理论上可以将方向灯位置和目标相对于彼此移动以保持其角度不变并可能达到我想要的效果,但它不起作用。

任何想法如何创建阴影范围或上述原因不起作用?

2 个答案:

答案 0 :(得分:1)

DirectionalLight.target是光的属性,但它不是场景图的一部分,因此目标的矩阵没有被更新。

相反,如果你的场景中有一个物体作为目标,那就没有问题了。

light.target = myObject;

three.js r.73

答案 1 :(得分:0)

尝试设置此标志以帮助调试:

directionalLight.shadowCameraVisible = true;

看起来您还没有控制某些参数,例如:

directionalLight.shadowCameraNear = -10;
directionalLight.shadowCameraFar = 10;

最后,我不确定“什么也不做”是什么意思,因为

directionalLight.target.position.set(x, y, z); 

为我移动光目标,所以也许当你打开shadowCameraVisible时,事情会变得更加清晰。我希望这会有所帮助。