Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript three.js-如何在加载程序外选择网格?_Javascript_Three.js_Scope - Fatal编程技术网

Javascript three.js-如何在加载程序外选择网格?

Javascript three.js-如何在加载程序外选择网格?,javascript,three.js,scope,Javascript,Three.js,Scope,我想更改网格的材质,我可以在的网格加载器中轻松完成。但是,一旦加载程序完成,我就不能再从外部函数访问它了。这一定是一个范围问题,我还没有弄清楚 这是可行的,但我不能这样使用: var loader = new THREE.GLTFLoader(); loader.load('model.glb', function (gltf) { scene.add(gltf.scene); // Material changed below var newMat = new

我想更改网格的材质,我可以在的网格加载器中轻松完成。但是,一旦加载程序完成,我就不能再从外部函数访问它了。这一定是一个范围问题,我还没有弄清楚

这是可行的,但我不能这样使用:

var loader = new THREE.GLTFLoader();
    loader.load('model.glb', function (gltf) {
    scene.add(gltf.scene);

    // Material changed below
    var newMat = new THREE.TextureLoader().load(something.jpg);
    gltf.scene.traverse(function (node) {
            node.material = newMat;
    });

});
这不是。我怎样才能修好它

错误为“未定义gltf”

错误为“未定义gltf”

这是因为gltf仅在onLoad回调中有效。通过将gltf.scene指定给在更高范围内声明的类似变量的模型,可以轻松避免运行时错误

var model;

var loader = new THREE.GLTFLoader();
loader.load('model.glb', function (gltf) {
    scene.add(gltf.scene);
    model = gltf.scene;
});

function textureSwap(){
    var newMat = new THREE.TextureLoader().load(something.jpg);
    model.traverse(function (node) {
        node.material = newMat;
    });
}
您必须确保仅在加载过程完成后调用textureSwap。要使函数更健壮,可以执行以下操作:

function textureSwap(){
    if ( model ) {
        var newMat = new THREE.TextureLoader().load(something.jpg);
        model.traverse(function (node) {
            node.material = newMat;
        });
    }
}
function textureSwap(){
    if ( model ) {
        var newMat = new THREE.TextureLoader().load(something.jpg);
        model.traverse(function (node) {
            node.material = newMat;
        });
    }
}