From 9c52c11d9067102c116a763469fd8f691c70cc2c Mon Sep 17 00:00:00 2001 From: sayudhalw Date: Mon, 24 Aug 2026 07:20:55 +0700 Subject: [PATCH] refactor: remove GSAP dependency and update camera controls with OrbitControls --- package.json | 1 - src/index.html | 2 +- src/script.js | 80 +++++++++++++++++++----------------------------- static/door.jpg | Bin 781604 -> 0 bytes 4 files changed, 33 insertions(+), 50 deletions(-) delete mode 100644 static/door.jpg diff --git a/package.json b/package.json index 5cdabd4..779dd82 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "vite-plugin-restart": "^0.4.2" }, "dependencies": { - "gsap": "~3.12.7", "three": "^0.174.0" } } diff --git a/src/index.html b/src/index.html index 04e323b..bd38d4d 100644 --- a/src/index.html +++ b/src/index.html @@ -3,7 +3,7 @@ - Animations + Fullscreen and resizing diff --git a/src/script.js b/src/script.js index 130328d..3e943c4 100644 --- a/src/script.js +++ b/src/script.js @@ -1,84 +1,68 @@ -import './style.css' import * as THREE from 'three' -import { Timer } from 'three/addons/misc/Timer.js' -// import gsap from 'gsap' +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' /** - * Cursor + * Base */ -const cursor = { - x: 0, - y: 0 -} -window.addEventListener('mousemove', (event) => { - cursor.x = event.clientX / sizes.width - 0.5 // -0.5 to center the cursor coordinates - cursor.y = -(event.clientY / sizes.height - 0.5) // Invert the y-coordinate to match the 3D coordinate system - console.log(cursor.x, cursor.y) -}) - // Canvas const canvas = document.querySelector('canvas.webgl') // Scene const scene = new THREE.Scene() -// Object +/** + * Object + */ const geometry = new THREE.BoxGeometry(1, 1, 1) const material = new THREE.MeshBasicMaterial({ color: 0xff0000 }) const mesh = new THREE.Mesh(geometry, material) scene.add(mesh) -// Sizes +/** + * Sizes + */ const sizes = { width: 800, height: 600 } -// Camera +/** + * Camera + */ +// Base camera const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100) -// camera.position.x = 2 -// camera.position.y = 2 camera.position.z = 3 -camera.lookAt(mesh.position) scene.add(camera) -// Renderer +// Controls +const controls = new OrbitControls(camera, canvas) +controls.enableDamping = true + +/** + * Renderer + */ const renderer = new THREE.WebGLRenderer({ canvas: canvas }) renderer.setSize(sizes.width, sizes.height) -// Clock -// const clock = new THREE.Clock() -// gsap.to(mesh.position, { x: 2, duration: 1, delay: 1}) -// gsap.to(mesh.position, { x: 0, duration: 1, delay: 2}) -const timer = new Timer() -timer.connect(document) // Connect the timer to the document to receive updates +/** + * Animate + */ +const clock = new THREE.Clock() +const tick = () => +{ + const elapsedTime = clock.getElapsedTime() -// Animations -const tick = () => { + // Update controls + controls.update() - // // Clock - // const elapsedTime = clock.getElapsedTime() - timer.update() // Update the timer to get the latest elapsed time - const elapsedTime = timer.getElapsed() - - // Update objects - // mesh.rotation.y = elapsedTime * Math.PI * 2 - // mesh.position.y = Math.sin(elapsedTime) - // mesh.position.x = Math.cos(elapsedTime) - // camera.lookAt(mesh.position) - - // Update camera position based on cursor - camera.position.x = Math.sin(cursor.x * Math.PI * 2) * 3 // Move the camera in a circular path around the mesh based on cursor x position - camera.position.z = Math.cos(cursor.x * Math.PI * 2) * 3 // Move the camera in a circular path around the mesh based on cursor x position - camera.position.y = cursor.y * 5 // Move the camera up/down based on cursor y position - camera.lookAt(mesh.position) // Make the camera look at the mesh - - // Renderer + // Render renderer.render(scene, camera) - + + // Call tick again on the next frame window.requestAnimationFrame(tick) } + tick() \ No newline at end of file diff --git a/static/door.jpg b/static/door.jpg deleted file mode 100644 index 614d9cd90f0a16cd7d9f540baa7fbf667956ab92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781604 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