ThreeJS 中的“海洋”示例非常好,因为太阳反射在水面上,看起来很逼真。我正在尝试复制这个,但我仍然需要理解代码的一部分。海洋示例构造了一个 Water 对象和一个 Sky 对象。然后,它构造一个 CubeCamera 并使用这个相机的渲染目标作为场景的背景。至此,一目了然。代码看起来像这样,其中隐藏了很多细节(由我):scene = new Scene();water = new Water();sky = new Sky();scene.add( water );cubeCamera = new CubeCamera();scene.background = cubeCamera.renderTarget;cubeCamera.update( renderer, sky );除了最后一行,我可以理解所有内容: cubeCamera.update( renderer, sky );在 ThreeJS docs 中,它说 CubeCamera.update() 的最后一个参数必须是场景,而不是天空。我完全不明白为什么这个示例有效,因为 Sky 的方法与 Scene 的方法不同。然而,这行代码似乎真的很重要,因为当我删除它时,就没有太阳了。有人可以启发我并告诉我它为什么有效吗?
2 回答

慕田峪7331174
TA贡献1828条经验 获得超13个赞
在 Three.js 中,场景只是Object3D
. 它的不同之处仅在于它可以接受 a.background
和一个.fog
参数并相应地处理它。
一个空中包厢对象未在three.js所核心实现。它是一个示例特定的实现,可以作为用户参考。如果你看一下实现,它只不过是一个Mesh
带有一个BoxGeometry
和一个自定义着色器的材质。反过来,这也是一个Object3D
.
尽管文档说明了什么,您不需要cubeCamera
在 .js上渲染场景,就像在任何 Three.js 项目中都不需要场景一样。一切都可以用一个Object3D
. (您可能会遇到一些麻烦,但大多数情况下都是如此)
最后,这一切都取决于您要达到的目的。在本例中,cubeCamera
用于模拟天空盒,它独立于场景中的内容。
更常见的用途是为场景中的对象创建环境贴图。在这种情况下,使用实际场景来创建地图是有意义的。检查此示例背面的反射球。
添加回答
举报
0/150
提交
取消