Почему все частицы расположены в центре по оси x в THREE.JS

#javascript #html #css #three.js

#язык JavaScript #HTML #CSS #three.js

Вопрос:

Я новичок в ТРЕХ.Мы с JS пытаемся понять, как создать систему частиц, и я не могу заставить ее работать должным образом. Поскольку в названии говорится, что все частицы расположены в центре по оси X, кажется, что Y и Z в порядке.

Изображение результата: https://i.stack.imgur.com/xUuAn.png Чего я хочу достичь: https://i.stack.imgur.com/vA0tL.jpg

Код:

 const scene = new THREE.Scene();   const camera = new THREE.PerspectiveCamera(  75,  window.innerWidth - 10 / window.innerHeight,  1,  1000  );   camera.position.z = 300;   const ambientLight = new THREE.AmbientLight(  0xFFFFFF  );   const particleBufferGeometry = new THREE.BufferGeometry();  const positionArray = [];   for (let i = 0; i lt; 10000; i  ) {  positionArray.push((Math.random() * 2 - 1) * 200);  positionArray.push((Math.random() * 2 - 1) * 200);  positionArray.push((Math.random() * 2 - 1) * 200);  }   particleBufferGeometry.setAttribute("position", new THREE.Float32BufferAttribute(positionArray, 3));   const particlePointsMaterial = new THREE.PointsMaterial({  size: 0.1  });   const particlePoints = new THREE.Points(particleBufferGeometry, particlePointsMaterial);   const renderer = new THREE.WebGLRenderer({  antialias: true,  alpha: true,  canvas: canvasRef.current!  });   renderer.setPixelRatio(window.devicePixelRatio);  renderer.setClearColor(0xFFFFFF, 0);  renderer.setSize(  window.innerWidth - 10,  window.innerHeight  );   scene.add(ambientLight, particlePoints);    renderer.render(scene, camera);  

Ответ №1:

Ошибка возникает при инициализации камеры. Ваше соотношение сторон равно

window.innerWidth - 10 / window.innerHeight

Пример: 1920 - 10 / 1080 = 1919.99 (неправильное соотношение сторон)

но из-за порядка операций сначала вычисляется деление, поэтому это 10 / height происходит до вычитания. Просто убедитесь, что вы правильно используете круглые скобки, и проблема будет решена:

(window.innerWidth - 10) / window.innerHeight

Пример: (1920 - 10) / 1080 = 1.76 (Правильное соотношение сторон)

 const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(  45,  (window.innerWidth - 10) / window.innerHeight,  1,  1000 ); camera.position.z = 300;  const particleBufferGeometry = new THREE.BufferGeometry(); const positionArray = [];  for (let i = 0; i lt; 10000; i  ) {  positionArray.push((Math.random() * 2 - 1) * 200);  positionArray.push((Math.random() * 2 - 1) * 200);  positionArray.push((Math.random() * 2 - 1) * 200); }  particleBufferGeometry.setAttribute("position", new THREE.Float32BufferAttribute(positionArray, 3));  const particlePointsMaterial = new THREE.PointsMaterial({  size: 0.1 });  const particlePoints = new THREE.Points(particleBufferGeometry, particlePointsMaterial);  const canvasRef = document.querySelector("#canvas");  const renderer = new THREE.WebGLRenderer({  antialias: true,  canvas: canvasRef });  renderer.setSize(window.innerWidth - 10, window.innerHeight);  scene.add(particlePoints);  function animate() {  particlePoints.rotation.y  = 0.01;  renderer.render(scene, camera);   requestAnimationFrame(animate); }  animate(); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r126/three.min.js"gt;lt;/scriptgt;  lt;canvas id="canvas"gt;lt;/canvasgt; 

Комментарии:

1. Боже, большое тебе спасибо, какая глупая ошибка, хе-хе