docs/getting-started/introduction.mdx
npm install three @types/three @react-three/fiber
[!WARNING]
Three-fiber is a React renderer, it must pair with a major version of React, just like react-dom, react-native, etc. @react-three/fiber@8 pairs with react@18, @react-three/fiber@9 pairs with react@19.
None. Everything that works in Threejs will work here without exception.
No. There is no overhead. Components render outside of React. It outperforms Threejs in scale due to React's scheduling abilities.
Yes. It merely expresses Threejs in JSX, <mesh /> dynamically turns into new THREE.Mesh(). If a new Threejs version adds, removes or changes features, it will be available to you instantly without depending on updates to this library.
Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop:
<Sandpack customSetup={{ dependencies: { 'react': 'latest', 'react-dom': 'latest', 'three': 'latest', '@react-three/fiber': 'latest' }, entry: '/index.jsx', }} folder="basic-example-sandpack" />
<details> <summary>Show TypeScript example</summary>npm install @types/three
<Sandpack
customSetup={{
dependencies: {
'react': 'latest',
'react-dom': 'latest',
'three': 'latest',
'@types/three': 'latest',
'@react-three/fiber': 'latest'
},
entry: '/index.tsx',
main: '/index.tsx',
}}
files={{
'/styles.css': html,body,#root {height:100%;margin:unset;},
'/index.tsx': `import * as THREE from 'three'
import { createRoot } from 'react-dom/client'
import React, { useRef, useState } from 'react'
import { Canvas, useFrame, ThreeElements } from '@react-three/fiber'
import './styles.css'
function Box(props: ThreeElements['mesh']) { const meshRef = useRef<THREE.Mesh>(null!) const [hovered, setHover] = useState(false) const [active, setActive] = useState(false) useFrame((state, delta) => (meshRef.current.rotation.x += delta)) return ( <mesh {...props} ref={meshRef} scale={active ? 1.5 : 1} onClick={(event) => setActive(!active)} onPointerOver={(event) => setHover(true)} onPointerOut={(event) => setHover(false)}> <boxGeometry args={[1, 1, 1]} /> <meshStandardMaterial color={hovered ? 'hotpink' : '#2f74c0'} /> </mesh> ) }
createRoot(document.getElementById('root')).render( <Canvas> <ambientLight intensity={Math.PI / 2} /> <spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} /> <pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} /> <Box position={[-1.2, 0, 0]} /> <Box position={[1.2, 0, 0]} /> </Canvas>, )`, }} />
</details> <details> <summary>Show React Native example</summary>For installation instructions see react native installation instructions.
import React, { useRef, useState } from 'react'
import { Canvas, useFrame } from '@react-three/fiber/native'
function Box(props) {
const meshRef = useRef(null)
const [hovered, setHover] = useState(false)
const [active, setActive] = useState(false)
useFrame((state, delta) => (meshRef.current.rotation.x += delta))
return (
<mesh
{...props}
ref={meshRef}
scale={active ? 1.5 : 1}
onClick={(event) => setActive(!active)}
onPointerOver={(event) => setHover(true)}
onPointerOut={(event) => setHover(false)}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
</mesh>
)
}
export default function App() {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Box position={[-1.2, 0, 0]} />
<Box position={[1.2, 0, 0]} />
</Canvas>
)
}
You need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the official React docs, especially the section about hooks. As for Threejs, make sure you at least glance over the following links:
Some helpful material:
There is a vibrant and extensive ecosystem around three-fiber, full of libraries, helpers and abstractions.
@react-three/drei – useful helpers, this is an ecosystem in itself@react-three/gltfjsx – turns GLTFs into JSX components@react-three/postprocessing – post-processing effects@react-three/test-renderer – for unit tests in node@react-three/flex – flexbox for react-three-fiber@react-three/xr – VR/AR controllers and events@react-three/csg – constructive solid geometry@react-three/rapier – 3D physics using Rapier@react-three/cannon – 3D physics using Cannon@react-three/p2 – 2D physics using P2@react-three/a11y – real a11y for your scene@react-three/gpu-pathtracer – realistic path tracingcreate-r3f-app next – nextjs starterlamina – layer based shader materialszustand – flux based state managementjotai – atoms based state managementvaltio – proxy based state managementreact-spring – a spring-physics-based animation libraryframer-motion-3d – framer motion, a popular animation libraryuse-gesture – mouse/touch gesturesleva – create GUI controls in secondsmaath – a kitchen sink for math helpersminiplex – ECS (entity management system)composer-suite – composing shaders, particles, effects and game mechanicsIf you like this project, please consider helping out. All contributions are welcome as well as donations to Opencollective, or in crypto BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH, ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682.
Thank you to all our backers! 🙏
<a href="https://opencollective.com/react-three-fiber#backers" target="_blank"> </a>This project exists thanks to all the people who contribute.
<a href="https://github.com/pmndrs/react-three-fiber/graphs/contributors"> </a>