Skip to content

Commit 21f4c09

Browse files
committed
full working demo
0 parents  commit 21f4c09

12 files changed

+509
-0
lines changed

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
node_modules
2+
.DS_Store
3+
dist
4+
dist-ssr
5+
*.local

README.md

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Scrollable 3D Animation with Three.js
2+
3+
- Watch the [full tutorial](https://youtu.be/Q7AOvWpIVHU) on YouTube
4+
- [Scrollable Three.js Animation](https://fireship.io/snippets/threejs-scrollbar-animation) Snippet
5+
6+
## Usage
7+
8+
```
9+
git clone <this-repo>
10+
npm install
11+
npm run dev
12+
```

favicon.svg

+15
Loading

index.html

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<title>Jeff's Website</title>
8+
</head>
9+
<body>
10+
11+
<canvas id="bg"></canvas>
12+
13+
<main>
14+
15+
<header>
16+
<h1>Jeff Delaney</h1>
17+
<p>🚀 Welcome to my website!</p>
18+
</header>
19+
20+
21+
<blockquote>
22+
<p>I like making stuff and putting it on the internet</p>
23+
</blockquote>
24+
25+
<section>
26+
<h2>📜 Manifesto</h2>
27+
<p>
28+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
29+
</p>
30+
31+
<p>
32+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
33+
</p>
34+
35+
<p>
36+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
37+
</p>
38+
39+
</section>
40+
41+
<section class="light">
42+
<h2>👩🏽‍🚀 Projects</h2>
43+
44+
<p>
45+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
46+
</p>
47+
48+
<h2>🏆 Accomplishments</h2>
49+
50+
<p>
51+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
52+
</p>
53+
54+
</section>
55+
56+
<blockquote>
57+
<p>The best way out is always through <br>-Robert Frost</p>
58+
</blockquote>
59+
60+
<section class="left">
61+
<h2>🌮 Work History</h2>
62+
63+
<h3>McDonalds</h3>
64+
<p>
65+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
66+
</p>
67+
<h3>Burger King</h3>
68+
<p>
69+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
70+
</p>
71+
<h3>Taco Bell</h3>
72+
<p>
73+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
74+
</p>
75+
76+
</section>
77+
78+
<blockquote>
79+
<p>Thanks for watching!</p>
80+
</blockquote>
81+
82+
83+
</main>
84+
85+
<script type="module" src="/main.js"></script>
86+
87+
88+
89+
90+
91+
92+
93+
94+
95+
96+
97+
98+
99+
100+
101+
102+
103+
</body>
104+
</html>

jeff.png

175 KB
Loading

main.js

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import './style.css';
2+
import * as THREE from 'three';
3+
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
4+
5+
// Setup
6+
7+
const scene = new THREE.Scene();
8+
9+
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
10+
11+
const renderer = new THREE.WebGLRenderer({
12+
canvas: document.querySelector('#bg'),
13+
});
14+
15+
renderer.setPixelRatio(window.devicePixelRatio);
16+
renderer.setSize(window.innerWidth, window.innerHeight);
17+
camera.position.setZ(30);
18+
camera.position.setX(-3);
19+
20+
renderer.render(scene, camera);
21+
22+
// Torus
23+
24+
const geometry = new THREE.TorusGeometry(10, 3, 16, 100);
25+
const material = new THREE.MeshStandardMaterial({ color: 0xff6347 });
26+
const torus = new THREE.Mesh(geometry, material);
27+
28+
scene.add(torus);
29+
30+
// Lights
31+
32+
const pointLight = new THREE.PointLight(0xffffff);
33+
pointLight.position.set(5, 5, 5);
34+
35+
const ambientLight = new THREE.AmbientLight(0xffffff);
36+
scene.add(pointLight, ambientLight);
37+
38+
// Helpers
39+
40+
// const lightHelper = new THREE.PointLightHelper(pointLight)
41+
// const gridHelper = new THREE.GridHelper(200, 50);
42+
// scene.add(lightHelper, gridHelper)
43+
44+
// const controls = new OrbitControls(camera, renderer.domElement);
45+
46+
function addStar() {
47+
const geometry = new THREE.SphereGeometry(0.25, 24, 24);
48+
const material = new THREE.MeshStandardMaterial({ color: 0xffffff });
49+
const star = new THREE.Mesh(geometry, material);
50+
51+
const [x, y, z] = Array(3)
52+
.fill()
53+
.map(() => THREE.MathUtils.randFloatSpread(100));
54+
55+
star.position.set(x, y, z);
56+
scene.add(star);
57+
}
58+
59+
Array(200).fill().forEach(addStar);
60+
61+
// Background
62+
63+
const spaceTexture = new THREE.TextureLoader().load('space.jpg');
64+
scene.background = spaceTexture;
65+
66+
// Avatar
67+
68+
const jeffTexture = new THREE.TextureLoader().load('jeff.png');
69+
70+
const jeff = new THREE.Mesh(new THREE.BoxGeometry(3, 3, 3), new THREE.MeshBasicMaterial({ map: jeffTexture }));
71+
72+
scene.add(jeff);
73+
74+
// Moon
75+
76+
const moonTexture = new THREE.TextureLoader().load('moon.jpg');
77+
const normalTexture = new THREE.TextureLoader().load('normal.jpg');
78+
79+
const moon = new THREE.Mesh(
80+
new THREE.SphereGeometry(3, 32, 32),
81+
new THREE.MeshStandardMaterial({
82+
map: moonTexture,
83+
normalMap: normalTexture,
84+
})
85+
);
86+
87+
scene.add(moon);
88+
89+
moon.position.z = 30;
90+
moon.position.setX(-10);
91+
92+
jeff.position.z = -5;
93+
jeff.position.x = 2;
94+
95+
// Scroll Animation
96+
97+
function moveCamera() {
98+
const t = document.body.getBoundingClientRect().top;
99+
moon.rotation.x += 0.05;
100+
moon.rotation.y += 0.075;
101+
moon.rotation.z += 0.05;
102+
103+
jeff.rotation.y += 0.01;
104+
jeff.rotation.z += 0.01;
105+
106+
camera.position.z = t * -0.01;
107+
camera.position.x = t * -0.0002;
108+
camera.rotation.y = t * -0.0002;
109+
}
110+
111+
document.body.onscroll = moveCamera;
112+
moveCamera();
113+
114+
// Animation Loop
115+
116+
function animate() {
117+
requestAnimationFrame(animate);
118+
119+
torus.rotation.x += 0.01;
120+
torus.rotation.y += 0.005;
121+
torus.rotation.z += 0.01;
122+
123+
moon.rotation.x += 0.005;
124+
125+
// controls.update();
126+
127+
renderer.render(scene, camera);
128+
}
129+
130+
animate();

moon.jpg

136 KB
Loading

normal.jpg

911 KB
Loading

0 commit comments

Comments
 (0)