Skills react-three-fiber
install
source · Clone the upstream repo
git clone https://github.com/TerminalSkills/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/TerminalSkills/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/react-three-fiber" ~/.claude/skills/terminalskills-skills-react-three-fiber && rm -rf "$T"
manifest:
skills/react-three-fiber/SKILL.mdsource content
React Three Fiber — Declarative Three.js for React
You are an expert in React Three Fiber (R3F), the React renderer for Three.js that lets developers build 3D scenes using JSX components. You help teams create interactive 3D websites, product configurators, data visualizations, games, and immersive experiences — using React patterns (hooks, state, props, suspense) instead of imperative Three.js code, with full access to the Three.js ecosystem.
Core Capabilities
Canvas and Scene Setup
import { Canvas } from "@react-three/fiber"; function App() { return ( <Canvas camera={{ position: [0, 2, 5], fov: 50 }} dpr={[1, 2]} // Adaptive pixel ratio gl={{ antialias: true, alpha: true }} shadows // Enable shadow maps > <ambientLight intensity={0.4} /> <directionalLight position={[5, 5, 5]} castShadow /> <mesh position={[0, 1, 0]} castShadow> <boxGeometry args={[1, 1, 1]} /> <meshStandardMaterial color="orange" /> </mesh> <mesh rotation={[-Math.PI / 2, 0, 0]} receiveShadow> <planeGeometry args={[10, 10]} /> <meshStandardMaterial color="#444" /> </mesh> </Canvas> ); }
Hooks
import { useFrame, useThree, useLoader } from "@react-three/fiber"; import { useRef } from "react"; import * as THREE from "three"; function SpinningBox() { const meshRef = useRef<THREE.Mesh>(null); const { viewport, camera } = useThree(); // Access Three.js internals // Runs every frame (60fps game loop) useFrame((state, delta) => { if (meshRef.current) { meshRef.current.rotation.y += delta; // Frame-rate independent // Hover effect: follow mouse meshRef.current.position.x = THREE.MathUtils.lerp( meshRef.current.position.x, (state.pointer.x * viewport.width) / 2, 0.1, ); } }); return ( <mesh ref={meshRef}> <boxGeometry /> <meshStandardMaterial color="hotpink" /> </mesh> ); }
Loading 3D Models
import { useGLTF, useAnimations } from "@react-three/drei"; import { useEffect } from "react"; function Character({ animation = "idle" }) { const { scene, animations } = useGLTF("/models/character.glb"); const { actions } = useAnimations(animations, scene); useEffect(() => { actions[animation]?.reset().fadeIn(0.3).play(); return () => { actions[animation]?.fadeOut(0.3); }; }, [animation, actions]); return <primitive object={scene} scale={1.5} />; } useGLTF.preload("/models/character.glb");
Events and Interaction
function InteractiveBox() { const [hovered, setHovered] = useState(false); const [clicked, setClicked] = useState(false); return ( <mesh scale={clicked ? 1.5 : 1} onClick={() => setClicked(!clicked)} onPointerOver={() => setHovered(true)} onPointerOut={() => setHovered(false)} > <boxGeometry /> <meshStandardMaterial color={hovered ? "hotpink" : "orange"} /> </mesh> ); } // R3F raycasts pointer events automatically — same API as DOM events
Installation
npm install three @react-three/fiber npm install @react-three/drei # Essential helpers npm install @react-three/postprocessing # Visual effects
Best Practices
- Everything is a component — Meshes, lights, cameras, groups are all JSX; compose scenes like React UIs
- useFrame for animation — Never use
;requestAnimationFrame
integrates with R3F's render loopuseFrame - Drei for shortcuts — Use
for OrbitControls, Environment, Text, Html, loaders; saves weeks of work@react-three/drei - Suspense for loading — Wrap
children in<Canvas>
for loading states<Suspense fallback={...}> - GLTF for models — Use
format; compress with Draco (.glb
); preload withnpx gltfjsx model.glb --dracouseGLTF.preload - Adaptive performance — Use
and<AdaptiveDpr>
from Drei; degrade quality on slow devices<PerformanceMonitor> - Pointer events — R3F raycasts automatically;
,onClick
work like DOM events on any meshonPointerOver - Instances for performance — Use
or<Instances>
for 100+ identical objects (trees, particles, stars)<InstancedMesh>