【问题标题】:Make mesh from one scene be affected by lights from another scene使一个场景中的网格受到另一个场景中的灯光的影响
【发布时间】:2017-10-16 16:32:49
【问题描述】:

我有一个简单的场景,包括房间、几个光源和播放器。玩家网格应始终在房间网格之上渲染。按照this 问题的公认答案,我应该创建两个不同的场景:一个用于房间,一个用于播放器。事实上,在这种情况下,除了一件事之外,一切都很好——玩家网格将不再受到房间场景光源的影响。当然,我可以在玩家场景中复制光源,但在我看来这是一个糟糕的决定(我想会有阴影问题)。

这个问题有什么简单的解决办法吗?

【问题讨论】:

  • 解决您问题的方法可能不是您问题的答案。用一个场景试试这个:player.renderOrder = 999; player.onBeforeRender = function( renderer ) { renderer.clearDepth(); };
  • @WestLangley 它给了我同样的效果,当depthTestfalse 在每个网格材料上设置。我喜欢这个想法,但正如我在下面的一个 cmets 中提到的,我的播放器网格是 SkinnedMesh,具有不同的材料,我不知道如何为这个网格的不同部分设置 renderOrder
  • 不可能是一样的。在网格上将 depthTest 设置为 false 会导致各种伪像,因为网格不会针对自身进行深度测试。
  • @WestLangley 事实证明,我不能每次调用侦听器时都调用clearDepthonBeforeRender 函数的第五个参数是网格材料之一。仅当给定材质是网格的最顶层材质时,我才开始调用clearDepth。它给了我想要的行为。现在我有点担心:与在渲染通道之间调用 clearDepth 相比,这种方法对性能有什么显着影响吗?
  • 我不希望,我希望你什么也看不到。

标签: three.js


【解决方案1】:

不是直接的,你必须复制光照。阴影可能确实会产生伪影(但 3D 对象神奇地漂浮在场景的其余部分之前,人们可能想知道如何定义阴影的预期行为 :-)。

如果你想强制一个对象在顶部,但仍然是同一场景的一部分,你可能应该考虑修改 renderOrder禁用 z-testing目的。例如,参见using renderOrder in three.js

【讨论】:

  • 感谢您的回答!实际上,我的播放器网格是 SkinnedMesh,具有不同的材质。当我在一个或所有玩家材料上将depthTest 设置为false 时,它会导致伪影。我尝试为每个网格骨骼设置不同的renderOrder 值,但没有任何改变。有可能吗?
【解决方案2】:

Object3d 的layer 属性与Layers object 结合使用怎么样? 我没有尝试过多地使用它,但是从文档中,layers 属性说你可以让一个对象成为多个图层的成员。

所以你可以让灯光成为第 0 层的成员 1,让大多数对象只有第 0 层,而玩家只有第 1 层。这样你应该能够执行基本相同的技术和两个场景一样,只有1个场景,2个图层,其中灯光是0和1的成员,其余的只属于1个类别。

然后渲染场景,选择图层 0,切换到 1,再次渲染。我没有过多地使用此属性,但我认为它可以满足您的需求 - 这样您就可以定义一次所有内容,只需在图层之间切换。对于玩家关卡上的阴影,您可能可以创建一个不可见的玩家版本,只投射阴影而不进行渲染,并将其放在与关卡相同的图层上。

【讨论】:

  • 感谢您的建议!层是有趣的东西,但它们并不能解决主要问题 - 玩家网格应该始终位于其他网格之上(也许这个问题的标题有点令人困惑)。这就是为什么我开始使用两个不同的场景。在渲染通道之间,我调用clearDepth,因此第二个场景的每个网格都将在第一个场景的所有网格之上渲染。图层不允许达到这样的效果。
  • 看来我拒绝层的想法太早了。我的代码中有一个错误。现在一切都按预期工作。但阴影问题仍然存在(第二遍渲染的灯光不考虑房间的墙壁并照亮玩家网格)。
  • 尝试添加需要投射阴影且引用相同几何体但材质仅投射阴影但不可见的事物的副本。如果这解决了核心问题(照明问题),也标记为已回答,为优化问题启动一个新线程。
  • 实际上,现在我将坚持@WestLangley 建议的方法(请参阅问题的 cmets)。另一方面,使用两个渲染通道(带有图层或两个场景)以及不可见的对象可以做到这一点。所以我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多