From cd8aab3a511091ce378ff7ebcaa42bf979f00882 Mon Sep 17 00:00:00 2001 From: LofiSu Date: Sun, 26 Jan 2025 22:34:40 +0800 Subject: refactor: rewrite --- src/app/components/ThreeBackground.tsx | 79 ++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/app/components/ThreeBackground.tsx (limited to 'src/app/components/ThreeBackground.tsx') diff --git a/src/app/components/ThreeBackground.tsx b/src/app/components/ThreeBackground.tsx new file mode 100644 index 0000000..5040e3c --- /dev/null +++ b/src/app/components/ThreeBackground.tsx @@ -0,0 +1,79 @@ +"use client"; + +import React, { useEffect, useRef } from "react"; +import * as THREE from "three"; + +export const ThreeBackground: React.FC = () => { + const containerRef = useRef(null); + + useEffect(() => { + if (!containerRef.current) return; + + const scene = new THREE.Scene(); + const camera = new THREE.PerspectiveCamera( + 75, + window.innerWidth / window.innerHeight, + 0.1, + 1000 + ); + const renderer = new THREE.WebGLRenderer({ alpha: true }); + + renderer.setSize(window.innerWidth, window.innerHeight); + containerRef.current.appendChild(renderer.domElement); + + // Create particles + const geometry = new THREE.BufferGeometry(); + const vertices = []; + + for (let i = 0; i < 5000; i++) { + vertices.push( + THREE.MathUtils.randFloatSpread(2000), // x + THREE.MathUtils.randFloatSpread(2000), // y + THREE.MathUtils.randFloatSpread(2000) // z + ); + } + + geometry.setAttribute( + "position", + new THREE.Float32BufferAttribute(vertices, 3) + ); + + const material = new THREE.PointsMaterial({ + color: 0x88ccff, + size: 2, + transparent: true, + opacity: 0.5, + }); + + const particles = new THREE.Points(geometry, material); + scene.add(particles); + + camera.position.z = 1000; + + const animate = () => { + requestAnimationFrame(animate); + particles.rotation.x += 0.0001; + particles.rotation.y += 0.0001; + renderer.render(scene, camera); + }; + + animate(); + + const handleResize = () => { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); + }; + + window.addEventListener("resize", handleResize); + + return () => { + window.removeEventListener("resize", handleResize); + containerRef.current?.removeChild(renderer.domElement); + }; + }, []); + + return ( +
+ ); +}; -- cgit v1.2.3-70-g09d2