three-js

Creates 3D scenes, models, and effects in web browsers using Three.js and WebGL.

Installation
Run `npx skills add "https://github.com/noklip-io/agent-skills" --skill "three-js"` to install this skill, then follow its SKILL.md instructions for my next request.

Paste this into Claude Code, Cursor, or any agent that can run commands.

SKILL.mdShow the author's original SKILL.md
---
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.

Ships with 19 supporting files:

  • README.md
  • references/01-fundamentals.md
  • references/02-geometry.md
  • references/03-materials.md
  • references/04-textures.md
  • references/05-lighting.md
  • references/06-cameras.md
  • references/07-loaders.md
  • references/08-animation.md
  • references/09-interaction.md
  • references/10-controls.md
  • references/11-shaders.md
  • references/12-postprocessing.md
  • references/13-math.md
  • references/14-performance.md
  • references/15-node-materials.md
  • references/16-physics-vr.md
  • references/17-webgpu.md
  • references/18-patterns.md

Mirrored from the author's public source. Install counts from the open skills registry.

The systems behind these skills get built for partners every week.

Partner with us