在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时,事情会变得更清楚。我希望这能有所帮助。