三个.js中平行光的阴影范围



在three.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);

如果以上方法有效,理论上我可以移动定向灯的位置和目标,使其角度保持不变,并可能达到我想要的效果,但这不起作用。

有什么想法可以创建阴影范围,或者为什么上面的不起作用?

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

相反,如果场景中有一个对象作为目标,那么就没有问题。

light.target = myObject;

three.js r.73

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

directionalLight.shadowCameraVisible = true;

看起来你也没有控制一些参数,例如:

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

最后,我不确定你所说的"什么都不做"是什么意思,因为

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

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

最新更新