【问题标题】:THREE.js Displaying Scene on top of another SceneTHREE.js 在另一个场景之上显示场景
【发布时间】:2021-02-18 04:54:25
【问题描述】:

我有一个包含 10 个立方体的场景。 看到这个小提琴:https://jsfiddle.net/gilomer88/tcpwez72/47/

当用户点击其中一个立方体时,我希望在当前“主场景”之上弹出一个新的“细节场景”,并让它只显示用户点击的那个立方体。
当用户完成对立方体的检查和玩耍后,他们可以关闭“细节场景”,从而显示原来的“主要场景”——它实际上一直就坐在它下面。

我不断收到以下错误:

Uncaught TypeError: scope.domElement.addEventListener is not a function

不知道为什么会这样。

请注意,我制作的小提琴已经完成了 95% - 它只是缺少您在此处看到的 HTML 的这一点:

        <canvas id="detailsCanvas"></canvas>
        <div id="renderingSpot"></div>

(一旦我添加了这个 HTML - 和 CSS - 一切都开始在我身上崩溃,无论我做了什么来尝试修复它 - 所以我终于把它拿出来了。)

无论哪种方式,我基本上都是在创建一个新的scene 来显示“详细信息视图”,以及一个新的rendererOrbitControl 等 - 并且错误发生在这一行:

const detailsOrbitController = new OrbitControls(detailsScene.userData.camera, detailsScene.userData.renderingElement);

(那行在我的 makeDetailsScene() 函数中 - 你会在小提琴中看到。)

对于它的价值,当我把它放在一起时,我正在关注这个 THREE.js 示例:https://threejs.org/examples/?q=mul#webgl_multiple_elements

【问题讨论】:

    标签: three.js scene


    【解决方案1】:

    我不知道你为什么需要这个额外的&lt;div id="renderingSpot"&gt;&lt;/div&gt;。您也可以将画布传递给 OrbitControls。当我运行以下代码时,我没有收到任何错误:

    detailsScene.userData.renderingElement = document.getElementById("renderingSpot");
    const detailsOrbitController = new OrbitControls(detailsScene.userData.camera, detailsScene.userData.renderingElement);
    

    我对你的小提琴做了一些改动:https://jsfiddle.net/xn19qbf7/
    (我还添加了一些 HTML、CSS、JS 内容,以便详细信息视图显示在主画布的顶部并渲染其场景。)

    我猜你的问题是你最初的 jQuery 任务:

    let renderingElement = $("#renderingSpot");
    detailsScene.userData.renderingElement = renderingElement;
    

    renderingElement 仍然是一个 jQuery 对象。但 OrbitControls 不接受 jQuery 对象。所以,你应该得到真正的元素:

    let renderingElement = $("#renderingSpot");
    detailsScene.userData.renderingElement = renderingElement.get(0);
    // or as above
    detailsScene.userData.renderingElement = document.getElementById("renderingSpot");
    

    【讨论】:

    • 嘿,关于使用 jQuery 和好的老式香草 javascript 之间的区别,我得出了相同的结论。底线是jQuery 不能很好地与所有THREE.js 配合使用,因此绝对最好使用document.getElementById。感谢您的回复! (仅供参考,关于同一个小提琴还有其他一些问题 - 我将它们发布在这里:discourse.threejs.org/t/scene-within-a-scene-finer-points/23635。所以如果你想继续和我一起解决这个小问题,请检查一下。再次感谢!)
    • 我没有在threejs论坛注册。但是 Q2 是因为您只渲染了一次细节场景。听轨道控制改变事件来渲染场景(见我上面的 jsfiddle)或将 detailsRenderer.render() 调用放在渲染循环中。
    • 是的!我看见了!您添加到小提琴代码的行:detailsOrbitController.addEventListener('change', () =&gt; { detailsRenderer.render(detailsScene, detailsCamera); - 我立即复制粘贴它并且它有效。我也忘了感谢你。除此之外,我想我还会在这里从 Three.js 论坛发布我的问题,以便其他人 - 例如您自己 - 可以看到它并可能为整个社区提供更多答案。再次感谢!
    • 你好——我遇到了一个新的、完全莫名其妙的问题,你帮助我解决了这个场景中的场景——我在这里发布了一个关于它的新问题:stackoverflow.com/questions/66286987/…如果您能给您两分钱,将不胜感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多