Threejs
A Claude Code plugin marketplace with specialized AI skills for trading, finance, music, 3D graphics, and more.
npx -y skills add socreative/my-claude --skill threejsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Expert knowledge of Three.js, the JavaScript 3D library for WebGL. Use this skill when the user asks to build 3D graphics, create WebGL scenes, work with cameras, lights, materials, geometries, animations, or post-processing in the browser.
SKILL.md
13.5 KB, as published. Nobody here has run it
Three.js 3D Graphics Expert
You are an expert in Three.js, the JavaScript 3D library for creating WebGL-based 3D graphics in the browser.
Core Concepts
The Three.js Workflow
Every Three.js application follows this fundamental pattern:
- Scene - Container that holds all 3D objects, lights, and cameras
- Camera - Defines the viewpoint for rendering
- Renderer - Draws the scene from the camera's perspective
- Geometry - Defines the shape/mesh data
- Material - Defines surface appearance
- Mesh - Combines geometry + material into a renderable object
- Animation Loop - Continuously renders and updates the scene
Basic Setup Pattern
// 1. Create scene
const scene = new THREE.Scene();
// 2. Setup camera
const camera = new THREE.PerspectiveCamera(
75, // Field of view
window.innerWidth / window.innerHeight, // Aspect ratio
0.1, // Near clipping plane
1000 // Far clipping plane
);
camera.position.z = 5;
// 3. Create renderer
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
document.body.appendChild(renderer.domElement);
// 4. Create object (geometry + material = mesh)
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
// 5. Add lights
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5);
scene.add(light);
scene.add(new THREE.AmbientLight(0xffffff, 0.5));
// 6. Animation loop
function animate() {
requestAnimationFrame(animate);
mesh.rotation.x += 0.01;
mesh.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
// 7. Handle window resize
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
API Categories
Cameras
PerspectiveCamera - Realistic perspective (most common)
- Parameters: FOV, aspect ratio, near plane, far plane
- Use for: Games, realistic scenes
OrthographicCamera - No perspective distortion
- Parameters: left, right, top, bottom, near, far
- Use for: 2D games, technical drawings, UI
CubeCamera - 6-direction rendering for environment maps ArrayCamera - Multiple viewports (split-screen)
Lights
AmbientLight - Uniform lighting from all directions
- No shadows, affects all objects equally
- Use for: Base ambient illumination
DirectionalLight - Parallel rays (sun-like)
- Supports shadows
- Use for: Outdoor scenes, sunlight
PointLight - Omnidirectional from a point (light bulb)
- Supports shadows
- Use for: Indoor lighting, lamps
SpotLight - Cone-shaped directional light
- Supports shadows, adjustable angle and penumbra
- Use for: Stage lighting, flashlights
HemisphereLight - Gradient between sky and ground color
- No shadows, very efficient
- Use for: Outdoor ambient with color variation
RectAreaLight - Rectangular area light (realistic)
- No shadows, only works with MeshStandardMaterial/MeshPhysicalMaterial
- Use for: Windows, LED panels
Materials
MeshBasicMaterial - Unlit, flat color
- Fastest, no lighting calculations
- Use for: UI elements, debugging
MeshLambertMaterial - Diffuse reflection only
- Good performance, matte appearance
- Use for: Non-shiny surfaces
MeshPhongMaterial - Specular highlights (Phong shading)
- Good balance of performance and quality
- Use for: Shiny surfaces, general purpose
MeshStandardMaterial - PBR (Physically Based Rendering)
- Metalness and roughness workflow
- Use for: Realistic materials (recommended for most cases)
MeshPhysicalMaterial - Advanced PBR
- Adds clearcoat, transmission, sheen
- Use for: Car paint, glass, fabrics
ShaderMaterial - Custom GLSL shaders
- Full control, requires shader knowledge
- Use for: Custom effects, advanced materials
LineBasicMaterial / LineDashedMaterial - For line rendering PointsMaterial - For point clouds SpriteMaterial - For billboards/sprites
Geometries
Primitives:
- BoxGeometry - Cube/rectangular prism
- SphereGeometry - Sphere
- PlaneGeometry - Flat plane
- CylinderGeometry - Cylinder
- ConeGeometry - Cone
- TorusGeometry - Donut shape
- TorusKnotGeometry - 3D knot
Advanced:
- ExtrudeGeometry - Extrude 2D shapes into 3D
- LatheGeometry - Surface of revolution
- TubeGeometry - Tube along a path
- ShapeGeometry - 2D shapes
- BufferGeometry - Custom geometry (most efficient)
Objects
Mesh - Visible object (geometry + material) Group - Container for organizing multiple objects Line / LineSegments - Line rendering Points - Point cloud rendering Sprite - 2D billboard (always faces camera) SkinnedMesh - Mesh with skeletal animation InstancedMesh - Efficient rendering of many identical objects LOD (Level of Detail) - Automatic detail switching based on distance
Loaders
GLTFLoader - glTF/glB format (recommended for 3D models)
- Industry standard, supports animations, materials, PBR
- Use for: Most 3D models
FBXLoader - Autodesk FBX format OBJLoader - Wavefront OBJ (geometry only) TextureLoader - Load image textures (JPG, PNG) CubeTextureLoader - Skybox/environment maps FontLoader - Load fonts for TextGeometry AudioLoader - Load audio files for 3D audio
Textures
Texture Types:
- Color/Diffuse Map - Base color
- Normal Map - Surface detail without geometry
- Bump Map - Height-based surface detail
- Displacement Map - Actual geometry displacement
- Roughness Map - Surface roughness (PBR)
- Metalness Map - Metallic properties (PBR)
- AO Map (Ambient Occlusion) - Shadowing in crevices
- Environment Map - Reflections and lighting
Texture Settings:
const texture = textureLoader.load('texture.jpg');
texture.wrapS = THREE.RepeatWrapping; // U direction
texture.wrapT = THREE.RepeatWrapping; // V direction
texture.repeat.set(4, 4);
texture.minFilter = THREE.LinearMipmapLinearFilter;
texture.magFilter = THREE.LinearFilter;
texture.anisotropy = renderer.capabilities.getMaxAnisotropy();
Animation
AnimationMixer - Controls animation playback AnimationClip - Animation data AnimationAction - Running animation instance KeyframeTrack - Timeline data for properties
const mixer = new THREE.AnimationMixer(mesh);
const action = mixer.clipAction(animationClip);
action.play();
// In animation loop
const clock = new THREE.Clock();
function animate() {
const delta = clock.getDelta();
mixer.update(delta);
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
Controls
OrbitControls - Mouse/touch orbit, zoom, pan (most common) FlyControls - Flight simulator-style FirstPersonControls - FPS-style movement TrackballControls - Unrestricted rotation PointerLockControls - FPS pointer lock TransformControls - Gizmo for moving objects
Helpers
AxesHelper - RGB axes (X=red, Y=green, Z=blue) GridHelper - Ground plane grid CameraHelper - Visualize camera frustum DirectionalLightHelper - Show light direction SpotLightHelper - Show spotlight cone BoxHelper - Bounding box visualization ArrowHelper - Direction arrow SkeletonHelper - Visualize bone structure
Math Utilities
Vector2, Vector3, Vector4 - Vector operations Quaternion - Rotation (avoids gimbal lock) Euler - Euler angles (rotation in degrees/radians) Matrix3, Matrix4 - Transformation matrices Box3 - 3D bounding box Sphere - Bounding sphere Plane - Mathematical plane Ray - Ray for raycasting Color - Color manipulation
Common Patterns
Raycasting (Mouse Picking)
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
window.addEventListener('click', (event) => {
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects(scene.children);
if (intersects.length > 0) {
console.log('Clicked:', intersects[0].object);
}
});
Loading 3D Models
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
const loader = new GLTFLoader();
loader.load('model.glb', (gltf) => {
const model = gltf.scene;
scene.add(model);
// Play animations if available
if (gltf.animations.length > 0) {
const mixer = new THREE.AnimationMixer(model);
gltf.animations.forEach((clip) => {
mixer.clipAction(clip).play();
});
}
}, undefined, (error) => {
console.error('Loading error:', error);
});
Post-Processing Effects
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';
const composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
composer.addPass(new UnrealBloomPass(
new THREE.Vector2(window.innerWidth, window.innerHeight),
1.5, // strength
0.4, // radius
0.85 // threshold
));
// In animation loop, use composer instead of renderer
composer.render();
Instanced Rendering (Performance)
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const count = 10000;
const mesh = new THREE.InstancedMesh(geometry, material, count);
const matrix = new THREE.Matrix4();
for (let i = 0; i < count; i++) {
matrix.setPosition(
Math.random() * 100 - 50,
Math.random() * 100 - 50,
Math.random() * 100 - 50
);
mesh.setMatrixAt(i, matrix);
}
scene.add(mesh);
Performance Optimization
- Use InstancedMesh for many identical objects
- Merge geometries when possible with BufferGeometryUtils
- Use texture atlases to reduce draw calls
- Implement frustum culling - objects outside view aren't rendered (automatic)
- Use LOD for distant objects
- Dispose of unused resources:
geometry.dispose(),material.dispose(),texture.dispose() - Use lower-poly models for background objects
- Limit light count - each light adds computational cost
- Use shadowMap carefully - shadows are expensive
- Profile with
renderer.infoto see render stats
Common Use Cases
Games
- 3D environments with OrbitControls or FirstPersonControls
- Physics integration (Rapier, Cannon.js)
- Character animation with SkinnedMesh
- Raycasting for interactions
Data Visualization
- 3D charts and graphs with custom geometries
- Particle systems with Points
- Interactive exploration with OrbitControls
Product Configurators
- glTF model loading
- Material/texture swapping
- Camera animations
- Environment maps for realistic reflections
WebXR (VR/AR)
- WebXRManager for VR/AR sessions
- Controller input handling
- Hand tracking
- Immersive 3D experiences
Architectural Visualization
- Orthographic camera for technical views
- Realistic materials with MeshPhysicalMaterial
- Lightmaps for baked lighting
- High-quality shadows
Best Practices
- Always dispose of geometries, materials, and textures when removing objects
- Use requestAnimationFrame for animation loops, not setInterval
- Update matrices manually with
mesh.updateMatrix()when needed - Use Clock for delta time to ensure consistent animation speed
- Set pixelRatio properly:
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)) - Handle window resize to update camera and renderer
- Use development mode for debugging, production mode for deployment
- Test performance on target devices early
- Use appropriate materials - not everything needs PBR
- Structure scene hierarchically with Groups for easier management
Debugging Tips
// Show wireframes
material.wireframe = true;
// Show normals
const helper = new THREE.VertexNormalsHelper(mesh, 1, 0xff0000);
scene.add(helper);
// Log renderer info
console.log(renderer.info);
// Check bounding boxes
const box = new THREE.Box3().setFromObject(mesh);
console.log('Bounding box:', box);
Resources
Official Documentation: https://threejs.org/docs/ Examples: https://threejs.org/examples/ Manual: https://threejs.org/manual/ Editor: https://threejs.org/editor/ GitHub: https://github.com/mrdoob/three.js
Installation
# npm
npm install three
# Import in JavaScript
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
Response Format
When helping with Three.js:
- Identify the core concept (Scene, Camera, Renderer, etc.)
- Provide working code examples
- Explain performance implications
- Suggest appropriate materials and techniques
- Link to relevant documentation or examples
- Consider browser compatibility and mobile performance
- Recommend best practices for production use