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

THREE.MTLLoader不是构造函数错误求助(v3.0)

解决Three.js中THREE.MTLLoader is not a constructor错误

问题原因

你使用了ES模块方式引入加载器(type="module"),但仍在代码中通过THREE全局命名空间访问MTLLoader和OBJLoader——当前Three.js的官方加载器已改为ES模块导出,不会自动挂载到THREE全局对象上。

解决方案步骤

1. 修正加载器导入逻辑

在你的主脚本开头添加ES模块导入语句(路径需与你的文件结构匹配),同时将主脚本标签改为type="module":

<!-- 移除原单独引入MTLLoader/OBJLoader的script标签 -->
<script type="module" src="./js/your-main-script.js"></script>

主脚本内的导入代码:

// 先导入Three.js核心模块
import * as THREE from './js/libs/three.module.js';
// 导入对应加载器
import { MTLLoader } from './js/libs/MTLLoader.js';
import { OBJLoader } from './js/libs/OBJLoader.js';

2. 修改加载函数代码

去掉THREE.前缀,直接使用导入的加载器类:

function loadModel(path, objName, mtlName) {
    const onProgress = function(xhr) {
        if (xhr.lengthComputable) {
            const percentComplete = xhr.loaded / xhr.total * 100;
            console.log(Math.round(percentComplete, 2) + '% downloaded');
        }
    };
    const onError = function(xhr) {};

    const mtlLoader = new MTLLoader();
    mtlLoader.setPath(path);

    mtlLoader.load(mtlName, function(materials) {
        materials.preload();
        const objLoader = new OBJLoader();
        objLoader.setMaterials(materials);
        objLoader.setPath(path);

        objLoader.load(objName, function(object) {
            object.position.set(0, 0, 0);
            object.scale.set(0.2, 0.2, 0.2);
            scene.add(object);
        }, onProgress, onError);
    });
}

3. 验证加载器版本匹配

确保你使用的MTLLoader.js和OBJLoader.js是与当前Three.js版本对应的ES模块版本,需从Three.js官方仓库的examples/jsm/loaders/目录获取,不要使用旧版examples/js/下的非模块版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:10:00