为什么不显示影子?
Why aren't shadows showing up?
我在 Three.js 中有一个非常标准的场景。有几个对象、一个地平面和几个定向灯,其中一个投射阴影。我的大多数物体都可以毫无问题地投射阴影。出于某种原因,有一些人没有这样做。所有 Mesh
个对象都嵌入到 Object3D
个对象的层次结构中,其中大多数对象的深度为 2 或 3 层。那些没有投射阴影的对象处于更复杂的层次结构中,其中一些 Mesh
对象的深度超过 20 层。层次结构已到位以模仿在我尝试移植的模拟程序中发现的复杂层次结构。
问题截图如下:
此处仅启用了阴影投射光:
黄色衬衫的家伙和背景中的橙色机器人都有这个问题。他们都有复杂的层次结构。 None 个静止物体有此问题。它们具有更简单的 3 级层次结构。如您所见,这家伙依偎在几个正确投射阴影的物体之间,因此他肯定在光的阴影截锥体内。
我已经按照标准检查清单来调试阴影,但没有成功:
- 平行光已
.castShadow
设置为 true
- 只有一盏平行光投射阴影
- 平行光的阴影截锥体设置正确(截图可见)
- 场景中的每个
Mesh
对象都有 .castShadow
和 .receiveShadow
设置为 true
- 地平面
.receiveShadow
设置为 true
- 地平面没有孔
- 编辑:当我禁用除了投射阴影的灯以外的所有灯时,问题仍然存在
深层层次结构是否会影响 .castShadow
设置?这是我能想到的唯一解释。
编辑:这是来自定向光的深度缓冲数据。请注意,没有任何东西看起来像我们的人或我们的机器人:
顺便说一句,我是 运行 Three.js r70。
由于您的层次结构有 20 层深,您需要遍历网格以便在所有层级上设置 .castShadow
和 .receiveShadow
。
object.travese( function( child )
{
if( child instanceof THREE.Object3D )
{
child.castShadow = true;
child.receiveShadow = true;
}
} );
想通了。
在超深层次结构的某个地方,我 不小心 将占位符 Object3D
对象之一的 .visible
属性设置为 undefined
.这表明 WebGLRenderer 和 ShadowMapPlugin 处理可见性的方式不同,因为它们出现在常规渲染中,而不是出现在灯光的阴影相机渲染器中。可以认为这是一个错误吗?
我在 Three.js 中有一个非常标准的场景。有几个对象、一个地平面和几个定向灯,其中一个投射阴影。我的大多数物体都可以毫无问题地投射阴影。出于某种原因,有一些人没有这样做。所有 Mesh
个对象都嵌入到 Object3D
个对象的层次结构中,其中大多数对象的深度为 2 或 3 层。那些没有投射阴影的对象处于更复杂的层次结构中,其中一些 Mesh
对象的深度超过 20 层。层次结构已到位以模仿在我尝试移植的模拟程序中发现的复杂层次结构。
问题截图如下:
此处仅启用了阴影投射光:
黄色衬衫的家伙和背景中的橙色机器人都有这个问题。他们都有复杂的层次结构。 None 个静止物体有此问题。它们具有更简单的 3 级层次结构。如您所见,这家伙依偎在几个正确投射阴影的物体之间,因此他肯定在光的阴影截锥体内。
我已经按照标准检查清单来调试阴影,但没有成功:
- 平行光已
.castShadow
设置为true
- 只有一盏平行光投射阴影
- 平行光的阴影截锥体设置正确(截图可见)
- 场景中的每个
Mesh
对象都有.castShadow
和.receiveShadow
设置为true
- 地平面
.receiveShadow
设置为 true - 地平面没有孔
- 编辑:当我禁用除了投射阴影的灯以外的所有灯时,问题仍然存在
深层层次结构是否会影响 .castShadow
设置?这是我能想到的唯一解释。
编辑:这是来自定向光的深度缓冲数据。请注意,没有任何东西看起来像我们的人或我们的机器人:
顺便说一句,我是 运行 Three.js r70。
由于您的层次结构有 20 层深,您需要遍历网格以便在所有层级上设置 .castShadow
和 .receiveShadow
。
object.travese( function( child )
{
if( child instanceof THREE.Object3D )
{
child.castShadow = true;
child.receiveShadow = true;
}
} );
想通了。
在超深层次结构的某个地方,我 不小心 将占位符 Object3D
对象之一的 .visible
属性设置为 undefined
.这表明 WebGLRenderer 和 ShadowMapPlugin 处理可见性的方式不同,因为它们出现在常规渲染中,而不是出现在灯光的阴影相机渲染器中。可以认为这是一个错误吗?