2016-11-10 43 views
5

Próbuję użyć przykładu 3js wewnątrz mojej aplikacji kątowej (cli) 2.Angular2 przy użyciu trojaka Orbitcontrols

więc mam zainstalowane threejs:

npm install three --save 

następnie dodawane typowania:

npm install @types/three --save-dev 

Wreszcie mój komponent wygląda następująco:

import { Component, OnInit } from '@angular/core'; 
import * as THREE from 'three'; 

@Component({ 
    selector: 'app-testthreejs', 
    templateUrl: './testthreejs.component.html', 
    styleUrls: ['./testthreejs.component.css'] 
}) 
export class TestthreejsComponent implements OnInit { 
// 
} 

Z tego mogę korzystać z niektórych funkcji z TRZY bez problemu.

Chciałbym skorzystać z niektórych przykładów dostępnych w module node_modules/three/examples/js /, a dokładniej OrbitControl. Do typowania dać mi autouzupełnianie w Visual kodu Studio: vscode

ale jak tylko próbowałem go używać Mam następujący błąd:

TypeError: WEBPACK_IMPORTED_MODULE_1_three.OrbitControls is not a constructor

Czy istnieje jakiś sposób, aby udostępnić OrbitControls (i inne przykłady) poprzez jakiś import? Czy powinienem po prostu dołączyć control.js do mojego html?

Jaki jest najlepszy sposób, aby sobie z tym poradzić?

+0

IMO, Grunt (lub cokolwiek) twój własny plik three.min.js, który zawiera dodatki, które będziesz potrzebował, takie jak formanty, ładowanie pliku obj lub cokolwiek, zamiast instalowania NPM. Możesz dołączyć dodatki/pomocników w znacznikach skryptu, ale to koszmar utrzymania. Wykonaj to, co ma sens dla twojego projektu, nie ma dokumentacji ani konkretnego sposobu dodawania dodatków i pomocników do pliku three.js. – Radio

Odpowiedz

4

koniec znalazł rozwiązanie:

1- Instalacja OrbitControls poprzez NPM:

npm install three-orbit-controls --save 

2- importu trzy i OrbitControls w składniku:

import * as THREE from 'three'; 
var OrbitControls = require('three-orbit-controls')(THREE) 

można następnie wykonać

this.controls = new OrbitControls(this.camera,this.renderer.domElement); 
+0

Grunk, możesz mi pomóc tutaj? Próbowałem Twojego rozwiązania w środowisku Angular-cli, a po uruchomieniu kodu wystąpił błąd: "Nie można znaleźć nazwy" wymagającej pojawia się ire. To doprowadza mnie do szału. czy Twoje rozwiązanie wciąż działa dla Ciebie? – Dino

+0

@Dino Tak nadal działa (zaktualizowany do kątowego 4). Możesz znaleźć mój przykładowy komponent tutaj: https://pastebin.com/uG0fvs8n (po prostu zignoruj ​​część usługi API) – grunk

+0

Grunk, jesteś prawdziwą gwiazdą! Dziękuję, twój kod pomógł mi ulepszyć moje :) Czy mogę być niegrzeczny i poświęcić trochę czasu na zadawanie kolejnego pytania o bibliotekę Three JS i kątową? Czy wiesz, jak zaimportować i użyć PLYLoader.js. Jest to nienadzorowana biblioteka js dla TRZECH, więc nie mogę użyć programu plyloader npm install - zapisz go w kanciastym 2. Jeszcze raz dziękuję za pomoc. Dino – Dino

3

Spróbuj pakiet zastosowanie alternatywa https://www.npmjs.com/package/three-orbitcontrols-ts

1. Zainstaluj pakiet

npm install --save three-orbitcontrols-ts 

2. Zastosowanie w pliku

import * as THREE from 'three'; 
import { OrbitControls } from 'three-orbitcontrols-ts'; 

const controls = new OrbitControls(camera, renderer.domElement); 
1

jak niewielu z was doświadcza mój sam problem mam opublikował to jako odpowiedź, aby było bardziej widoczne.

Rozwiązanie wyżej prac, ale może pojawić się następujący błąd:

'Cannot find name 'require'

Jeśli jest to przypadek dodać linię zaproponowaną przez Grunk:

declare const require: (moduleId: string) => any; 

przed deklaracją:

var OrbitControls = require('three-orbit-controls')(THREE) 
2

Zobacz przykład użycia Angular + Three.js w tym OrbitControls i ColladaLoader: https://github.com/makimenko/angular-three-examples

Obecnie przykłady Three.js nie są uwzględniane w module i używanie ich w kodzie Angara może być nieco trudne. Szczególnie, jeśli nie chcesz instalować dodatkowych zależności od stron trzecich. Jednym z roztworu/obejście może być:

pierwsze obejmują zależności:

three 
@types/three 

drugie importu w składniku:

import * as THREE from 'three'; 
import "./js/EnableThreeExamples"; 
import "three/examples/js/controls/OrbitControls"; 
import "three/examples/js/loaders/ColladaLoader"; 

następnie wykorzystać w kodzie:

this.controls = new THREE.OrbitControls(this.camera); 
this.controls.rotateSpeed = 1.0; 
this.controls.zoomSpeed = 1.2; 
this.controls.addEventListener('change', this.render); 

Mam nadzieję, że to pomoże Ci rozpocząć

+0

Działa to podczas działania w 'ng serve', jednak przy uruchomieniu' ng build --prod' otrzymuję polecenie "export" OrbitControls (zaimportowane jako "TRZY") nie zostało znalezione w 'three'' – ArunDhaJ

+0

Komunikat ostrzegawczy będzie widoczny do momentu, aż "threejs/examples/js" nie zostanie przekształcone w obsługę modułów (zobacz threejs [# 9562] (https://github.com/mrdoob/three.js/issues/9562)). Po prostu zignoruj ​​komunikat ostrzegawczy (ng build --prod powinien utworzyć dla ciebie niezbędny i w pełni działający kod w folderze dist). –