Uncaught TypeError: THREE.MTLLoader is not a constructor 2.0

Posted

技术标签:

【中文标题】Uncaught TypeError: THREE.MTLLoader is not a constructor 2.0【英文标题】: 【发布时间】:2018-05-24 07:26:32 【问题描述】:

我之前在这里问过这个问题:Uncaught TypeError: THREE.MTLLoader is not a constructor

我通过更改三个 mtl-loader 文件让它工作的地方。但是因为我稍后将把我的工作上传到 github,所以我必须在不更改这些文件的情况下创建一个解决方案。

因此,我尝试使用经典示例中使用的加载器加载 obj 和 mtl 文件:https://github.com/mrdoob/three.js/blob/master/examples/webgl_loader_obj_mtl.html

但我仍然收到错误'Uncaught TypeError: THREE.MTLLoader is not a constructor'

我有点不确定如何在这些加载器中加载,但现在我的代码如下所示:

import * as THREE from 'three'
import OBJLoader from 'three'
import MTLLoader from 'three'


var mtlLoader = new THREE.MTLLoader();
mtlLoader.load("http://blabla.obj.mtl", function(materials) 
   materials.preload();
   var objLoader = new THREE.OBJLoader();
   objLoader.setMaterials(materials);
   objLoader.load("http://blabla.obj", function(object) 

       object.scale.x = scale;
       object.scale.y = scale;
       object.scale.z = scale;

       scene.add(object)

  );
);

我插入的src文件夹中的three.js文件的什么地方:

export  OBJLoader  from './loaders/OBJLoader.js'
export  MTLLoader from './loaders/MTLLoader.js'

编辑

我使用 NPM 安装,错误消失了。不幸的是,还出现了其他问题 - 但我在另一个问题中提出了这些问题:three-mtl-loader error: THREE.MeshPhongMaterial: .shading has been removed -> object not visible

【问题讨论】:

【参考方案1】:

Three.js 文档具有误导性。尽管MTLLoader is in the main documentation,它实际上并不是 Three.js 核心库的一部分。它包含在 Three.js 的 examples/ 文件夹中。

如果你使用 ES6 模块语法,你有两个选择。

选项 1:NPM

通常人们会将这样的内容发布到 NPM,因为 Threejs 的创建者不使用现代 JS 开发实践。在这种情况下,有一个three-mtl-loader npm package 包。

npm install --save three-mtl-loader

然后

import MTLLoader from 'three-mtl-loader';

选项 2:从 Three 的源中复制 MTLLoader。

您可以将MTLLoader.js 文件复制到您的项目中,但如果您使用的是现代 ES6 模块,则将第三方库复制到您的本地项目中并不是一个好习惯。

【讨论】:

你的意思是我也导入这个:import * as THREE from 'three' 你是这个意思吗? :console.log(MTLLoader); var mtlLoader = new MTLLoader(); 控制台返回 'undefined' 而现在的错误是: Uncaught TypeError: three_3.MTLLoader is not a constructor 是因为没有正确安装还是什么?因为如果我例如console.log Textureloader,在同一个loaders文件夹中,我得到一个输出 删除了我的 cmets 并更新了问题。我忘了它不是三核的。 非常感谢 - 但正如我的旧问题 (***.com/questions/46989337/…) 中所述,我最初的问题是我使用 npm 安装了它,但我仍然会收到标题 - 但是如果你能看到我如何使用那个包,而不必自己编辑三个 mtl-loader 文件,那么这将是一个主要的帮助:D

以上是关于Uncaught TypeError: THREE.MTLLoader is not a constructor 2.0的主要内容,如果未能解决你的问题,请参考以下文章

Uncaught (in promise) TypeError: Cannot set properties of null (setting 'innerText') in OpenWetherMa

Uncaught (in promise) TypeError: Cannot read properties of null (reading 'fingerprint') Laravel Live

如何解决问题:Uncaught (in promise) TypeError: promisify is not a function?

Uncaught TypeError

Uncaught TypeError: Cannot redefine property: $router

Uncaught TypeError: o.block is not a function