You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Three.js中GLTF加载完成后无法赋值给外部变量的问题

问题解决:GLTF模型赋值外部变量后输出undefined

核心原因

gltfLoader.load()是异步操作——浏览器不会等待模型加载完成再执行后续代码,而是先运行console.log(model),此时模型还未加载完毕,model自然是undefined。模型能正常显示,是因为加载完成后回调函数会触发,给model赋值并添加到场景,但这一步发生在console.log之后。

解决办法

办法1:在回调函数内操作模型

所有需要用到model的逻辑都放在加载完成的回调里,确保模型已经完成赋值:

let model;
gltfLoader.load('./assets/javaLogo.gltf', function(gltf){
    model = gltf.scene;
    model.scale.set(44,44,44);
    scene.add(model);
    model.position.x = 44;
    model.position.y = -12;
    // 在这里操作model,比如打印或执行业务逻辑
    console.log(model); // 正常输出模型对象
});

办法2:用Promise+async/await封装加载

把加载过程包装成Promise,通过async/await控制代码执行顺序,让逻辑更直观:

function loadGLTFModel(url) {
    return new Promise((resolve, reject) => {
        gltfLoader.load(url, (gltf) => {
            resolve(gltf.scene);
        }, undefined, (error) => {
            reject(error);
        });
    });
}

// 用async函数执行加载流程
async function initModel() {
    let model = await loadGLTFModel('./assets/javaLogo.gltf');
    model.scale.set(44,44,44);
    scene.add(model);
    model.position.x = 44;
    model.position.y = -12;
    console.log(model); // 正常输出模型对象
}

initModel();

办法3:自定义事件监听加载完成

如果必须在回调外操作模型,可以通过自定义事件传递模型对象:

let model;
gltfLoader.load('./assets/javaLogo.gltf', function(gltf){
    model = gltf.scene;
    model.scale.set(44,44,44);
    scene.add(model);
    model.position.x = 44;
    model.position.y = -12;
    // 触发自定义事件,将模型作为参数传递
    window.dispatchEvent(new CustomEvent('modelLoaded', { detail: model }));
});

// 监听事件,拿到模型后执行后续逻辑
window.addEventListener('modelLoaded', (e) => {
    console.log(e.detail); // 正常输出模型对象
    // 在这里编写需要操作模型的代码
});

内容的提问来源于stack exchange,提问作者Lukas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:25:20