Guest User

Untitled

a guest
Jun 27th, 2024
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 5 5.86 KB | Gaming | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>3D Starfield Explorer with Rainbow Stars, UFOs, and Planets</title>
  7.     <style>
  8.         body { margin: 0; overflow: hidden; }
  9.         canvas { display: block; }
  10.     </style>
  11. </head>
  12. <body>
  13.     <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
  14.     <script>
  15.         let scene, camera, renderer, stars, ufos = [], planets = [];
  16.         let moveSpeed = 0.1;
  17.         let rotateSpeed = 0.02;
  18.  
  19.         const init = () => {
  20.             scene = new THREE.Scene();
  21.             camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  22.             renderer = new THREE.WebGLRenderer();
  23.             renderer.setSize(window.innerWidth, window.innerHeight);
  24.             document.body.appendChild(renderer.domElement);
  25.  
  26.             createRainbowStars();
  27.             createUFOs(5);
  28.             createPlanets(3);
  29.  
  30.             camera.position.z = 5;
  31.  
  32.             animate();
  33.         };
  34.  
  35.         const createRainbowStars = () => {
  36.             const geometry = new THREE.BufferGeometry();
  37.             const vertices = [];
  38.             const colors = [];
  39.  
  40.             for (let i = 0; i < 10000; i++) {
  41.                vertices.push(
  42.                    Math.random() * 600 - 300,
  43.                    Math.random() * 600 - 300,
  44.                    Math.random() * 600 - 300
  45.                );
  46.  
  47.                colors.push(Math.random(), Math.random(), Math.random());
  48.            }
  49.  
  50.            geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
  51.            geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));
  52.  
  53.            const material = new THREE.PointsMaterial({
  54.                size: 0.5,
  55.                vertexColors: true
  56.            });
  57.  
  58.            stars = new THREE.Points(geometry, material);
  59.            scene.add(stars);
  60.        };
  61.  
  62.        const createUFOs = (count) => {
  63.             const geometry = new THREE.ConeGeometry(1, 0.5, 32);
  64.             const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
  65.  
  66.             for (let i = 0; i < count; i++) {
  67.                const ufo = new THREE.Mesh(geometry, material);
  68.                ufo.position.set(
  69.                    Math.random() * 100 - 50,
  70.                    Math.random() * 100 - 50,
  71.                    Math.random() * 100 - 50
  72.                );
  73.                ufo.rotation.x = Math.PI; // Flip the cone upside down
  74.                scene.add(ufo);
  75.                ufos.push({
  76.                    mesh: ufo,
  77.                    speed: Math.random() * 0.1 + 0.05,
  78.                    direction: new THREE.Vector3(
  79.                        Math.random() - 0.5,
  80.                        Math.random() - 0.5,
  81.                        Math.random() - 0.5
  82.                    ).normalize()
  83.                });
  84.            }
  85.        };
  86.  
  87.        const createPlanets = (count) => {
  88.             for (let i = 0; i < count; i++) {
  89.                const geometry = new THREE.SphereGeometry(Math.random() * 5 + 2, 32, 32);
  90.                const material = new THREE.MeshBasicMaterial({
  91.                    color: Math.random() * 0xffffff
  92.                });
  93.                const planet = new THREE.Mesh(geometry, material);
  94.                planet.position.set(
  95.                    Math.random() * 200 - 100,
  96.                    Math.random() * 200 - 100,
  97.                    Math.random() * 200 - 100
  98.                );
  99.                scene.add(planet);
  100.                planets.push(planet);
  101.            }
  102.        };
  103.  
  104.        const animate = () => {
  105.             requestAnimationFrame(animate);
  106.  
  107.             // Animate UFOs
  108.             ufos.forEach(ufo => {
  109.                 ufo.mesh.position.add(ufo.direction.clone().multiplyScalar(ufo.speed));
  110.  
  111.                 // Bounce off imaginary boundaries
  112.                 ['x', 'y', 'z'].forEach(axis => {
  113.                     if (Math.abs(ufo.mesh.position[axis]) > 100) {
  114.                         ufo.direction[axis] *= -1;
  115.                     }
  116.                 });
  117.  
  118.                 ufo.mesh.rotation.y += 0.01; // Rotate the UFO
  119.             });
  120.  
  121.             // Rotate planets
  122.             planets.forEach(planet => {
  123.                 planet.rotation.y += 0.005;
  124.             });
  125.  
  126.             renderer.render(scene, camera);
  127.         };
  128.  
  129.         const onKeyDown = (event) => {
  130.             switch (event.key) {
  131.                 case 'ArrowUp':
  132.                 case 'w':
  133.                     camera.position.z -= moveSpeed;
  134.                     break;
  135.                 case 'ArrowDown':
  136.                 case 's':
  137.                     camera.position.z += moveSpeed;
  138.                     break;
  139.                 case 'ArrowLeft':
  140.                 case 'a':
  141.                     camera.position.x -= moveSpeed;
  142.                     break;
  143.                 case 'ArrowRight':
  144.                 case 'd':
  145.                     camera.position.x += moveSpeed;
  146.                     break;
  147.                 case 'q':
  148.                     camera.rotation.y += rotateSpeed;
  149.                     break;
  150.                 case 'e':
  151.                     camera.rotation.y -= rotateSpeed;
  152.                     break;
  153.                 case 'r':
  154.                     camera.position.y += moveSpeed;
  155.                     break;
  156.                 case 'f':
  157.                     camera.position.y -= moveSpeed;
  158.                     break;
  159.             }
  160.         };
  161.  
  162.         window.addEventListener('keydown', onKeyDown);
  163.         window.addEventListener('resize', () => {
  164.             camera.aspect = window.innerWidth / window.innerHeight;
  165.             camera.updateProjectionMatrix();
  166.             renderer.setSize(window.innerWidth, window.innerHeight);
  167.         });
  168.  
  169.         init();
  170.     </script>
  171. </body>
  172. </html>
Advertisement
Add Comment
Please, Sign In to add comment