【问题标题】:Shadow range for directional lights in three.jsthree.js 中定向光的阴影范围
【发布时间】:2016-01-15 04:21:18
【问题描述】:

在 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 = object 确实按照 issue 5555 中的建议工作。因此,我必须创建一个不可见的对象作为目标,并相对于相机移动它以获得所需的效果。感谢您在此处和 GitHub 上的提醒。

标签: javascript three.js


【解决方案1】:

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

如果您在场景中有一个对象作为目标,则没有问题。

light.target = myObject;

three.js r.73

【讨论】:

    【解决方案2】:

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

    directionalLight.shadowCameraVisible = true;
    

    您似乎也没有控制某些参数,例如:

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

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

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

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

    【讨论】:

    • 是的,我试过 directionalLight.shadowCameraVisible = true;它并没有为我创造一个帮手。我可以创建一个灯光助手,但阴影助手不起作用。
    • 另外,恐怕 directionalLight.target.position.set(x, y, z);根本没有为我做任何事情。光总是指向 0,0,0,正如这个人发现的那样:github.com/mrdoob/three.js/issues/1425
    猜你喜欢
    • 2014-05-26
    • 2017-08-29
    • 2021-10-06
    • 2012-09-17
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多