Beranda Blog Programming Panduan Three.js Untuk Membuat Animasi 3...

Programming

Panduan Three.js Untuk Membuat Animasi 3D Di Browser

A
Admin
26 menit baca
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 import dan 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:

BASH
mkdir belajar-threejs-animasi
cd belajar-threejs-animasi
npm init -y
npm install three vite

Kemudian buka file package.json, lalu tambahkan script berikut:

JSON
{
  "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:

TEXT
belajar-threejs-animasi/
├── index.html
├── package.json
└── src/
    ├── main.js
    └── style.css

Isi index.html:

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:

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.

JAVASCRIPT
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:

BASH
npm run dev

Buka URL yang muncul di terminal, biasanya:

TEXT
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:

JAVASCRIPT
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():

JAVASCRIPT
function animate() {
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.015;

  renderer.render(scene, camera);
  requestAnimationFrame(animate);
}

animate();

Kode lengkapnya menjadi:

JAVASCRIPT
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.

JAVASCRIPT
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:

JAVASCRIPT
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:

JAVASCRIPT
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:

JAVASCRIPT
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:

JAVASCRIPT
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:

JAVASCRIPT
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:

JAVASCRIPT
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:

JAVASCRIPT
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.

JAVASCRIPT
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:

JAVASCRIPT
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:

TEXT
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:

HTML
<script type="module" src="/src/main.js"></script>

Jalankan juga:

BASH
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:

JAVASCRIPT
const canvas = document.querySelector('#webgl');

if (!canvas) {
  throw new Error('Canvas #webgl tidak ditemukan');
}

Pastikan index.html memiliki:

HTML
<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:

JAVASCRIPT
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:

JAVASCRIPT
const material = new THREE.MeshBasicMaterial({
  color: 0x4cc9f0
});

Error: Tampilan Gepeng Setelah Resize

Penyebab umum:

  • camera.aspect tidak diperbarui.

  • camera.updateProjectionMatrix() tidak dipanggil.

  • Renderer masih memakai ukuran lama.

Solusi:

JAVASCRIPT
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:

JAVASCRIPT
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

Jika memakai Vite, letakkan aset statis di folder public:

TEXT
public/
└── models/
    └── character.glb

Lalu load dengan path:

JAVASCRIPT
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:

JAVASCRIPT
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.

JAVASCRIPT
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 Clock agar 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.

JAVASCRIPT
const rotationSpeed = {
  x: 0.7,
  y: 1.1
};

const pointerInfluence = 0.4;

Lalu gunakan:

JAVASCRIPT
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.

JAVASCRIPT
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.

JAVASCRIPT
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.

JAVASCRIPT
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;

Di render loop:

JAVASCRIPT
controls.update();
renderer.render(scene, camera);

Menggunakan Texture

Texture membuat objek lebih detail.

JAVASCRIPT
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.

JAVASCRIPT
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.