réagir-trois-fibre est un moteur de rendu React pour threejs.
Construisez votre scène de manière déclarative avec des composants réutilisables et autonomes qui réagissent à l'état, sont facilement interactifs et peuvent participer à l'écosystème de React.
npm install three @types/three @react-three/fiber
Aucun. Tout ce qui fonctionne dans Threejs fonctionnera ici sans exception.
Non, il n’y a pas de frais généraux. Les composants sont rendus en dehors de React. Il surpasse Threejs en termes d'échelle grâce aux capacités de planification de React.
Oui. Il exprime simplement Threejs en JSX, <mesh />
se transforme dynamiquement en new THREE.Mesh()
. Si une nouvelle version de Threejs ajoute, supprime ou modifie des fonctionnalités, elle sera disponible instantanément sans dépendre des mises à jour de cette bibliothèque.
Créons un composant réutilisable qui a son propre état, réagit aux entrées de l'utilisateur et participe à la boucle de rendu. (démo en direct). |
import { createRoot } from 'react-dom/client'
import React , { useRef , useState } from 'react'
import { Canvas , useFrame } from '@react-three/fiber'
function Box ( props ) {
// This reference gives us direct access to the THREE.Mesh object
const ref = useRef ( )
// Hold state for hovered and clicked events
const [ hovered , hover ] = useState ( false )
const [ clicked , click ] = useState ( false )
// Subscribe this component to the render-loop, rotate the mesh every frame
useFrame ( ( state , delta ) => ( ref . current . rotation . x += delta ) )
// Return the view, these are regular Threejs elements expressed in JSX
return (
< mesh
{ ... props }
ref = { ref }
scale = { clicked ? 1.5 : 1 }
onClick = { ( event ) => click ( ! clicked ) }
onPointerOver = { ( event ) => hover ( true ) }
onPointerOut = { ( event ) => hover ( false ) } >
< boxGeometry args = { [ 1 , 1 , 1 ] } / >
< meshStandardMaterial color = { hovered ? 'hotpink' : 'orange' } / >
< / 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 > ,
)
npm install @types/three
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'
function Box ( props : ThreeElements [ 'mesh' ] ) {
const ref = useRef < THREE . Mesh > ( null ! )
const [ hovered , hover ] = useState ( false )
const [ clicked , click ] = useState ( false )
useFrame ( ( state , delta ) => ( ref . current . rotation . x += delta ) )
return (
< mesh
{ ... props }
ref = { ref }
scale = { clicked ? 1.5 : 1 }
onClick = { ( event ) => click ( ! clicked ) }
onPointerOver = { ( event ) => hover ( true ) }
onPointerOut = { ( event ) => hover ( false ) } >
< boxGeometry args = { [ 1 , 1 , 1 ] } / >
< meshStandardMaterial color = { hovered ? 'hotpink' : 'orange' } / >
< / mesh >
)
}
createRoot ( document . getElementById ( 'root' ) as HTMLElement ) . 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 > ,
)
Démo en direct : https://codesandbox.io/s/icy-tree-brnsm?file=/src/App.tsx
Cet exemple s'appuie sur React 18 et utilise expo-cli
, mais vous pouvez créer un projet nu avec leur modèle ou avec la CLI react-native
.
# Install expo-cli, this will create our app
npm install expo-cli -g
# Create app and cd into it
expo init my-app
cd my-app
# Install dependencies
npm install three @react-three/fiber@beta react@rc
# Start
expo start
Une certaine configuration peut être nécessaire pour informer le bundler Metro de vos actifs si vous utilisez des abstractions useLoader
ou Drei comme useGLTF
et useTexture
:
// metro.config.js
module . exports = {
resolver : {
sourceExts : [ 'js' , 'jsx' , 'json' , 'ts' , 'tsx' , 'cjs' ] ,
assetExts : [ 'glb' , 'png' , 'jpg' ] ,
} ,
}
import React , { useRef , useState } from 'react'
import { Canvas , useFrame } from '@react-three/fiber/native'
function Box ( props ) {
const mesh = useRef ( null )
const [ hovered , setHover ] = useState ( false )
const [ active , setActive ] = useState ( false )
useFrame ( ( state , delta ) => ( mesh . current . rotation . x += delta ) )
return (
< mesh
{ ... props }
ref = { mesh }
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 >
)
}
Visitez docs.pmnd.rs
Vous devez maîtriser à la fois React et Threejs avant de vous lancer dans cela. Si vous n'êtes pas sûr de React, consultez la documentation officielle de React, en particulier la section sur les hooks. Quant à Threejs, assurez-vous de consulter au moins les liens suivants :
Quelques documents utiles :
Il existe un écosystème dynamique et étendu autour des trois fibres, rempli de bibliothèques, d'aides et d'abstractions.
@react-three/drei
– des aides utiles, c'est un écosystème en soi@react-three/gltfjsx
– transforme les GLTF en composants JSX@react-three/postprocessing
– effets de post-traitement@react-three/uikit
– Composants d'interface utilisateur rendus WebGL pour trois fibres@react-three/test-renderer
– pour les tests unitaires dans le nœud@react-three/offscreen
– toile hors écran/travailleur pour réagir-trois-fibres@react-three/flex
– flexbox pour réagir-trois-fibre@react-three/xr
– Contrôleurs et événements VR/AR@react-three/csg
– géométrie solide constructive@react-three/rapier
– Physique 3D utilisant Rapier@react-three/cannon
– Physique 3D avec Cannon@react-three/p2
– Physique 2D utilisant P2@react-three/a11y
– un vrai a11y pour votre scène@react-three/gpu-pathtracer
– traçage de chemin réalistecreate-r3f-app next
– démarreur nextjslamina
– matériaux de shader à base de coucheszustand
– gestion d'état basée sur les fluxjotai
– gestion d'état basée sur les atomesvaltio
– gestion d'état basée sur un proxyreact-spring
– une bibliothèque d'animation basée sur la physique du printempsframer-motion-3d
– framer motion, une bibliothèque d'animation populaireuse-gesture
– gestes de souris/tactileleva
– créer des contrôles GUI en quelques secondesmaath
– un évier de cuisine pour les aides en mathématiquesminiplex
– ECS (système de gestion d'entité)composer-suite
– composition de shaders, de particules, d'effets et de mécanismes de jeutriplex
– éditeur de scène pour React-Three-Fiberkoestlich
– Bibliothèque de composants d'interface utilisateur pour React-Three-FiberTendance d'utilisation de la famille @react-trois
Une petite sélection d'entreprises et de projets s'appuyant sur les trois fibres.
vercel
(agence de design)basement
(agence de design)studio freight
(agence de design)14 islands
(agence de design)ueno
(agence de design) — vidéoflux.ai
(constructeur de PCB)colorful.app
(modélisateur)bezi
(modéliste)readyplayer.me
(configurateur d'avatar)zillow
(immobilier)lumalabs.ai/genie
(modèles IA)skybox.blockadelabs
(envmaps IA)3dconfig
(planificateur de sol)buerli.io
(CAD)getencube
(CAD)glowbuzzer
(CAD) — vidéotriplex
(éditeur) — vidéotheatrejs
(éditeur) — vidéo Si vous aimez ce projet, pensez à nous aider. Toutes les contributions sont les bienvenues ainsi que les dons à Opencollective, ou en crypto BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH
, ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682
.
Merci à tous nos contributeurs !
Ce projet existe grâce à toutes les personnes qui y contribuent.