Я попытался установить все необходимые функции в один класс, чтобы создать простую сцену 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)
Вы пытались сделать свою камеру _lookAt_ правильной позиции? В настоящее время вы перемещаете его на ось z, и я думаю, что это может заглянуть в пустоту дальше по оси z. Попробуйте 'test.camera.lookAt (mesh.position)' или 'test.camera.lookAt (test.scene.position)'. Что-то, что я узнал с течением времени, однако, заключается в том, что на самом деле это не так, как вы собираетесь использовать это. Обертывание рендеринга и т. Д. Внутри класса вы теряете большую гибкость. Код не предназначен для использования таким образом, и его проще, если вы используете глобальные объявления (каждый рендеринг использует память!) – somethinghere
Спасибо за ответ, но он не сработал! Причина, по которой я помещаю его в класс, заключается в том, что я создам небольшую библиотеку, которая будет состоять из нескольких файлов javascript, представляющих различные диаграммы. И при таком подходе я могу сделать этот код многоразовым => чистым кодом! – Bajro
Более чистый код! == Лучший код! (Я говорю это в основном из-за того, насколько интеллект памяти этот материал может быть, поэтому иметь _one_ renderer лучше, чем иметь два. Вы можете разделить их с помощью сцен ... но потом мы вернемся к использованию vanilla threeJS, как и предполагалось). Что касается вашей проблемы, сначала я бы проверил, вообще ли ее рендеринг. Просто добавьте гигантскую сферу каркаса в свою основную сцену и посмотрите, появится ли она. После этого поместите несколько разных цветных кубов в разные стороны и узнайте, что вы видите и т. Д. Это займет некоторое время, но это поможет вам разобраться в этом. – somethinghere