2016-11-22 4 views
0

Я попытался установить все необходимые функции в один класс, чтобы создать простую сцену three.js с кубом. Я не получаю никаких ошибок, но сцена остается черной, когда я открываю ее в браузере. Вот мой код:Три js в классе

class SceneInit { 

    constructor(fov = 45,camera,scene,controls,renderer) 
    { 
     this.camera = camera; 
     this.scene = scene; 
     this.controls = controls; 
     this.renderer = renderer; 
     this.fov = fov; 

    } 



    initScene() { 
     this.camera = new THREE.PerspectiveCamera(this.fov, window.innerWidth/window.innerHeight, 1, 1000); 
     this.camera.position.z = 15; 

     this.controls = new THREE.TrackballControls(this.camera); 
     //this.controls.addEventListener('change', this.renderScene); 

     this.scene = new THREE.Scene(); 

     //specify a canvas which is already created in the HTML file and tagged by an id  //aliasing enabled 
     this.renderer = new THREE.WebGLRenderer({canvas: document.getElementById('myThreeJsCanvas') , antialias: true}); 
     this.renderer.setSize(window.innerWidth, window.innerHeight); 
     document.body.appendChild(this.renderer.domElement); 


     //ambient light which is for the whole scene 
     let ambientLight = new THREE.AmbientLight(0xffffff, 0.7); 
     ambientLight.castShadow = false; 
     this.scene.add(ambientLight); 

     //spot light which is illuminating the chart directly 
     let spotLight = new THREE.SpotLight(0xffffff, 0.55); 
     spotLight.castShadow = true; 
     spotLight.position.set(0,40,10); 
     this.scene.add(spotLight); 


     //if window resizes 
     window.addEventListener('resize', this.onWindowResize, false); 
    } 


    animate(){ 
     requestAnimationFrame(this.animate.bind(this)); 
     this.render(); 
     this.controls.update(); 
    } 


    render(){ 
     this.renderer.render(this.scene, this.camera); 
    } 


    onWindowResize() { 
    this.camera.aspect = window.innerWidth/window.innerHeight; 
    this.camera.updateProjectionMatrix(); 
    this.renderer.setSize(window.innerWidth, window.innerHeight); 
} 

} 

И тогда я пытаюсь создать экземпляр нового объекта и добавить объект в сцену. Когда я пытаюсь напечатать детей сцены, он возвращает мне нужные объекты, но, как я уже говорил, сцена остается черной. В обозревателе создается только окно рендеринга.

let test = new SceneInit(45); 
test.initScene(); 
test.animate(); 


let geometry = new THREE.BoxBufferGeometry(200, 200, 200); 
let material = new THREE.MeshBasicMaterial(); 
let mesh = new THREE.Mesh(geometry, material); 

test.scene.add(mesh); 
console.log(test.scene.children); //returns 3 objects (ambientLight, spotLight, mesh) 
+0

Вы пытались сделать свою камеру _lookAt_ правильной позиции? В настоящее время вы перемещаете его на ось z, и я думаю, что это может заглянуть в пустоту дальше по оси z. Попробуйте 'test.camera.lookAt (mesh.position)' или 'test.camera.lookAt (test.scene.position)'. Что-то, что я узнал с течением времени, однако, заключается в том, что на самом деле это не так, как вы собираетесь использовать это. Обертывание рендеринга и т. Д. Внутри класса вы теряете большую гибкость. Код не предназначен для использования таким образом, и его проще, если вы используете глобальные объявления (каждый рендеринг использует память!) – somethinghere

+0

Спасибо за ответ, но он не сработал! Причина, по которой я помещаю его в класс, заключается в том, что я создам небольшую библиотеку, которая будет состоять из нескольких файлов javascript, представляющих различные диаграммы. И при таком подходе я могу сделать этот код многоразовым => чистым кодом! – Bajro

+0

Более чистый код! == Лучший код! (Я говорю это в основном из-за того, насколько интеллект памяти этот материал может быть, поэтому иметь _one_ renderer лучше, чем иметь два. Вы можете разделить их с помощью сцен ... но потом мы вернемся к использованию vanilla threeJS, как и предполагалось). Что касается вашей проблемы, сначала я бы проверил, вообще ли ее рендеринг. Просто добавьте гигантскую сферу каркаса в свою основную сцену и посмотрите, появится ли она. После этого поместите несколько разных цветных кубов в разные стороны и узнайте, что вы видите и т. Д. Это займет некоторое время, но это поможет вам разобраться в этом. – somethinghere

ответ

1

У меня есть ответ.

Проблема в коде заключалась в том, что BoxGeometry была слишком большой, и камера находилась внутри коробки. С установкой отсечения до 1 он даже не отобразил бы ее. Таким образом, решение состоит в том, чтобы установить меньшую BoxGeometry. или отодвинуть камеру!

+1

Решения на самом деле не устанавливают меньшую коробку, чтобы переместить ящик _away_ с камеры. Три.js, по умолчанию, будет показывать только лица, которые вы смотрите спереди (например, лица, где вершины, из которых он состоит, находятся против часовой стрелки в соответствии с положением камеры) – somethinghere

+0

Отредактирован ответ! – Bajro