БлогNot. Простой пример для THREE.js

Простой пример для THREE.js

На самом деле, на сайте фреймворка есть куча документации и примеров, но "одной строчкой" с этой достаточно сложной JS-библиотекой работать не начнёшь, поэтому вот мини-приложение. Вторая причина - в инете много кода, уже не работающего с современными версиями библиотеки, где нет простой Geometry и многого другого.

Проще легендарной заставки "Сквозь Вселенную" (Flying Through Space) из старых версий Windows (и файл-менеджеров!) как-то ничего в голову не пришло, так что почти по её образцу.

Комментарии есть в тексте, предполагается, что листинг сохранён как файл .html в кодировке Юникода UTF-8.

 Открыть FlyingThroughSpace.html в текущем окне/вкладке (3 Кб)

Последовательное нажатие клавиш F11 и F5 позволяет запустить пример во весь экран. Фреймворк подключается с внешнего сайта. Полный листинг файла:

<!DOCTYPE html>
<html lang="ru">
 <head>
  <meta charset="UTF-8">
  <title>Flying Through Space</title>
  <style>
   * {
    margin: 0;
    padding: 0;
   }
   html { 
    overflow: hidden; 
   }
  </style>
 </head>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r102/three.min.js"></script>
 <body>

<script>
 let camera, scene, renderer, stars=[];
  
 function init() {
  //Камера:
  camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
  camera.position.z = 45;  
  //Сцена:
  scene = new THREE.Scene();
  //Bизуализатор:
  renderer = new THREE.WebGLRenderer();
  renderer.setSize (window.innerWidth, window.innerHeight);
  document.body.appendChild( renderer.domElement );
 }

 let DIAP = 1000; //Диапазон позиционирования
 let LOW = -DIAP, HI = DIAP, STEP = 10; //Границы позиционирования

 function addSphere(){
  for ( var z= LOW; z < HI; z+=STEP) { //Будет 2*DIAP/STEP звёзд
   let geometry   = new THREE.SphereGeometry(0.5, 32, 32); //радиус, кол-во сегментов
   let color = new THREE.Color( 0xffffff );
   color.setHex( 8388607 + Math.random() * 8388608 ); //Не-тёмные цвета с яркостями компонент более 50%
   let material = new THREE.MeshBasicMaterial( {color: color} );
   let sphere = new THREE.Mesh(geometry, material);
   sphere.position.x = Math.random() * DIAP - DIAP/2;
   sphere.position.y = Math.random() * DIAP - DIAP/2;
   sphere.position.z = z; //позиция соответствует расстоянию до камеры
   sphere.scale.x = sphere.scale.y = 1.5; //немного увеличим
   scene.add (sphere); //добавим к сцене
   stars.push(sphere); //положим в массив звёзд
  }
 }

 function animateStars() { 
  for(var i=0; i<stars.length; i++) {
   let star = stars[i]; 
   star.position.z +=  i/10; //сдвиг вперед, чем больше знаменатель, тем ниже видимая скорость
   if(star.position.z > HI) star.position.z -= (HI-LOW); //если слишком близко - назад
  }
 }

 function render() {
  requestAnimationFrame (render);
  renderer.render( scene, camera );
  animateStars();
 }
 
 init();
 addSphere();
 //console.log(stars.length);
 render();
</script>
<noscript>
 <p>Включите в браузере Javascript для работы приложения</p>
</noscript>

</body></html>

Конечно, нетрудно было сделать подобное и, например, на p5.js.

29.05.2022, 15:28 [586 просмотров]


теги: учебное javascript графика

К этой статье пока нет комментариев, Ваш будет первым