home / skills / noklip-io / agent-skills / three-js
This skill provides vanilla Three.js reference and patterns to quickly build 3D scenes and optimize rendering.
npx playbooks add skill noklip-io/agent-skills --skill three-jsReview the files below or copy the command above to add this skill to your agents.
---
name: three-js
description: |
This skill should be used when the user asks to "create a 3D scene", "add a mesh",
"implement OrbitControls", "load a GLTF model", "add bloom post-processing",
"write a custom shader", "create particle effects", "optimize Three.js performance",
"use WebGPU", "add shadows", "animate a model", or mentions Three.js, threejs, WebGL,
WebGPU, GLTF, raycaster, shader material, PBR material, or post-processing effects.
IMPORTANT: This skill is for VANILLA Three.js (imperative JavaScript). For React Three
Fiber (@react-three/fiber, R3F, drei), check the `r3f-best-practices` skill, although three-js skills helps when working with R3F since R3F is a React renderer for Three.js.
Provides complete Three.js reference for 3D web graphics including scene setup,
geometry, materials, textures, lighting, cameras, loaders, animation, controls,
interaction, shaders, post-processing, performance optimization, TSL/node materials,
WebGPU, physics, and VR/XR integration.
---
# Three.js Complete Reference (Vanilla)
> **React Three Fiber users**: This reference is for vanilla Three.js. For R3F/Drei patterns,
> use the **`r3f-best-practices`** skill. However, understanding Three.js concepts here
> helps when working with R3F since R3F is a React renderer for Three.js.
## Quick Start
```javascript
import * as THREE from 'three';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
document.body.appendChild(renderer.domElement);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
scene.add(new THREE.AmbientLight(0xffffff, 0.5));
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5);
scene.add(light);
camera.position.z = 5;
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
```
## Reference Index
Load the appropriate reference file based on task:
### Core Foundation
| Reference | Use When |
|-----------|----------|
| `references/01-fundamentals.md` | Scene setup, renderer config, Object3D hierarchy, coordinate systems |
| `references/02-geometry.md` | Creating shapes, BufferGeometry, instancing, points, lines |
| `references/06-cameras.md` | Camera types, frustum, viewport, projection |
| `references/13-math.md` | Vector3, Matrix4, Quaternion, Euler, Color, MathUtils |
### Visual Appearance
| Reference | Use When |
|-----------|----------|
| `references/03-materials.md` | PBR materials, shader materials, all material types |
| `references/04-textures.md` | Texture loading, UV mapping, render targets, environment maps |
| `references/05-lighting.md` | Light types, shadows, IBL, light probes |
| `references/11-shaders.md` | Custom GLSL shaders, uniforms, varyings, shader patterns |
### Motion & Interaction
| Reference | Use When |
|-----------|----------|
| `references/08-animation.md` | Keyframe animation, skeletal, morph targets, procedural motion |
| `references/09-interaction.md` | Raycasting, selection, drag, coordinate conversion |
| `references/10-controls.md` | OrbitControls, FlyControls, PointerLockControls, etc. |
### Assets
| Reference | Use When |
|-----------|----------|
| `references/07-loaders.md` | GLTF, FBX, textures, HDR, Draco compression, async patterns |
### Effects
| Reference | Use When |
|-----------|----------|
| `references/12-postprocessing.md` | Bloom, DOF, SSAO, custom effects, EffectComposer |
### Advanced
| Reference | Use When |
|-----------|----------|
| `references/14-performance.md` | Optimization, profiling, LOD, culling, batching |
| `references/15-node-materials.md` | TSL (Three Shading Language), node-based materials |
| `references/16-physics-vr.md` | Physics engines, WebXR, VR/AR integration |
| `references/17-webgpu.md` | WebGPU renderer, compute shaders, WGSL |
| `references/18-patterns.md` | Architecture patterns, asset management, cleanup, state |
## Common Patterns Quick Reference
### Resize Handler
```javascript
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
```
### Cleanup/Dispose
```javascript
function dispose(obj) {
obj.traverse(child => {
if (child.geometry) child.geometry.dispose();
if (child.material) {
if (Array.isArray(child.material)) {
child.material.forEach(m => m.dispose());
} else {
child.material.dispose();
}
}
});
}
```
### Animation Loop with Clock
```javascript
const clock = new THREE.Clock();
function animate() {
const delta = clock.getDelta();
const elapsed = clock.getElapsedTime();
// Use delta for frame-rate independent animation
mixer?.update(delta);
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
```
## Import Patterns
```javascript
// Core
import * as THREE from 'three';
// Addons (controls, loaders, effects)
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
// Compression support
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';
```
## Version Notes
This reference targets Three.js r150+ with notes for:
- WebGPU support (r150+)
- Node materials / TSL
- Modern ES module imports
For version-specific APIs, check the Three.js migration guide.
This skill provides a complete, practical reference for building vanilla Three.js (imperative JavaScript) 3D web scenes. It focuses on scene setup, geometry, materials, loaders, animation, controls, shaders, post-processing, performance, WebGPU, physics, and XR integration. Use this skill when you need clear, executable guidance for Three.js r150+ patterns and APIs.
The skill inspects your goal and returns targeted Three.js guidance, code snippets, and patterns for vanilla JavaScript—no React wrappers. It covers renderer and camera configuration, object lifecycle and disposal, loaders (GLTF, HDR, Draco/KTX2), controls (OrbitControls), animation loops, raycasting, custom GLSL shaders, EffectComposer post-processing, WebGPU notes, and performance optimizations. Answers prioritize working examples, resize/cleanup best practices, and when-to-use recommendations.
Should I use this for React Three Fiber projects?
This skill covers vanilla Three.js. Concepts apply to R3F, but for React-specific patterns use a dedicated R3F guide.
How do I prevent memory leaks when replacing scenes or models?
Traverse removed objects and dispose geometries, materials (handle arrays), textures, and render targets; remove event listeners and stop animation loops.