OrbitControls не является конструктором

Я пытался создать среду WebVR уже более недели, моя сцена визуализируется в трех js, но я не могу заставить работать элементы управления VR.

Я пробовал:

Добавление пакетов в мои node_modules и их импорт:

import threeOrbitControls from 'three-orbit-controls';
const OrbitControls = threeOrbitControls(THREE);
const controls = new THREE.OrbitControls(camera, element);

Но это выдает ошибку:

Uncaught TypeError: __WEBPACK_IMPORTED_MODULE_1_three__.OrbitControls is not a constructor(…)

Некоторые другие модули, которые я пытался импортировать, говорили, что ТРИ не определены в модуле, потому что функция начиналась с THREE., но я не могу войти в этот модуль и просто импортировать ТРИ, потому что, если кто-то еще запустит npm install, он все равно получит ту же ошибку.

Я попытался добавить скрипты (и загружаемый исходный код) в свой index.html, но и там ТРИ были неопределенными...

У меня нет догадок. Я подумал, что это из-за веб-пакета, и искал репозиторий веб-пакетов WebVR, чтобы посмотреть, как этот человек справился с этим. Я нашел этот репозиторий, но при установке пакетов и запуске webpack он сказал, что WebVRManager не конструктор. Я, честно говоря, не знаю, что здесь происходит.

Это (довольно запутанный) код, который я использую для запуска своего проекта.

import {sets} from './data/';

import * as THREE from 'three';
import threeOrbitControls from 'three-orbit-controls';
import ColladaLoader from 'three-collada-loader';
// import 'three-vrcontrols';
// import 'three-vreffect';
import threeStereoEffect from 'three-stereo-effect';

// import FirstPersonControls from 'three-first-person-controls';

// import DeviceOrientationControls from './modules/util/DeviceOrientationControls';

import webvrPolyfill from 'webvr-polyfill'; // eslint-disable-line no-unused-vars

// console.log(DeviceOrientationControls);

import io from 'socket.io-client';
import {isEmpty} from 'lodash';

import {BufferLoader} from './modules/sound';
import {SpawnObject} from './modules/render';
import {Controls} from './modules/util';

const OrbitControls = threeOrbitControls(THREE);
const StereoEffect = threeStereoEffect(THREE);

// const VRControls = new THREE.VRControls(camera);
// const VREffect = new THREE.VREffect();

let scene, camera, renderer, element, container, stereoEffect, vreffect, controls;
let audioCtx, bufferLoader;

let controlData;

let camX = 0;
const camY = 0;
let camZ = 2;

const camSpeed = .1;

const notes = [];
let devices = [];

const init = () => {

  this.socket = io(`/`);

  this.socket.on(`init`, handleWSInit);
  this.socket.on(`dataTransfer`, handleWSData);

  window.AudioContext = window.AudioContext || window.webkitAudioContext;

};

const handleWSInit = users => {
  const {id: socketId} = this.socket;

  users = users.map(u => {
    if (u.socketId === socketId) u.isMe = true;
    return u;
  });

  devices = users;

  if (window.location.href.indexOf(`controls`) > - 1) {
    const controls = new Controls(this.socket, devices);
    console.log(controls);
    return;
  }

  document.querySelector(`main`).classList.remove(`controls`);

  loadAudio();

};

const loadAudio = () => {
  audioCtx = new AudioContext();
  bufferLoader = new BufferLoader(audioCtx);

  bufferLoader.load(sets.drums)
    .then(data => spawnObject(data));

  initEnvironment();
};

const handleWSData = data => {
  if (data !== undefined || data !== null || isEmpty(data)) controlData = data;

  devices = devices.map(u => {
    u.yo = false;
    return u;
  });

};

const spawnObject = data => {

  for (let i = 0;i < 5;i ++) {
    const bol = new SpawnObject(`object.dae`, audioCtx, data[0], scene, false);
    notes.push(bol);
  }

  // console.log(notes);
};

const initEnvironment = () => {

  //Three.js Scene
  scene = new THREE.Scene();


  //Create renderer, set size + append to the container
  renderer = new THREE.WebGLRenderer();
  renderer.setSize(window.innerWidth, window.innerHeight);
  element = renderer.domElement;
  container = document.querySelector(`main`);
  container.appendChild(element);


  //Create camera, set position + add to scene
  camera = new THREE.PerspectiveCamera(
    45, window.innerWidth / window.innerHeight,
    1, 10000
  );
  camera.position.set(0, 0, 2);
  camera.lookAt(scene.position);


  //VR Controls
  // temporaryControls = new VRControls(camera);

  // vreffect = new VREffect(renderer);
  // vreffect.setSize(window.innerWidth, window.innerHeight);
  //
  // navigator.getVRDisplays().then(displays => {
  //   if (displays.length > 0) {
  //     const vrDisplay = displays[0];
  //     console.log(`jipse`);
  //   }
  //   //Kick off the render loop
  // });




      //Creates stereo effect
  stereoEffect = new StereoEffect(renderer);
  // stereoEffect.eyeSeparation = 15;
  // stereoEffect.setSize(window.innerWidth, window.innerHeight);

  console.log(stereoEffect);

  //Controls
  // new OrbitControls(camera);
  controls = new THREE.OrbitControls(camera, element);
  // camera.position.x = 100;
  // camera.position.y = 1000;
  // camera.position.z = 3000;


  //LIGHTS
  const light = new THREE.PointLight(0xFFFFFF);
  light.position.set(0, 0, 9);
  light.castShadow = true;
  light.shadow.mapSize.width = 1024;
  light.shadow.mapSize.height = 1024;
  light.shadow.camera.near = 10;
  light.shadow.camera.far = 100;
  scene.add(light);

  //FLOOR
  const matFloor = new THREE.MeshPhongMaterial();
  const geoFloor = new THREE.BoxGeometry(2000, 1, 2000);
  const mshFloor = new THREE.Mesh(geoFloor, matFloor);

  matFloor.color.set(0x212E39);
  mshFloor.receiveShadow = true;
  mshFloor.position.set(0, - 1, 0);

  scene.add(mshFloor);


  //ENVIRONMENT
  const loader = new ColladaLoader();

  loader.load(`../assets/environment.dae`, collada => {
    collada.scene.traverse(child => {
      child.castShadow = true;
      child.receiveShadow = true;
    });

    scene.add(collada.scene);
    render();
  });

};


// function setOrientationControls(e) {
//   if (!e.alpha) {
//     return;
//   }
//   controls = new THREE.DeviceOrientationControls(camera, true);
//   controls.connect();
//   controls.update();
//   element.addEventListener(`click`, fullscreen, false);
//   window.removeEventListener(`deviceorientation`, setOrientationControls, true);
// }
// window.addEventListener(`deviceorientation`, setOrientationControls, true);

const moveCamera = () => {
  notes.forEach(i => {
    i.audioCtx.listener.positionX.value = camX + window.innerWidth / 2;
    i.audioCtx.listener.positionZ.value = camZ + 300;
    i.audioCtx.listener.positionY.value = camY + window.innerHeight / 2;
  });

  switch (controlData) {
  case `up`:
    camZ -= camSpeed;
    break;
  case `down`:
    camZ += camSpeed;
    break;
  case `left`:
    camX -= camSpeed;
    break;
  case `right`:
    camX += camSpeed;
    break;
  }

  camera.position.set(camX, camY, camZ);
};

const render = () => {

  moveCamera();
  renderer.shadowMap.enabled = true;
  renderer.shadowMap.type = THREE.PCFSoftShadowMap;

  renderer.gammaInput = true;
  renderer.gammaOutput = true;

  renderer.setClearColor(0xdddddd, 1);
  stereoEffect.render(scene, camera);

  requestAnimationFrame(render);
};

// const fullscreen = () => {
//   if (container.requestFullscreen) {
//     container.requestFullscreen();
//   } else if (container.msRequestFullscreen) {
//     container.msRequestFullscreen();
//   } else if (container.mozRequestFullScreen) {
//     container.mozRequestFullScreen();
//   } else if (container.webkitRequestFullscreen) {
//     container.webkitRequestFullscreen();
//   }
// };

init();

person Kevin    schedule 14.12.2016    source источник


Ответы (2)


Я скачал исходный код, потребовал его, выполнив require(./OrbitControls.js) и добавив module.exports = THREE.OrbitControls в исходный код.

person Kevin    schedule 15.12.2016
comment
Не могли бы вы дать нам более подробную информацию о том, как решить эту проблему? Под я скачал исходный код, какие источники вы имеете в виду? три, три-орбиты-управления? А как насчет require(./OrbitControls.js) и module.exports = THREE.OrbitControls? Куда вы добавили эти две строчки? - person Salaros; 03.11.2017

Пожалуйста, попробуйте импортировать элементы управления с тремя орбитами таким образом:

const OrbitControls = require( 'three-orbit-controls' )( THREE );

Он должен работать. Я столкнулся с той же проблемой, что и вы, и решение выше сработало. Кажется, что-то не так с решением для экспорта модуля управления тремя орбитами.

person eslotwinski    schedule 14.12.2016
comment
Я попробовал это с другим пакетом, но он по-прежнему говорит, что ТРИ не определены... Я изменил свой импорт const VREffect = require(`three-vreffect`)(THREE);, но он по-прежнему говорит, что ТРИ не определены - puu.sh/sOGTm/16aa79d881.png - person Kevin; 14.12.2016
comment
хм, вы пробовали импортировать три без *? (импортировать ТРИ из "трех";) - person eslotwinski; 14.12.2016
comment
Я сделал: import THREE from 'three'; console.log(THREE);, но THREE тогда не определено. - person Kevin; 14.12.2016
comment
Я создал суть, которая должна решить ваши проблемы, читайте комментарии к коду. Я не тестировал это, но это должно работать. Короче говоря, вы должны включить свой three-vreffect следующим образом: VReffect(рендерер); вот три примера js, которые вы также должны изучить: github. com/mrdoob/three.js/blob/ дайте мне знать, если это поможет - person eslotwinski; 14.12.2016
comment
gist.github.com/lanskey/7f55a0ac92287e8395e92aa9cffa9b22 — суть, о которой я упоминал выше - person eslotwinski; 14.12.2016
comment
Всякий раз, когда я просто добавляю строку require('three-vreffect'), я получаю сообщение об ошибке, что THREE не определено в ней... puu.sh/sPeAJ/10c7de13e0.png - person Kevin; 14.12.2016