home / skills / noklip-io / agent-skills / three-js

three-js skill

/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-js

Review the files below or copy the command above to add this skill to your agents.

Files (20)
SKILL.md
5.9 KB
---
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.

Overview

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.

How this skill works

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.

When to use it

  • Create a 3D scene, add meshes, lights, cameras, and basic animation.
  • Load GLTF/FBX models, apply PBR materials, or implement DRACO/KTX2 compression.
  • Add OrbitControls, raycasting-based interaction, or pointer drag/pick logic.
  • Write custom GLSL ShaderMaterial or use node/TSL materials.
  • Implement post-processing (bloom, DOF, SSAO) with EffectComposer.
  • Optimize performance: LOD, instancing, batching, culling, texture streaming, or migrate to WebGPU.

Best practices

  • Use devicePixelRatio clamping and resize handlers to balance quality and performance.
  • Dispose geometries, textures, and materials by traversing Object3D to avoid memory leaks.
  • Use BufferGeometry and InstancedMesh for large numbers of objects instead of many Meshes.
  • Animate with THREE.Clock and use delta time for frame-rate independent motion.
  • Prefer compressed textures (KTX2) and DRACO for model size reduction.
  • Profile with the browser devtools and disable expensive features (shadows, post-processing) on low-end devices.

Example use cases

  • Set up a lit environment with HDR environment map, PBR materials, and shadows.
  • Load a GLTF character, hook up a mixer for skeletal animation, and blend clips.
  • Add OrbitControls, implement raycast-based selection, and highlight chosen meshes.
  • Create a bloom post-processing pass with EffectComposer and selective render targets.
  • Write a simple fragment+vertex GLSL ShaderMaterial for a water or fire effect.
  • Migrate a renderer to WebGPU for compute or advanced performance scenarios (r150+).

FAQ

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.