Programming
Panduan Three.js Untuk Membuat Animasi 3D Di Browser
Membuat animasi 3D di browser dulu identik dengan pekerjaan berat: memahami grafika komputer, menulis WebGL langsung, dan mengurus banyak detail teknis rendering. Sekarang, Three.js membuat proses itu jauh lebih mudah. Library JavaScript ini memungkinkan developer membuat objek 3D, animasi interaktif, efek visual, bahkan game sederhana langsung di halaman web tanpa plugin tambahan.
Ringkasan singkat: Three.js adalah library JavaScript open-source untuk membuat grafik 3D dan animasi di browser. Three.js bekerja di atas WebGL, yaitu API JavaScript untuk merender grafik 2D dan 3D interaktif secara native di browser. Dengan Three.js, Anda bisa membuat scene, kamera, cahaya, material, model 3D, dan animasi tanpa harus menulis WebGL mentah dari nol.
Three.js adalah pustaka JavaScript yang menyederhanakan penggunaan WebGL sehingga developer dapat membuat objek 3D, animasi, game, dan pengalaman visual interaktif langsung di browser.
Tutorial ini akan membahas cara menggunakan Three.js untuk membuat animasi di browser, mulai dari konsep dasar, persiapan project, langkah coding, perbandingan opsi teknologi, review kelebihan-kekurangan, hingga troubleshooting error yang sering muncul.
Mengenal Three.js dan Mengapa Penting untuk Animasi Browser
![]()
Three.js dikembangkan oleh Ricardo Cabello, yang dikenal sebagai Mr.doob. Tujuan utamanya adalah membuat pengembangan grafis 3D di web lebih mudah diakses oleh developer JavaScript.
Tanpa Three.js, Anda perlu berinteraksi langsung dengan WebGL. WebGL sangat kuat, tetapi cukup rendah level. Anda harus mengatur buffer, shader, matrix transform, dan detail rendering lain secara manual.
Dengan library Three.js, Anda bekerja menggunakan konsep yang lebih mudah dipahami:
-
Scene sebagai ruang 3D.
-
Camera sebagai sudut pandang pengguna.
-
Renderer untuk menggambar hasil ke browser.
-
Geometry sebagai bentuk objek.
-
Material sebagai tampilan permukaan objek.
-
Light untuk pencahayaan.
-
Animation loop untuk membuat objek bergerak.
Three.js banyak digunakan untuk:
-
Animasi produk di landing page.
-
Visualisasi data 3D.
-
Konfigurator produk interaktif.
-
Game 3D berbasis browser.
-
Website portfolio kreatif.
-
Simulasi edukasi.
-
Efek visual untuk kampanye digital.
Overview Produk: Apa yang Ditawarkan Three.js?
Sebagai sebuah library, Three.js bukan aplikasi visual siap pakai seperti Blender atau Unity. Three.js adalah toolkit pemrograman yang memberi Anda kontrol langsung di dalam kode JavaScript.
Key Features Three.js
Beberapa fitur utama Three.js yang paling relevan untuk pembuatan animasi di browser adalah:
-
Rendering 3D berbasis WebGL tanpa plugin browser tambahan.
-
Scene graph untuk mengatur objek dalam ruang 3D.
-
Material dan lighting untuk tampilan realistis atau stylized.
-
Sistem animasi untuk transformasi objek, morph target, material, opacity, visibility, dan tulang pada model rigged.
-
Loader model 3D seperti GLTF/GLB untuk membawa aset dari Blender atau software 3D lain.
-
Kontrol kamera seperti orbit control untuk interaksi pengguna.
-
Komunitas besar, dokumentasi resmi, contoh interaktif, editor, forum, dan integrasi ekosistem web modern.
Kelebihan Three.js
Three.js unggul karena menurunkan kompleksitas WebGL. Developer tidak perlu memahami seluruh detail shader dan pipeline grafis sejak awal.
Kelebihan utamanya:
-
Mudah dipelajari oleh developer JavaScript.
-
Bisa berjalan langsung di browser modern.
-
Cocok untuk animasi 3D ringan hingga menengah.
-
Dokumentasi dan contoh resmi cukup banyak.
-
Fleksibel untuk website, game, visualisasi, dan eksperimen kreatif.
-
Mendukung model 3D, tekstur, kamera, cahaya, dan efek visual.
Kekurangan Three.js
Three.js tetap memiliki batasan. Ia bukan solusi ajaib untuk semua kebutuhan 3D.
Beberapa kekurangannya:
-
Performa tetap bergantung pada GPU, browser, dan perangkat pengguna.
-
Scene kompleks bisa berat di perangkat mobile.
-
Debugging 3D lebih sulit dibanding UI HTML biasa.
-
Butuh pemahaman dasar matematika 3D untuk kasus lanjutan.
-
Tidak menyediakan editor game lengkap seperti Unity.
-
Optimasi model, tekstur, dan jumlah objek tetap menjadi tanggung jawab developer.
Siapa yang Cocok Menggunakan Three.js?
Three.js paling cocok untuk:
-
Frontend developer yang ingin menambahkan animasi 3D di website.
-
Creative developer yang membuat landing page interaktif.
-
Developer produk yang ingin membuat preview 3D.
-
Tim edukasi yang membuat simulasi visual.
-
Developer game browser sederhana.
-
Desainer teknis yang ingin menghubungkan model 3D dengan JavaScript.
Siapa yang Sebaiknya Melewati Three.js?
Three.js mungkin bukan pilihan terbaik jika:
-
Anda hanya butuh animasi UI sederhana seperti fade, slide, atau hover.
-
Project Anda harus berjalan sangat ringan di perangkat lama.
-
Anda membutuhkan game engine lengkap dengan physics, scene editor, asset pipeline, dan deployment multi-platform.
-
Tim Anda belum siap mengelola aset 3D, optimasi, dan testing lintas perangkat.
Prasyarat Sebelum Belajar Three.js
Sebelum mengikuti tutorial coding ini, pastikan Anda memahami beberapa dasar web development.
Pengetahuan yang Dibutuhkan
Anda tidak perlu menjadi ahli grafika komputer, tetapi sebaiknya sudah familiar dengan:
-
HTML dasar.
-
CSS dasar.
-
JavaScript modern.
-
Konsep
importdan module JavaScript. -
Cara menjalankan local development server.
-
Dasar koordinat 2D atau 3D.
Jika Anda sudah pernah membuat halaman web interaktif dengan JavaScript, Anda bisa mulai belajar Three.js untuk pemula.
Perangkat dan Tools
Gunakan tools berikut:
-
Browser modern seperti Chrome, Edge, Firefox, atau Safari.
-
Code editor seperti VS Code.
-
Node.js versi LTS.
-
Terminal atau command prompt.
-
Package manager seperti npm.
Kenapa local server penting? Karena banyak fitur modern JavaScript module dan asset 3D tidak berjalan optimal jika file HTML dibuka langsung dengan file://.
Perbandingan Three.js dengan Opsi Lain
Sebelum masuk ke coding, penting memahami kapan Three.js menjadi pilihan tepat dibanding opsi lain seperti WebGL langsung, Babylon.js, CSS animation, atau Canvas 2D.
Opsi | Cocok Untuk | Kelebihan | Kekurangan | Tingkat Kesulitan |
|---|---|---|---|---|
Three.js | Animasi 3D web, visualisasi, produk interaktif | Fleksibel, populer, banyak contoh, berbasis WebGL | Perlu optimasi manual untuk scene besar | Menengah |
WebGL langsung | Engine custom, eksperimen grafika rendah level | Kontrol penuh atas rendering | Kompleks, banyak boilerplate, butuh shader | Tinggi |
Babylon.js | Game 3D web, aplikasi 3D lengkap | Fitur engine lebih lengkap, tooling kuat | Bisa terasa lebih berat untuk animasi sederhana | Menengah-Tinggi |
CSS Animation | Transisi UI, microinteraction, efek 2D ringan | Sangat ringan dan mudah | Tidak cocok untuk 3D kompleks | Rendah |
Canvas 2D | Game 2D, chart custom, animasi raster | Sederhana untuk 2D | Tidak ideal untuk scene 3D modern | Rendah-Menengah |
Unity WebGL Export | Game kompleks berbasis engine | Editor lengkap, asset pipeline matang | Bundle besar, lebih berat di web | Tinggi |
Breakdown Kriteria Pemilihan
Pilih teknologi berdasarkan kebutuhan, bukan popularitas semata.
-
Jika fokus Anda adalah objek 3D di browser, Three.js adalah pilihan praktis.
-
Jika hanya butuh animasi tombol atau card, CSS animation lebih ringan.
-
Jika butuh engine game lengkap, Babylon.js atau Unity bisa lebih cocok.
-
Jika ingin belajar grafika komputer dari dasar, WebGL langsung memberi kontrol terbesar.
-
Jika membuat visualisasi 2D, Canvas 2D atau SVG sering lebih efisien.
Best-For Scenarios
Gunakan Three.js untuk skenario berikut:
-
Landing page dengan produk 3D yang bisa diputar.
-
Animasi hero section yang menampilkan bentuk geometris.
-
Website portfolio dengan interaksi visual.
-
Simulasi ringan seperti tata surya atau molekul.
-
Viewer model 3D dari file GLB.
-
Eksperimen visual berbasis shader, partikel, atau post-processing.
Gunakan alternatif lain jika:
-
CSS animation: hanya animasi UI ringan.
-
Babylon.js: perlu fitur game engine lebih lengkap.
-
WebGL langsung: butuh kontrol rendering tingkat rendah.
-
Unity: game kompleks dengan workflow editor penuh.
Rekomendasi Akhir Berdasarkan Use Case
Use Case | Rekomendasi | Alasan |
|---|---|---|
Belajar animasi 3D web | Three.js | Sintaks lebih ramah dibanding WebGL langsung |
Landing page produk 3D | Three.js | Fleksibel dan mudah diintegrasikan dengan frontend |
Game browser kompleks | Babylon.js atau Unity | Fitur engine lebih lengkap |
Animasi UI sederhana | CSS Animation | Lebih ringan dan cepat dibuat |
Visualisasi data 3D | Three.js | Kontrol visual kuat dan bisa dikustomisasi |
Riset shader atau grafika rendah level | WebGL langsung | Memberi kontrol penuh |
Step 1: Membuat Project Three.js Baru
Langkah pertama adalah membuat project JavaScript modern agar Three.js bisa diinstal lewat npm.
Jalankan perintah berikut di terminal:
mkdir belajar-threejs-animasi
cd belajar-threejs-animasi
npm init -y
npm install three vite
Kemudian buka file package.json, lalu tambahkan script berikut:
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"three": "^0.0.0",
"vite": "^0.0.0"
}
}
Versi dependency di komputer Anda bisa berbeda. Tidak masalah selama paket berhasil terinstal.
Mengapa Step Ini Penting?
Three.js bisa digunakan melalui CDN, tetapi npm lebih direkomendasikan untuk project modern. Dengan npm, Anda bisa mengelola dependency, menggunakan module import, dan menyiapkan build production.
Vite dipakai sebagai development server karena cepat dan sederhana. Ini membantu browser menjalankan JavaScript module dengan benar.
Step 2: Menyiapkan Struktur File
![]()
Buat struktur file seperti berikut:
belajar-threejs-animasi/
├── index.html
├── package.json
└── src/
├── main.js
└── style.css
Isi index.html:
<!doctype html>
<html lang="id">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Belajar Three.js Animasi Browser</title>
</head>
<body>
<canvas id="webgl"></canvas>
<script type="module" src="/src/main.js"></script>
</body>
</html>
Isi src/style.css:
* {
box-sizing: border-box;
}
body {
margin: 0;
overflow: hidden;
background: radial-gradient(circle at top, #23395d, #050816 70%);
}
canvas {
display: block;
}
Mengapa Step Ini Penting?
Elemen <canvas> adalah area tempat WebGL menggambar output 3D. Three.js akan menggunakan canvas ini sebagai target renderer.
CSS overflow: hidden mencegah scrollbar muncul saat canvas memenuhi layar. Background gradient membantu memberi suasana visual jika area canvas belum sepenuhnya terisi.
Step 3: Membuat Scene, Camera, dan Renderer
![]()
Sekarang buat kode dasar Three.js di src/main.js.
import './style.css';
import * as THREE from 'three';
const canvas = document.querySelector('#webgl');
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
100
);
camera.position.z = 3;
const renderer = new THREE.WebGLRenderer({
canvas,
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.render(scene, camera);
Jalankan development server:
npm run dev
Buka URL yang muncul di terminal, biasanya:
http://localhost:5173
Expected Output
Pada tahap ini, browser akan menampilkan halaman kosong dengan background gelap. Belum ada objek 3D karena kita baru membuat scene, kamera, dan renderer.
Mengapa Step Ini Penting?
Tiga komponen ini adalah fondasi hampir semua project Three.js:
-
Scene menyimpan semua objek 3D.
-
Camera menentukan sudut pandang.
-
Renderer menggambar scene ke canvas.
Tanpa salah satu dari tiga komponen ini, browser tidak bisa menampilkan hasil 3D.
Step 4: Menambahkan Objek 3D Pertama
![]()
Tambahkan cube sederhana menggunakan BoxGeometry dan MeshStandardMaterial.
Perbarui src/main.js:
import './style.css';
import * as THREE from 'three';
const canvas = document.querySelector('#webgl');
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
100
);
camera.position.z = 3;
const renderer = new THREE.WebGLRenderer({
canvas,
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({
color: 0x4cc9f0,
roughness: 0.35,
metalness: 0.2
});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const light = new THREE.DirectionalLight(0xffffff, 2);
light.position.set(2, 2, 4);
scene.add(light);
renderer.render(scene, camera);
Expected Output
Anda akan melihat kubus berwarna biru muda di tengah layar. Jika objek terlihat terlalu gelap, berarti pencahayaan belum cukup atau material membutuhkan light.
Mengapa Step Ini Penting?
Objek 3D di Three.js biasanya dibuat dari kombinasi:
-
Geometry: bentuk dasar objek.
-
Material: tampilan permukaan objek.
-
Mesh: gabungan geometry dan material yang bisa dimasukkan ke scene.
MeshStandardMaterial bereaksi terhadap cahaya, sehingga hasilnya lebih natural dibanding material dasar yang tidak membutuhkan lighting.
Step 5: Membuat Animasi dengan Render Loop
Agar objek bergerak, kita perlu membuat render loop menggunakan requestAnimationFrame.
Tambahkan fungsi animate():
function animate() {
cube.rotation.x += 0.01;
cube.rotation.y += 0.015;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
Kode lengkapnya menjadi:
import './style.css';
import * as THREE from 'three';
const canvas = document.querySelector('#webgl');
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
100
);
camera.position.z = 3;
const renderer = new THREE.WebGLRenderer({
canvas,
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({
color: 0x4cc9f0,
roughness: 0.35,
metalness: 0.2
});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const light = new THREE.DirectionalLight(0xffffff, 2);
light.position.set(2, 2, 4);
scene.add(light);
function animate() {
cube.rotation.x += 0.01;
cube.rotation.y += 0.015;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
Expected Output
Kubus akan berputar terus-menerus di browser. Ini adalah bentuk paling dasar dari animasi Three.js.
Mengapa Step Ini Penting?
Animasi di browser perlu diperbarui berulang kali. requestAnimationFrame memberi tahu browser untuk menjalankan fungsi sebelum frame berikutnya digambar.
Pendekatan ini lebih efisien dibanding setInterval karena browser bisa menyesuaikan frame rate, menghemat resource, dan menghentikan animasi saat tab tidak aktif.
Step 6: Membuat Animasi Lebih Stabil dengan Clock
Jika Anda hanya menambah rotasi per frame, kecepatan animasi bisa berbeda di perangkat dengan frame rate berbeda. Solusinya adalah menggunakan waktu.
Three.js menyediakan Clock untuk menghitung waktu berjalan.
const clock = new THREE.Clock();
function animate() {
const elapsedTime = clock.getElapsedTime();
cube.rotation.x = elapsedTime * 0.8;
cube.rotation.y = elapsedTime * 1.2;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
Mengapa Step Ini Penting?
Animasi berbasis waktu lebih konsisten. Jika perangkat menjalankan 60 FPS atau 120 FPS, rotasi tetap terasa proporsional karena dihitung dari waktu, bukan jumlah frame.
Ini penting untuk pengalaman pengguna yang konsisten di laptop, desktop, dan smartphone.
Step 7: Menambahkan Interaksi Mouse
Animasi yang baik di browser sering kali bukan hanya bergerak sendiri, tetapi juga merespons pengguna.
Tambahkan variabel mouse:
const pointer = {
x: 0,
y: 0
};
window.addEventListener('pointermove', (event) => {
pointer.x = (event.clientX / window.innerWidth - 0.5) * 2;
pointer.y = -(event.clientY / window.innerHeight - 0.5) * 2;
});
Lalu gunakan di dalam fungsi animasi:
function animate() {
const elapsedTime = clock.getElapsedTime();
cube.rotation.x = elapsedTime * 0.7 + pointer.y * 0.4;
cube.rotation.y = elapsedTime * 1.1 + pointer.x * 0.4;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
Expected Output
Kubus tetap berputar, tetapi arah rotasinya terasa sedikit mengikuti pergerakan pointer. Di perangkat touch, event pointermove juga lebih fleksibel dibanding hanya mousemove.
Mengapa Step Ini Penting?
Interaksi membuat animasi 3D terasa hidup. Banyak implementasi Three.js di website modern menggunakan input pengguna untuk memberi sensasi kedalaman, kontrol, atau respons visual.
Step 8: Menangani Resize Browser
Jika ukuran browser berubah, canvas dan kamera perlu diperbarui. Jika tidak, tampilan 3D bisa gepeng atau terpotong.
Tambahkan kode berikut:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
});
Mengapa Step Ini Penting?
PerspectiveCamera memakai aspek rasio layar. Ketika browser berubah ukuran, aspek rasio lama tidak lagi akurat.
camera.updateProjectionMatrix() memberi tahu Three.js untuk menghitung ulang proyeksi kamera. Tanpa ini, hasil visual bisa terlihat salah.
Step 9: Menambahkan Banyak Objek dan Variasi Animasi
Untuk membuat scene lebih menarik, kita bisa menambahkan beberapa objek kecil sebagai elemen latar.
Tambahkan kode berikut sebelum fungsi animasi:
const particles = new THREE.Group();
scene.add(particles);
for (let i = 0; i < 80; i++) {
const smallGeometry = new THREE.SphereGeometry(0.025, 12, 12);
const smallMaterial = new THREE.MeshBasicMaterial({
color: 0xffffff
});
const particle = new THREE.Mesh(smallGeometry, smallMaterial);
particle.position.set(
(Math.random() - 0.5) * 8,
(Math.random() - 0.5) * 5,
(Math.random() - 0.5) * 6
);
particles.add(particle);
}
Lalu update animasi:
function animate() {
const elapsedTime = clock.getElapsedTime();
cube.rotation.x = elapsedTime * 0.7 + pointer.y * 0.4;
cube.rotation.y = elapsedTime * 1.1 + pointer.x * 0.4;
particles.rotation.y = elapsedTime * 0.08;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
Expected Output
Kubus berputar di tengah layar, sementara titik-titik kecil di belakangnya bergerak perlahan. Scene terlihat lebih dinamis dan memiliki kedalaman.
Mengapa Step Ini Penting?
Animasi browser tidak harus selalu bergantung pada satu objek utama. Elemen pendukung seperti partikel, cahaya, dan background bisa memperkuat atmosfer visual.
Namun, jumlah objek harus diperhatikan. Terlalu banyak mesh individual dapat menurunkan performa, terutama di perangkat mobile.
Step 10: Menggunakan Sistem Animasi Three.js untuk Model 3D
Selain mengubah rotasi secara manual, Three.js juga memiliki sistem animasi untuk model yang lebih kompleks. Sistem ini dapat menggerakkan:
-
Tulang pada model rigged atau skinned.
-
Morph targets untuk perubahan bentuk.
-
Properti material seperti warna dan opacity.
-
Visibility.
-
Transform seperti position, rotation, dan scale.
Pada model GLB atau GLTF dari Blender, animasi biasanya sudah tersimpan di dalam file. Three.js dapat memutar animasi tersebut dengan AnimationMixer.
Contoh konsep dasarnya:
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
const loader = new GLTFLoader();
let mixer;
loader.load('/models/character.glb', (gltf) => {
const model = gltf.scene;
scene.add(model);
mixer = new THREE.AnimationMixer(model);
const action = mixer.clipAction(gltf.animations[0]);
action.play();
});
Di dalam render loop:
const clock = new THREE.Clock();
function animate() {
const delta = clock.getDelta();
if (mixer) {
mixer.update(delta);
}
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
Mengapa Step Ini Penting?
Animasi manual cocok untuk objek sederhana. Tetapi untuk karakter, mesin, produk, atau aset kompleks, sistem animasi bawaan Three.js jauh lebih tepat.
AnimationMixer berperan seperti pemutar animasi. Ia membaca clip animasi dari model dan memperbarui pose atau properti setiap frame.
Step 11: Membuat Versi Final Kode Demo
Berikut contoh final yang menggabungkan scene, kamera, renderer, kubus beranimasi, partikel, interaksi pointer, dan resize.
import './style.css';
import * as THREE from 'three';
const canvas = document.querySelector('#webgl');
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
100
);
camera.position.z = 3;
const renderer = new THREE.WebGLRenderer({
canvas,
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshStandardMaterial({
color: 0x4cc9f0,
roughness: 0.35,
metalness: 0.2
});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
scene.add(cube);
const light = new THREE.DirectionalLight(0xffffff, 2);
light.position.set(2, 2, 4);
scene.add(light);
const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);
scene.add(ambientLight);
const particles = new THREE.Group();
scene.add(particles);
const particleGeometry = new THREE.SphereGeometry(0.025, 12, 12);
const particleMaterial = new THREE.MeshBasicMaterial({
color: 0xffffff
});
for (let i = 0; i < 80; i++) {
const particle = new THREE.Mesh(particleGeometry, particleMaterial);
particle.position.set(
(Math.random() - 0.5) * 8,
(Math.random() - 0.5) * 5,
(Math.random() - 0.5) * 6
);
particles.add(particle);
}
const pointer = {
x: 0,
y: 0
};
window.addEventListener('pointermove', (event) => {
pointer.x = (event.clientX / window.innerWidth - 0.5) * 2;
pointer.y = -(event.clientY / window.innerHeight - 0.5) * 2;
});
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
});
const clock = new THREE.Clock();
function animate() {
const elapsedTime = clock.getElapsedTime();
cube.rotation.x = elapsedTime * 0.7 + pointer.y * 0.4;
cube.rotation.y = elapsedTime * 1.1 + pointer.x * 0.4;
particles.rotation.y = elapsedTime * 0.08;
particles.rotation.x = pointer.y * 0.05;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
Expected Output Final
![]()
Ketika dijalankan, Anda akan melihat:
-
Canvas memenuhi layar browser.
-
Kubus 3D berwarna biru berputar secara halus.
-
Partikel putih di sekitar objek memberi kesan ruang.
-
Gerakan pointer memengaruhi rotasi objek.
-
Tampilan tetap proporsional saat ukuran browser berubah.
Tips Praktis Menggunakan Three.js di Project Nyata
1. Mulai dari Scene Kecil
Jangan langsung membuat dunia 3D kompleks. Mulailah dari satu objek, satu kamera, dan satu sumber cahaya.
Scene kecil lebih mudah di-debug. Setelah stabil, baru tambahkan model, tekstur, partikel, dan efek.
2. Batasi Pixel Ratio
Kode berikut penting untuk performa:
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
Layar modern bisa memiliki pixel ratio tinggi. Jika Anda selalu mengikuti nilai maksimum perangkat, rendering bisa menjadi terlalu berat.
3. Optimalkan Model 3D
Jika memakai model GLB atau GLTF:
-
Kurangi jumlah polygon.
-
Kompres tekstur.
-
Gunakan format gambar efisien.
-
Hapus objek yang tidak terlihat.
-
Gabungkan mesh jika memungkinkan.
-
Uji di perangkat mobile, bukan hanya laptop developer.
4. Gunakan Material Sesuai Kebutuhan
Material realistis memang menarik, tetapi tidak selalu diperlukan.
-
MeshBasicMaterial: ringan, tidak butuh cahaya. -
MeshStandardMaterial: realistis, butuh lighting. -
MeshPhysicalMaterial: lebih kompleks, cocok untuk efek kaca atau permukaan khusus. -
ShaderMaterial: sangat fleksibel, tetapi lebih sulit.
5. Pisahkan Kode untuk Project Besar
Untuk project nyata, jangan menaruh semua kode di main.js.
Struktur yang lebih rapi:
src/
├── main.js
├── scene.js
├── camera.js
├── renderer.js
├── objects/
│ └── cube.js
└── utils/
└── resize.js
Struktur modular membuat project lebih mudah diuji, dirawat, dan dikembangkan oleh tim.
Common Errors dan Cara Mengatasinya
Error: Cannot use import statement outside a module
Penyebab umum:
-
Script tidak memakai
type="module". -
File dibuka langsung dengan
file://. -
Development server tidak berjalan.
Solusi:
<script type="module" src="/src/main.js"></script>
Jalankan juga:
npm run dev
Error: Canvas Tidak Muncul
Penyebab umum:
-
Selector canvas salah.
-
Elemen
<canvas id="webgl">belum ada. -
File JavaScript tidak terhubung.
-
Ada error JavaScript di console.
Solusi:
const canvas = document.querySelector('#webgl');
if (!canvas) {
throw new Error('Canvas #webgl tidak ditemukan');
}
Pastikan index.html memiliki:
<canvas id="webgl"></canvas>
Error: Objek 3D Gelap atau Hitam
Penyebab umum:
-
Menggunakan material yang membutuhkan cahaya.
-
Tidak ada light di scene.
-
Posisi light tidak mengarah ke objek.
-
Intensitas light terlalu rendah.
Solusi:
const light = new THREE.DirectionalLight(0xffffff, 2);
light.position.set(2, 2, 4);
scene.add(light);
const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);
scene.add(ambientLight);
Jika ingin objek selalu terlihat tanpa cahaya, gunakan:
const material = new THREE.MeshBasicMaterial({
color: 0x4cc9f0
});
Error: Tampilan Gepeng Setelah Resize
Penyebab umum:
-
camera.aspecttidak diperbarui. -
camera.updateProjectionMatrix()tidak dipanggil. -
Renderer masih memakai ukuran lama.
Solusi:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
Error: Animasi Terasa Patah-Patah
Penyebab umum:
-
Terlalu banyak objek.
-
Model terlalu berat.
-
Tekstur terlalu besar.
-
Pixel ratio terlalu tinggi.
-
Perangkat pengguna terbatas.
Solusi praktis:
-
Kurangi jumlah mesh.
-
Gunakan geometry lebih sederhana.
-
Batasi pixel ratio.
-
Kompres model dan tekstur.
-
Hindari efek post-processing berlebihan.
-
Uji performa dengan DevTools.
Error: Model GLB Tidak Terload
Penyebab umum:
-
Path file salah.
-
File tidak berada di folder publik.
-
Server lokal tidak berjalan.
-
Loader belum diimpor dengan benar.
Contoh import yang benar:
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
Jika memakai Vite, letakkan aset statis di folder public:
public/
└── models/
└── character.glb
Lalu load dengan path:
loader.load('/models/character.glb', (gltf) => {
scene.add(gltf.scene);
});
Troubleshooting Performa Three.js
Cek Jumlah Draw Call
Banyak objek kecil bisa membuat draw call meningkat. Dalam Three.js, setiap mesh dan material dapat memengaruhi biaya rendering.
Untuk partikel dalam jumlah besar, pertimbangkan:
-
InstancedMesh. -
Points. -
Menggabungkan geometry.
-
Menggunakan texture atlas.
Kurangi Beban Material
Material dengan pencahayaan realistis lebih berat daripada material sederhana. Jika objek kecil atau jauh dari kamera, gunakan material yang lebih ringan.
Contoh:
const material = new THREE.MeshBasicMaterial({
color: 0xffffff
});
Gunakan Delta Time untuk Animasi Kompleks
Untuk animasi fisika atau model, gunakan clock.getDelta() agar pembaruan frame lebih stabil.
const delta = clock.getDelta();
if (mixer) {
mixer.update(delta);
}
Jangan Render Jika Tidak Perlu
Untuk aplikasi statis seperti model viewer sederhana, Anda tidak selalu perlu render loop terus-menerus. Render hanya saat kamera bergerak atau objek berubah.
Namun untuk animasi berkelanjutan, render loop tetap diperlukan.
Use Case Nyata Three.js di Website Modern
1. Product Viewer 3D
Brand bisa menampilkan sepatu, furnitur, gadget, atau kendaraan dalam bentuk 3D. Pengguna dapat memutar model, melihat detail, dan memahami produk lebih baik.
Three.js cocok karena bisa menampilkan objek langsung di browser tanpa software berat.
2. Landing Page Interaktif
Website kampanye sering memakai animasi 3D untuk menciptakan kesan premium. Objek bisa bergerak mengikuti scroll, pointer, atau waktu.
Namun, animasi harus tetap mendukung tujuan utama halaman. Jangan sampai visual 3D memperlambat akses atau mengganggu konversi.
3. Visualisasi Data 3D
Three.js dapat digunakan untuk visualisasi jaringan, peta, orbit, struktur molekul, atau data spasial. Keunggulannya adalah fleksibilitas dalam mengatur kamera, warna, ukuran, dan interaksi.
Untuk data sederhana, chart 2D mungkin lebih jelas. Gunakan 3D ketika dimensi tambahan memang membantu pemahaman.
4. Game Browser Sederhana
Three.js dapat membuat game 3D ringan berbasis browser. Anda bisa menggabungkannya dengan input keyboard, physics library, audio, dan sistem UI HTML.
Untuk game besar, pertimbangkan engine yang lebih lengkap. Three.js memberi kebebasan, tetapi banyak sistem harus dibangun sendiri.
5. Edukasi dan Simulasi
Simulasi seperti tata surya, anatomi, struktur mesin, atau eksperimen fisika dapat menjadi lebih mudah dipahami dengan 3D. Pengguna bisa melihat objek dari berbagai sudut.
Three.js membantu membuat pengalaman belajar lebih visual dan interaktif.
Review Seimbang: Apakah Three.js Layak Dipakai?
Kesan Penggunaan
Dalam praktik pengembangan web, Three.js terasa seperti jembatan yang baik antara JavaScript biasa dan grafika 3D. Anda tetap perlu memahami scene, kamera, cahaya, dan performa, tetapi tidak perlu memulai dari WebGL mentah.
Untuk developer frontend, Three.js relatif masuk akal dipelajari setelah memahami JavaScript dasar. Tantangan terbesar biasanya bukan sintaks, melainkan cara berpikir dalam ruang 3D.
Nilai Utama
Nilai terbesar Three.js adalah kombinasi antara:
-
Akses langsung di browser.
-
Abstraksi WebGL yang lebih mudah.
-
Komunitas dan contoh yang luas.
-
Fleksibilitas untuk banyak jenis project.
-
Integrasi baik dengan ekosistem JavaScript.
Keterbatasan yang Perlu Jujur Dipahami
Three.js tidak otomatis membuat project menjadi ringan. Jika model terlalu besar, tekstur tidak dikompresi, atau render loop tidak efisien, website tetap bisa lambat.
Selain itu, pengalaman 3D yang baik membutuhkan kolaborasi antara developer, desainer, dan pembuat aset 3D. Kode yang benar saja belum cukup jika aset visual tidak dioptimalkan.
Verdict
Three.js sangat layak dipakai jika Anda ingin membuat animasi 3D, objek interaktif, atau visualisasi berbasis browser dengan JavaScript. Library ini memberikan keseimbangan yang baik antara kemudahan, kontrol, dan kemampuan teknis.
Untuk animasi UI sederhana, Three.js berlebihan. Untuk game besar, engine khusus bisa lebih efisien. Tetapi untuk mayoritas kebutuhan 3D interaktif di web, Three.js adalah salah satu pilihan paling praktis dan matang.
Checklist Belajar Three.js untuk Pemula
Gunakan checklist ini agar proses belajar lebih terarah:
-
Pahami konsep scene, camera, renderer.
-
Buat satu objek mesh sederhana.
-
Tambahkan material dan light.
-
Buat render loop dengan
requestAnimationFrame. -
Gunakan
Clockagar animasi stabil. -
Tambahkan interaksi pointer atau keyboard.
-
Tangani resize browser.
-
Pelajari loader GLTF untuk model 3D.
-
Uji performa di perangkat mobile.
-
Optimalkan jumlah objek, material, tekstur, dan pixel ratio.
Tips Menulis Kode Three.js yang Lebih Aman
Gunakan Nama Variabel yang Jelas
Nama seperti cube, scene, camera, dan renderer sudah cukup jelas untuk project kecil. Untuk project besar, gunakan nama lebih spesifik seperti productModel, heroCamera, atau backgroundParticles.
Hindari Magic Number Berlebihan
Nilai seperti 0.7, 1.1, atau 0.4 dalam animasi sebaiknya dipindahkan ke konstanta jika sering diubah.
const rotationSpeed = {
x: 0.7,
y: 1.1
};
const pointerInfluence = 0.4;
Lalu gunakan:
cube.rotation.x = elapsedTime * rotationSpeed.x + pointer.y * pointerInfluence;
cube.rotation.y = elapsedTime * rotationSpeed.y + pointer.x * pointerInfluence;
Bersihkan Resource Jika Scene Dihapus
Dalam single page application, scene bisa dibuat dan dihancurkan berkali-kali. Geometry dan material sebaiknya dibersihkan agar tidak menyebabkan memory leak.
cubeGeometry.dispose();
cubeMaterial.dispose();
renderer.dispose();
Ini penting jika Anda mengintegrasikan Three.js dengan React, Vue, Svelte, atau framework frontend lain.
Perbandingan Cara Instalasi Three.js
Ada dua cara umum menggunakan Three.js: CDN dan npm. Keduanya valid, tetapi cocok untuk kebutuhan berbeda.
Metode | Cocok Untuk | Kelebihan | Kekurangan |
|---|---|---|---|
CDN | Demo cepat, eksperimen singkat | Tidak perlu setup build tool | Kurang ideal untuk project besar |
npm + Vite | Project modern, production, tim | Dependency rapi, build mudah, modular | Perlu setup awal |
Framework integration | Aplikasi React/Vue/Svelte | Cocok untuk app kompleks | Perlu memahami lifecycle framework |
Rekomendasi
Gunakan CDN jika Anda hanya ingin mencoba contoh kecil. Gunakan npm dan Vite jika Anda membuat tutorial serius, portfolio, landing page production, atau aplikasi yang akan dikembangkan lebih lanjut.
Praktik Terbaik SEO dan UX untuk Website Three.js
![]()
Website dengan animasi 3D harus tetap ramah pengguna dan mesin pencari. Three.js menggambar di canvas, sehingga konten di dalam canvas tidak terbaca seperti teks HTML biasa.
Agar tetap baik untuk SEO:
-
Letakkan teks utama di HTML, bukan hanya di canvas.
-
Gunakan heading yang jelas.
-
Tambahkan deskripsi produk atau konten dalam markup biasa.
-
Pastikan halaman tetap cepat dimuat.
-
Sediakan fallback untuk perangkat lemah.
-
Hindari memblokir interaksi utama dengan animasi berat.
Untuk UX:
-
Jangan membuat animasi terlalu cepat.
-
Sediakan kontrol jika animasi mengganggu.
-
Perhatikan kontras visual.
-
Uji di layar kecil.
-
Jangan mengorbankan keterbacaan demi efek visual.
Contoh Pengembangan Lanjutan Setelah Tutorial Ini
Setelah memahami dasar Three.js animasi browser, Anda bisa mengembangkan project ke arah berikut:
Membuat Objek Mengikuti Scroll
Animasi berbasis scroll sering digunakan di landing page. Anda dapat membaca posisi scroll dan mengubah rotasi, posisi, atau kamera.
window.addEventListener('scroll', () => {
const scrollProgress = window.scrollY / window.innerHeight;
cube.position.y = -scrollProgress;
cube.rotation.z = scrollProgress * Math.PI;
});
Menambahkan Orbit Controls
Orbit controls memungkinkan pengguna memutar kamera di sekitar objek.
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
Di render loop:
controls.update();
renderer.render(scene, camera);
Menggunakan Texture
Texture membuat objek lebih detail.
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('/textures/pattern.jpg');
const material = new THREE.MeshStandardMaterial({
map: texture
});
Membuat Animasi Material
Three.js tidak hanya bisa mengubah transform. Anda juga dapat menganimasikan warna, opacity, atau properti material lain.
function animate() {
const elapsedTime = clock.getElapsedTime();
material.opacity = 0.5 + Math.sin(elapsedTime) * 0.3;
material.transparent = true;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
Sistem animasi Three.js memang mendukung berbagai properti model, termasuk material, visibility, transform, morph target, dan tulang pada model rigged. Ini membuatnya berguna untuk animasi yang lebih kompleks daripada sekadar rotasi objek sederhana.
Mengubah Visi Menjadi Realitas: Strategi Eksekusi yang Berkelanjutan
Pada akhirnya, keberhasilan dari langkah strategis ini tidak semata-mata bergantung pada seberapa matang rencana yang kita susun di atas kertas, melainkan pada ketangguhan dan konsistensi dalam eksekusi. Perencanaan yang sempurna hanyalah sebuah peta; tanpa pergerakan yang disiplin di lapangan, rencana tersebut akan tetap menjadi sekadar wacana.
Menyelaraskan Visi dan Tindakan
Untuk mengubah tantangan yang ada menjadi peluang nyata bagi pertumbuhan, kita perlu melakukan sinkronisasi yang presisi antara visi besar yang kita miliki dengan tindakan operasional sehari-hari. Hal ini dapat dicapai melalui beberapa pendekatan utama:
-
Adaptabilitas yang Terukur: Tetap fleksibel dalam merespons dinamika pasar tanpa kehilangan fokus pada tujuan akhir.
-
Prioritas yang Tepat: Mengalokasikan sumber daya pada inisiatif yang memberikan dampak paling signifikan (high-impact tasks).
-
Evaluasi Berkelanjutan: Melakukan tinjauan berkala untuk memastikan setiap langkah masih selaras dengan arah strategis perusahaan.
Menjadikan Momentum sebagai Batu Loncatan
Mari kita jadikan momentum ini sebagai titik tolak yang krusial untuk mencapai target yang lebih ambisius. Jangan melihat hambatan sebagai penghenti langkah, melainkan sebagai katalisator untuk berinovasi. Sebagai contoh, saat menghadapi keterbatasan sumber daya, kita dipaksa untuk lebih kreatif dalam efisiensi proses, yang pada gilirannya justru menciptakan model kerja yang lebih ramping dan efektif di masa depan.
Dampak yang Berkelanjutan
Tujuan akhir kita bukan sekadar mencapai target jangka pendek, melainkan memastikan bahwa setiap tetes keringat dan upaya yang dikeluarkan memberikan dampak berkelanjutan. Dengan membangun fondasi yang kokoh hari ini, kita tidak hanya mengamankan posisi kita di masa kini, tetapi juga menciptakan warisan nilai yang akan menopang pertumbuhan organisasi dalam jangka panjang.
Ingatlah, kesuksesan bukan tentang sekali lompatan besar, melainkan tentang akumulasi dari langkah-langkah kecil yang konsisten, terukur, dan dilakukan dengan penuh integritas.
Referensi
Applicanity. (2026). Mengenal Three.js untuk membuat tampilan 3D di website.
Codepolitan. (2026). Mengenal Three.js sebagai library JavaScript untuk membuat objek 3D pada browser.
Three.js. (2026). JavaScript 3D library.
BuildWithAngga. (2026). Pengenalan dasar Three.js untuk membawa 3D ke web.
Binus DKV. (2026). Three.js sebagai pintu menuju web 3D interaktif.
GitHub. (2026). Belajar Three.js untuk aplikasi, animasi, dan game 3D berbasis browser.
Askcommand. (2026). Apa itu Three.js dan cara membuat objek 3D di browser.
Three.js. (2026). Animation system in the Three.js manual.