A growing collection of useful helpers and abstractions for react-three-fiber, saving you some boilerplate.
If you find yourself repeating set-up code often and if it's generic enough, add it here, everyone benefits!
Requirements
- Types
- ForwardRefs if possible, so that objects can be referenced back
- Invalidate frames on any movement for those using invalidateFrameloop
- Cleanup on unmount, no left-overs, restore previous states
yarn add drei
import { ... } from 'drei'
Index
<PerspectiveCamera />
<OrbitControls />
<MapControls />
<TrackballControls />
<TransformControls />
<Detailed />
<PositionalAudio />
<StandardEffects />
<Sky />
<HTML />
<Stats />
draco()
Exports
Cameras
⚡️ <PerspectiveCamera />
A responsive, perspective camera that sets itself as the default. Can take children, which from then on move along.
<PerspectiveCamera
makeDefault
{...props}
>
<mesh />
</PerspectiveCamera>
Controls
If available controls have damping enabled by default, they manage their own updates, remove themselves on unmount, are compatible with the invalidateFrameloop
canvas-flag. They inherit all props from their underlying THREE controls.
⚡️ <OrbitControls />
⚡️ <MapControls />
⚡️ <TrackballControls />
⚡️ <TransformControls />
Abstractions
⚡️ <Detailed
>
A wrapper around THREE.LOD (Level of detail).
<Detailed
distances={[0, 10, 20]}
{...props}
>
<mesh geometry={highDetail} />
<mesh geometry={mediumDetail} />
<mesh geometry={lowDetail} />
</Detailed>
⚡️ <PositionalAudio />
A wrapper around THREE.PositionalAudio. Add this to groups or meshes to tie them to a sound that plays when the camera comes near.
<mesh>
<PositionalAudio
url="/sound.mp3" // Url of the sound file
distance={1} // Camera distance (default=1)
loop // Repat play (default=true)
{...props} // All THREE.PositionalAudio props are valid
/>
</mesh>
⚡️ <StandardEffects />
Adds ambient-occlusion, bloom and SMAA using the postprocessing library.
<StandardEffects
ao
bloom
edgeDetection = 0.1
bloomOpacity = 1
/>
Shaders
⚡️ <Sky />
From: https://threejs.org/examples/webgl_shaders_sky.html
<Sky
distance={450000}
sunPosition={[0, 1, 0]}
{...props}
/>
Misc
⚡️ <HTML />
Allows you to tie HTML content to any object of your scene. It will be projected to the objects whereabouts automatically.
<HTML
prepend = false
center = false
scaleFactor
zIndexRange
portal
{...groupProps}
{...divProps}
>
<h1>hello</h1>
<p>world</p>
</HTML>
⚡️ <Stats />
Adds stats to document.body. It takes over the render-loop!
<Stats
showPanel={0}
{...props}
/>
⚡️ draco()
Adds the Draco extension to your GLTFLoader.
useLoader(
GLTFLoader,
url,
draco(binUrl)
)