【问题标题】:Three.js Hemisphere LightThree.js 半球灯
【发布时间】:2015-09-21 14:03:32
【问题描述】:

我正在使用 dat.GUI 和 three.js (r72) 检查不同类型的灯光,并被困在动态打开/关闭 HemisphereLight 上。 我有一个将每个灯光添加到场景中的实例:

var pointLight = new THREE.PointLight(this._whiteColor);
pointLight.visible = false;

var hemisphereLight = new THREE.HemisphereLight(this._whiteColor, this._whiteColor);
hemisphereLight.visible = false;

等等……

还有一个用于使用简单处理程序打开/关闭的按钮。像这样:

me._sceneObjects.hemisphereLight.visible = value;

因此,在渲染之前,所有灯光都存在于场景中,但不可见。 当执行半球光的处理程序时 - 它保持不可见。排除后 hemisphereLight.visible = false;工作正常。

目前我在渲染第一帧后禁用此灯:

function render() {
    some code ...

    if (!sentenceExecuted && firstCall > 0) {
        hemisphereLight.light.visible = false;
        sentenceExecuted = true;
    } else {
        firstCall++;
    }
};

如果您有任何解决此问题的建议,我将不胜感激。 很抱歉可能出现英文错误。

【问题讨论】:

  • 1.您的代码片段并不清楚问题所在。你能举一个活生生的例子吗? 2. Wiki 文章How to Update Things with WebGLRenderer 可能会有所帮助。 3. 这个问题可能不是 HemisphereLight 特有的。
  • codepen 上的示例codepen.io/majeretft/pen/RWRjjB 目前面临另一个问题。我认为两者都与一个错误有关(应该调用一个函数来强制渲染重新计算一些数据,但找不到我错过的内容)
  • 1.说真的,你必须说出问题所在。 2. 从light.visible = true 开始,您的代码似乎可以工作。

标签: three.js


【解决方案1】:

WestLangley,感谢您提供指向 Wiki article 的链接。

阅读并尝试示例后,我发现了我的错误。 最初我想为渲染灯光添加“不可见”(使用 Object3D.visible)到场景中,然后动态打开/关闭它们。

由于内部的 three.js 渲染算法,一些灯(在我的例子中是 HemisphereLight 和 SpotLight)不能以这种方式工作(几何和材质的缓冲区是在没有考虑我的灯的情况下构建的)。

为了实现动态闪电,本文作者建议:

  1. 添加强度 = 0 的光,然后增加它(渲染时会考虑这种光)

  2. 将光照可见性设置为 true 后,强制为受影响的场景对象更新材质 (material.needsUpdate = true)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2012-06-15
    • 2018-08-10
    相关资源
    最近更新 更多