React-Three-Fiber ist ein React-Renderer für ThreeJS.
Erstellen Sie Ihre Szene deklarativ mit wiederverwendbaren, eigenständigen Komponenten, die auf den Zustand reagieren, leicht interaktiv sind und am React-Ökosystem teilnehmen können.
npm install three @types/three @react-three/fiber
Keiner. Alles, was in Threejs funktioniert, wird hier ausnahmslos funktionieren.
Nein. Es gibt keinen Overhead. Komponenten werden außerhalb von React gerendert. Aufgrund der Planungsfähigkeiten von React übertrifft es Threejs im Umfang.
Ja. Es drückt lediglich Threejs in JSX aus,
wird dynamisch in new THREE.Mesh()
umgewandelt. Wenn eine neue Threejs-Version Funktionen hinzufügt, entfernt oder ändert, steht sie Ihnen sofort zur Verfügung, ohne auf Aktualisierungen dieser Bibliothek angewiesen zu sein.
Lassen Sie uns eine wiederverwendbare Komponente erstellen, die ihren eigenen Status hat, auf Benutzereingaben reagiert und an der Renderschleife teilnimmt. (Live-Demo). |
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 > ,
)
Live-Demo: https://codesandbox.io/s/icy-tree-brnsm?file=/src/App.tsx
Dieses Beispiel basiert auf React 18 und verwendet expo-cli
, aber Sie können ein reines Projekt mit ihrer Vorlage oder mit der react-native
-CLI erstellen.
# 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
Möglicherweise sind einige Konfigurationen erforderlich, um dem Metro-Bundler Ihre Assets mitzuteilen, wenn Sie useLoader
oder Drei-Abstraktionen wie useGLTF
und useTexture
verwenden:
// 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 >
)
}
Besuchen Sie docs.pmnd.rs
Sie müssen sich sowohl mit React als auch mit Threejs auskennen, bevor Sie sich darauf einlassen. Wenn Sie sich über React nicht sicher sind, konsultieren Sie die offiziellen React-Dokumente, insbesondere den Abschnitt über Hooks. Was Threejs betrifft, sollten Sie sich zumindest die folgenden Links ansehen:
Einige hilfreiche Materialien:
Rund um Three-Fiber gibt es ein lebendiges und umfangreiches Ökosystem voller Bibliotheken, Helfer und Abstraktionen.
@react-three/drei
– nützliche Helfer, das ist ein Ökosystem für sich@react-three/gltfjsx
– verwandelt GLTFs in JSX-Komponenten@react-three/postprocessing
– Nachbearbeitungseffekte@react-three/uikit
– WebGL-gerenderte UI-Komponenten für Three-Fiber@react-three/test-renderer
– für Unit-Tests im Knoten@react-three/offscreen
– Offscreen/Worker-Canvas für React-Three-Fiber@react-three/flex
– Flexbox für React-Three-Fiber@react-three/xr
– VR/AR-Controller und Events@react-three/csg
– konstruktive Volumengeometrie@react-three/rapier
– 3D-Physik mit Rapier@react-three/cannon
– 3D-Physik mit Cannon@react-three/p2
– 2D-Physik mit P2@react-three/a11y
– echtes A11y für deine Szene@react-three/gpu-pathtracer
– realistische Pfadverfolgungcreate-r3f-app next
– nextjs-Starterlamina
– schichtbasierte Shader-Materialienzustand
– flussbasiertes Zustandsmanagementjotai
– Atombasiertes Zustandsmanagementvaltio
– Proxy-basiertes Zustandsmanagementreact-spring
– eine auf Federphysik basierende Animationsbibliothekframer-motion-3d
– Framer Motion, eine beliebte Animationsbibliothekuse-gesture
– Maus-/Berührungsgestenleva
– GUI-Steuerelemente in Sekundenschnelle erstellenmaath
– eine Küchenspüle für Mathe-Helferminiplex
– ECS (Entity Management System)composer-suite
– Komponieren von Shader, Partikeln, Effekten und Spielmechanikentriplex
– Szeneneditor für React-Three-Fiberkoestlich
– UI-Komponentenbibliothek für React-Three-FiberNutzungstrend der @react-drei-Familie
Eine kleine Auswahl an Unternehmen und Projekten, die auf Dreifaser setzen.
vercel
(Designagentur)basement
(Designagentur)studio freight
(Designagentur)14 islands
(Designagentur)ueno
(Designagentur) – Videoflux.ai
(PCB-Builder)colorful.app
(Modellierer)bezi
(Modellbauer)readyplayer.me
(Avatar-Konfigurator)zillow
(Immobilien)lumalabs.ai/genie
(KI-Modelle)skybox.blockadelabs
(KI-Umgebungskarten)3dconfig
(Bodenplaner)buerli.io
(CAD)getencube
(CAD)glowbuzzer
(CAD) – Videotriplex
(Herausgeber) – Videotheatrejs
(Herausgeber) – Video Wenn Ihnen dieses Projekt gefällt, denken Sie bitte darüber nach, mitzuhelfen. Alle Beiträge sind willkommen, ebenso wie Spenden an Opencollective oder in Krypto BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH
, ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682
.
Vielen Dank an alle unsere Unterstützer!
Dieses Projekt existiert dank aller Menschen, die dazu beitragen.