为什么没有出现阴影?

时间:2015-05-18 20:46:37

标签: javascript three.js

我在Three.js中有一个非常标准的场景。有一些物体,一个地平面和一些定向灯,其中一个投射阴影。我的大多数物体投射阴影没有任何问题。一些,由于某种原因,没有。所有Mesh个对象都嵌入在Object3D个对象的层次结构中,其中大多数对象的深度为2或3级。那些没有投射阴影的层次结构处于一个更复杂的层次结构中,其中一些Mesh个对象的深度为20+。层次结构适用于模拟我尝试移植的模拟程序中的复杂层次结构。

以下是该问题的屏幕截图:

enter image description here

这里只启用了阴影投射灯:

enter image description here

黄色衬衫的男人和背景中的橙色机器人都有这个问题。它们都具有复杂的层次结构。没有静止物体有这个问题。它们具有更简单的3级层次结构。正如你所看到的那样,这个家伙坐落在几个正确投射阴影的物体之间,因此他绝对是在光影的截头体内。

我已按照标准清单调试阴影,但没有运气:

  • 定向灯的.castShadow设置为true
  • 只有一个方向灯投射阴影
  • 方向灯的阴影平截头体设置正确(您可以从屏幕截图中看到)
  • 场景中的每个Mesh对象都设有.castShadow.receiveShadow设置为true
  • 地平面的.receiveShadow设为真
  • 地平面上没有洞
  • 编辑:当我禁用除投射阴影之外的所有灯光时,问题仍然存在

深层次结构是否会导致.castShadow设置混乱?这是我能想到的唯一解释。

编辑:这是来自定向灯的深度缓冲数据。请注意,没有什么看起来像我们的家伙或我们的机器人:

enter image description here

顺便说一下,我正在运行Three.js r70。

2 个答案:

答案 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处理可见性的方式不同,因为它们出现在常规渲染中,而不是在光的阴影相机渲染器中。这可能被视为一个错误吗?