【问题标题】:Three.js -> FileLoader(scope.manager) not constructorThree.js -> FileLoader(scope.manager) 不是构造函数
【发布时间】:2017-05-05 04:17:20
【问题描述】:

这似乎是一个重复的问题,因为它与this one 或许多其他问题非常相似,但我所看到的帖子都没有真正帮助我找出问题所在(当然,是我;)。 ..),所以我才敢在这里发,因为它让我很疯狂。

嗯,我正在开发一个使用 Angular CLI 生成的 Angular2 项目(没有后端任务或任何交易,目前只有 HTML + CSS + JS 文件......所有都是最新的和最新的)。我已经通过 npm 导入了 Three.js 和 three-obj-loader 并在我的组件中声明它是这样的:

import * as THREE from 'three';
declare var require: any;
const OBJLoader = require('three-obj-loader')(THREE);

我可以绘制任何形状,使用灯光和阴影,但无法从外部 .obj 文件加载网格。我尝试了许多看起来像这样的变体:

  const manager = new THREE.LoadingManager();
  const loader = new THREE.OBJLoader( manager );
  loader.load( './working/path/to/file.obj', function ( object ) {

       object.position.x = 0;
       object.position.y = 0;
       object.scale.x = 10;
       object.scale.y = 10;
       object.scale.z = 10;
       const texture = THREE.TextureLoader('./working/path/to/file.jpg');
       const material = new THREE.MeshLambertMaterial( { map: texture } );
       const mesh = new THREE.Mesh( object, material );
       scene.add( mesh );
   } );

我不知道为什么,但是当我尝试从文件加载 obj 时,我收到控制台错误:

TypeError: undefined is not a constructor (evaluating 'new THREE.FileLoader(scope.manager)')

并且画布是空的。错误引用了我安装的“three-obj-loader”模块的第 49 行 from here 。 提到的第三方代码部分是:

THREE.OBJLoader.prototype = {

constructor: THREE.OBJLoader,

load: function load(url, onLoad, onProgress, onError) {

  var scope = this;

  var loader = new THREE.FileLoader(scope.manager);
  loader.setPath(this.path);
  loader.load(url, function (text) {

    onLoad(scope.parse(text));
  }, onProgress, onError);
},

不确定它是否相关,但我没有为这些模块安装或声明任何特殊类型,只使用普通的 JS 源文件。我也没有安装任何文件加载器。

注意:我尝试从 here 实现 OBJLoader2,但得到了相同的结果。

感谢您的建议。

最好的 k

【问题讨论】:

  • 好的,所以我比较了可以通过 NPM 获得的 Three.js 源文件和 Github 上当前的 zip 包 (dev)。在我看来,NPM 服务于 r77,但开发者是 r85。存在显着差异。值得一提的是,NPM 包缺少对 FileLoader 的引用,并且没有 FileLoader 的源文件……这听起来很合理,考虑到我收到的错误……好吧,我没有深入了解 Three.js 的结构,因此在我使用的模块中重写该源代码或使开发包与我的项目一起工作对我来说有点困难(我的错,我应该学习...)。
  • 请注意,我刚刚从npm 中提取了three-js 并获得了r79。但它仍然不包含THREE.FileLoader,因此three-js 的版本与npm 中托管的three-obj-loader 版本之间肯定存在不匹配。
  • 感谢您的来信。挺有趣的。你用了什么命令?当我在没有标志的情况下进行简单安装时,我收到 r77 (v0.77.1),当我使用 @latest 或 @^0.79.0 尝试它时,我收到:“npm ERR!notarget 有效安装目标:npm ERR!notarget 0.0.1 , 0.0.2, 0.1.0, 0.72.0, 0.73.0, 0.73.2, 0.77.0, 0.77.1" ...
  • 也许你用过这个? github.com/JordanDelcros/npm-three-js ?好像是r79。我刚刚尝试过,但我不确定我是否能够让它工作,它具有所需的所有源文件,但我无法将它们加载到我的范围内......

标签: angular typescript three.js .obj objloader


【解决方案1】:

好的!感谢@TheJimO1 和他的评论,我能够解决这个问题。我取出了一个不同的NPM package by JordanDelcros,它提供的文件与我之前使用的 MrDoob 的包不同......然后我将它导入到我的组件中,如下所示:

declare var require: any;
const OBJLoader = require('three-js/addons/OBJLoader');
const THREE = require('three-js')([OBJLoader]);

OBJloader 现在从外部文件加载没有任何问题。

更新: 再次感谢@TheJimO1,我能够通过more official package 支持最新版本的 Three.js 并使用 three-obj-loader 以不同的方式完成这项工作。我刚才导入的如下:

declare var require: any;
const THREE = require('three');
const OBJLoader = require('three-obj-loader')(THREE);

这意味着至少有两种不同的工作解决方案:

[A] 使用之前提到的 JordanDelcros 的单个 npm 包,它支持 r77 并包含所有插件;

[B] 使用上面提到的更官方的三个包,结合支持r85的三个obj-loader(在原问题中提到)包

【讨论】:

  • 顺便说一下,这是你真正想要的包:npmjs.com/package/three 你在这里提到的那个和我建议的一样,但不推荐使用官方来源。
  • 嘿,太棒了!超级混乱,但也超级聪明……你发布的这个支持所有最近的功能,但需要外部 OBJloader……与三个 obj-loader 一起工作很好……谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2016-06-05
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2021-01-11
相关资源
最近更新 更多