
Three.js
SkillBuilds or debugs interactive 3D web scenes with Three.js: scene, camera, renderer, lights, materials, GLTF loading and controls, plus performance basics like capping pixel ratio, handling resize, disposing WebGL resources and reduced motion.
name: threejs
description: Use when building or debugging interactive 3D scenes on the web with Three.js (scene/camera/renderer, lights/materials, GLTF loading, controls, performance). Helpful for designers shipping 3D UI moments.
Three.js — WebGL 3D Scenes Skill
When to use
- Real 3D: product spins, interactive hero scenes, shaders/material effects, 3D data viz
- You need full control beyond “background effects”
- You can budget time for asset pipeline + performance tuning
Core mental model
- Create:
Scene(root graph)Camera(Perspective/Orthographic)Renderer(WebGLRenderer)Mesh=Geometry+Material- Lights (if using non-unlit materials)
- Render loop:
requestAnimationFrame(animate)- Update time-based animations, controls, mixers, then
renderer.render(scene, camera)
Key APIs/patterns
- Setup:
const renderer = new THREE.WebGLRenderer({ canvas, antialias, alpha })renderer.setSize(width, height, false)renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
- Camera:
camera.aspect = width / height; camera.updateProjectionMatrix()
- Scene graph:
scene.add(object)/object.position/rotation/scale
- Loading assets:
GLTFLoader(models),TextureLoader(images),DRACOLoader(compressed glTF)
- Controls (common):
OrbitControls(debug/product),PointerLockControls(FPS), custom pointer handlers
- Cleanup (important in SPAs):
geometry.dispose(),material.dispose(),texture.dispose(),renderer.dispose()- Remove event listeners; cancel RAF.
Common pitfalls
- Not handling resize → stretched/cropped rendering
- Too high devicePixelRatio → mobile GPU meltdown
- Leaking WebGL resources (not disposing) → crashes after route changes
- Loading huge textures/models → slow start; use compressed textures, Draco/KTX2, smaller maps
- Using too many lights/shadows → expensive; fake lighting with baked textures when possible
Quick recipes
1) Minimal spinning cube
import * as THREE from "three";
const canvas = document.querySelector("#c");
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true });
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
camera.position.set(0, 0, 4);
const geom = new THREE.BoxGeometry(1, 1, 1);
const mat = new THREE.MeshStandardMaterial({ color: 0x7c3aed });
const mesh = new THREE.Mesh(geom, mat);
scene.add(mesh);
scene.add(new THREE.AmbientLight(0xffffff, 0.8));
const dir = new THREE.DirectionalLight(0xffffff, 0.8);
dir.position.set(2, 2, 2);
scene.add(dir);
function resize() {
const w = canvas.clientWidth;
const h = canvas.clientHeight;
renderer.setSize(w, h, false);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
camera.aspect = w / h;
camera.updateProjectionMatrix();
}
window.addEventListener("resize", resize);
resize();
function animate(t) {
mesh.rotation.y = t * 0.0006;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
2) Respect reduced motion
- If
prefers-reduced-motion: reduce, render a still frame (no RAF) or slow updates.
What to ask the user
- Is this decorative (hero) or functional 3D (product viewer)?
- Target devices: mobile? older iPhones?
- Asset format availability (glTF, HDRI, textures) and file size constraints
- Accessibility/reduced motion requirements
関連リソース

WebGL Landing Steering
SkillSteers WebGL-heavy landing pages toward a chosen look by picking one of four visual lanes per page type, passing message, performance, accessibility and reliability gates, and outputting a lane, visual spec, stack, fallback and build order.
MengTo/Skills6.8k
Three.js Animation
SkillThree.js animation reference with code: procedural motion with Clock, the AnimationClip, AnimationMixer and AnimationAction keyframe system, playing GLTF animations, skeletal animation, morph targets and blending multiple animations.
CloudAI-X/threejs-skills3.6k
Three.js Fundamentals
SkillThree.js fundamentals with code: setting up the scene, cameras and WebGLRenderer, Object3D hierarchy, coordinate systems and transforms, the render loop and resize handling. A starting point for building a 3D scene on the web.
CloudAI-X/threejs-skills3.6k
Three.js Geometry
SkillThree.js geometry reference with code: parameters for built-in shapes like boxes, spheres, cylinders and tori, building custom meshes from vertices with BufferGeometry, and instanced rendering for large numbers of objects.
CloudAI-X/threejs-skills3.6k
Three.js Interaction
SkillThree.js interaction reference with code: raycasting for click detection and object selection, camera controls such as OrbitControls, and mouse and touch input handling for interactive 3D experiences.
CloudAI-X/threejs-skills3.6k
Three.js Lighting
SkillThree.js lighting reference with code: ambient, hemisphere, directional, point, spot and area lights with their cost and shadow support, shadow setup, image-based environment lighting and lighting performance tips.
CloudAI-X/threejs-skills3.6k