我在Three.js中有一个非常标准的场景。有一些物体,一个地平面和一些定向灯,其中一个投射阴影。我的大多数物体投射阴影没有任何问题。一些,由于某种原因,没有。所有Mesh
个对象都嵌入在Object3D
个对象的层次结构中,其中大多数对象的深度为2或3级。那些没有投射阴影的层次结构处于一个更复杂的层次结构中,其中一些Mesh
个对象的深度为20+。层次结构适用于模拟我尝试移植的模拟程序中的复杂层次结构。
以下是该问题的屏幕截图:
这里只启用了阴影投射灯:
黄色衬衫的男人和背景中的橙色机器人都有这个问题。它们都具有复杂的层次结构。没有静止物体有这个问题。它们具有更简单的3级层次结构。正如你所看到的那样,这个家伙坐落在几个正确投射阴影的物体之间,因此他绝对是在光影的截头体内。
我已按照标准清单调试阴影,但没有运气:
.castShadow
设置为true
Mesh
对象都设有.castShadow
,.receiveShadow
设置为true
.receiveShadow
设为真深层次结构是否会导致.castShadow
设置混乱?这是我能想到的唯一解释。
编辑:这是来自定向灯的深度缓冲数据。请注意,没有什么看起来像我们的家伙或我们的机器人:
顺便说一下,我正在运行Three.js r70。
答案 0 :(得分:0)
由于您的层次结构深度为20级,因此您需要遍历网格,以便在所有级别设置.castShadow
和.receiveShadow
。
object.travese( function( child )
{
if( child instanceof THREE.Object3D )
{
child.castShadow = true;
child.receiveShadow = true;
}
} );
答案 1 :(得分:0)
想出来。
在超深层次结构中的某个地方,我意外地将其中一个占位符.visible
对象的Object3D
属性设置为undefined
。这表明WebGLRenderer和ShadowMapPlugin处理可见性的方式不同,因为它们出现在常规渲染中,而不是在光的阴影相机渲染器中。这可能被视为一个错误吗?