从canvas元素中本地获取three.js场景进行操作

Locally obtain three.js scene from canvas element for manipulation

Three.js 变量(场景、相机、渲染器等)需要 全局保存吗?

我创建了一个初始化 canvas 元素的函数,采用 DOM 位置和其他信息来构建场景。然后此函数传递给渲染函数,该函数调用自身意味着我永远不会丢失变量。

我面临的问题是,当我想操纵场景时,我无权访问这些变量,除非我将它们设为全局变量。目前是否有任何方法可以仅使用 canvas 元素 ID 访问和操作场景?我正在查看 canvas.getContext() 函数,但我看不到获得所需内容的方法。

我一直避免全局变量,因为我知道这通常是不好的做法,但不管怎样,在这种情况下它是最好的解决方案吗?

这里有一些代码可以帮助阐明我的意思。

function initCanvas(domPos, items){
    var scene, camera, renderer, loader;
    scene = new THREE.Scene();
    renderer = new THREE.WebGLRenderer();
    /* canvas, camera, controls setup ... */

    domPos.appendChild(renderer.domElement);

    for (var i=0; i<items.length; i++){
        loader = new THREE.ObjectLoader();
        loader.load(items[i], function (obj){ scene.add(obj); });
    }
    render(renderer, scene, controls, camera);
}

function render(r, s, ctrl, cam){
    requestAnimationFrame(function(){ render(r, s, ctrl, cam); });
    r.render(s, cam);
    ctrl.update();
}

function manipCanvas(canvasID, item){
    // var scene = document.getElementByID(canvasID).scene;
    // var scene = document.getElementByID(canvasID).getContext().scene;
    loader = new THREE.ObjectLoader();
    loader.load(item, function (obj){ scene.add(obj); });
}

您可以尝试将其分配给 canvas:

var scene = new THREE.Scene();
document.getElementById(canvasID).scene=scene;

但我觉得在一个简单的页面中使用全局变量是可以的。