2017-05-04 6 views
3

Cela peut sembler être une question dupliquée, car il est très similaire à this one ou beaucoup d'autres, mais aucun des articles que j'ai vus ne m'a vraiment aidé à comprendre où le problème est (bien sûr, c'est moi;) ...), donc j'ose le poster ici, car ça me rend vraiment fou. Eh bien, je travaille sur un projet en Angular2 généré avec Angular CLI (pas de tâche backend ou de trafic, juste des fichiers HTML + CSS + JS pour le moment ... tous à jour et plus récents). J'ai importé Three.js et trois obj chargeur par NPM et déclaré dans mon élément comme celui-ci:Three.js -> FileLoader (scope.manager) pas constructeur

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

Je peux dessiner toutes les formes, l'utilisation des lumières et des ombres, mais ne peut pas charger maille à partir du fichier obj externe . J'ai essayé beaucoup de variations qui ressemble à ceci:

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); 
    }); 

Je ne sais pas pourquoi, mais lorsque je tente de obj charger à partir du fichier, je reçois une erreur de la console:

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

et la toile est erronée.Le erreur se réfère à la ligne 49 du module "three-obj-loader" que j'ai installé from here. La partie de ce code tiers mentionné est:

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); 
}, 

Je ne sais pas si elle pourrait être liée, mais je ne pas installé ou déclaré des types spéciaux pour ces modules, en utilisant uniquement les fichiers source JS plaine. De plus, je n'ai installé aucun chargeur de fichiers.

REMARQUE: J'ai essayé d'implémenter OBJLoader2 à partir de here mais j'ai obtenu le même résultat.

Nous vous remercions de vos conseils.

Meilleur k

+0

OK, donc je comparais les fichiers source Three.js que vous pouvez obtenir via NPM avec le paquet zip actuel (dev) sur Github. Il me semble que NPM sert r77, mais le dev est r85. Il y a des différences significatives.Pour nommer un frappant est que le paquet de NPM manque de référence à FileLoader et il n'y a aucun fichier source pour FileLoader ... cela semble raisonnable, étant donné l'erreur que je reçois ... eh bien, je ne vois pas profondément dans le tissu de Three.js , donc c'est un peu difficile pour moi de réécrire cette source dans le module que j'utilise ou de faire du paquet dev travaillant avec mon projet (mon mauvais, je devrais apprendre ça ...). – Kristievnee

+0

Juste une note, je viens de tirer 'three-js' de' npm' et j'ai obtenu r79. Il ne contenait pas 'THREE.FileLoader', donc il doit y avoir une correspondance entre la version de' three-js' et la version de 'three-obj-loader' hébergée dans' npm'. – TheJim01

+0

Merci pour la note. C'est intéressant. Quelle commande avez-vous utilisé? Quand je fais une installation simple sans drapeau, je reçois r77 (v0.77.1) et quand je l'essaye avec @latest ou @^0.79.0 je reçois: "npm ERR! Notarget Cibles d'installation valides: 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 "... – Kristievnee

Répondre

1

OK! Merci à @ TheJimO1 et son commentaire, j'ai été en mesure de résoudre le problème. J'ai tiré un NPM package by JordanDelcros différent qui sert différents fichiers que le paquet de MrDoob j'utilisais déjà ... alors je l'importaient dans mon élément comme celui-ci:

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

charges OBJloader de fichier externe sans problème maintenant.

MISE À JOUR: Encore une fois, merci à @ TheJimO1, j'ai pu faire ce travail d'une manière différente avec cette dernière version more official package soutien de Three.js et de travailler avec trois obj-chargeur. Je viens de l'importation est la suivante:

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

Eh bien cela signifie qu'il ya au moins deux solutions de travail différentes:

[A] utiliser paquet unique NPM mentionné précédemment par JordanDelcros qui soutient R77 avec tous les addons inclus;

[B] utiliser plus de trois paquet officiel mentionné ci-dessus en combinaison avec trois obj-chargeur (mentionné à la question d'origine) les paquets qui prennent en charge R85

+0

En passant, voici le paquet que vous Vraiment envie: https://www.npmjs.com/package/three Celui que vous mentionnez ici est le même que celui que j'ai suggéré, mais est déconseillé en faveur de la source officielle. – TheJim01

+0

Hé, c'est super! Super-déroutant mais aussi super malin ... celui-ci que vous avez posté supporte toutes les fonctionnalités récentes, mais qui nécessite un objloader externe ... fonctionne très bien avec trois-obj-loader ... Merci !!! – Kristievnee