Un tuffo in React e Three.js usando react-three-fiber

Pubblicato: 2022-03-10
Riepilogo rapido ↬ react-three-fiber è un potente renderer Three.js che aiuta a renderizzare modelli 3D e animazioni per React e le sue applicazioni native. In questo tutorial imparerai come configurare e costruire modelli 3D in un'applicazione React.

Oggi impareremo come configurare e utilizzare react-three-fiber per costruire e visualizzare modelli 3D e animazioni nelle applicazioni React e React Native.

Questo tutorial è per gli sviluppatori che vogliono saperne di più sulle animazioni del modello 3D nel Web utilizzando React e per chiunque abbia avuto limitazioni con Three.js come l'impossibilità di creare canvas, associare eventi utente come eventi click e avviare un ciclo di rendering, react-three-fiber viene fornito con questi metodi. Costruiremo un modello 3D per capire meglio come costruire modelli 3D Three.js usando react-three-fiber .

Per iniziare con react-three-fiber

Three.js è una libreria che semplifica la creazione di grafica 3D nel browser, utilizza una tela + WebGL per visualizzare i modelli 3D e le animazioni, puoi saperne di più qui.

react-three-fiber è un renderer React per Three.js sul web e react-native, è una spinta alla velocità con cui crei modelli 3D e animazioni con Three.js, alcuni esempi di siti con modelli 3D e animazioni può essere trovato qui. react-three-fiber riduce il tempo speso per le animazioni a causa dei suoi componenti riutilizzabili, eventi di binding e loop di rendering, prima diamo un'occhiata a cosa è Three.js.

react-three-fiber ci consente di costruire componenti del codice threeJS usando lo stato React, hook e props, inoltre include i seguenti elementi:

Elemento Descrizione
mesh Una proprietà che aiuta a definire la forma dei nostri modelli
hooks react-three-fiber definisce hook che ci aiutano a scrivere funzioni che aiutano a definire eventi utente come onClick e onPointOver
Ciclo di rendering e basato su componenti react-three-fiber è basato su componenti e rende in base a un cambiamento di stato o al negozio
Altro dopo il salto! Continua a leggere sotto ↓

Come usare react-three-fiber

Per utilizzare react-three-fiber , inizi utilizzando i comandi seguenti:

NPM

 npm i three react-three-fiber

FILATO

 yarn add three react-three-fiber

Nota : per far funzionare react-three-fiber , dovrai installarne three (Three.js) come abbiamo fatto sopra.

Costruire un progetto di animazione e modello di dadi Ludo React 3D

Qui costruiremo un modello di dadi ludo 3D usando react-three-fiber come nel video qui sotto.

Useremo create-react-app per inizializzare il nostro progetto, per farlo eseguiamo il comando qui sotto sul nostro terminale.

 create-react-app react-three-fiber-ludo-model

Il comando sopra inizializza un progetto React all'interno della nostra macchina locale, quindi inseriamo cd nella directory e installiamo i nostri pacchetti react-three-fiber e three .

 cd react-three-fiber-ludo-model npm i three react-three-fiber

Una volta installati i pacchetti, avviamo il nostro server di sviluppo utilizzando il comando

 npm start

Il comando sopra dovrebbe avviare il nostro server di sviluppo del progetto nel nostro browser. Quindi apriamo il nostro progetto nel nostro editor di testo preferito, all'interno della nostra cartella src del progetto, elimina i seguenti file: App.css , App.test.js , serviceWorker.js e setupTests.js . Quindi, eliminiamo tutto il codice che fa riferimento ai file eliminati sul nostro App.js .

Per questo progetto, avremo bisogno di un componente Box per i nostri ludo dices e il nostro componente App fornito da React.

Costruire il componente Box

Il componente Box conterrà la forma per i nostri dadi ludo, un'immagine di un dado ludo e uno stato per mantenerlo sempre in rotazione. Per prima cosa, importiamo di seguito tutti i pacchetti di cui abbiamo bisogno per il nostro componente Box .

 import React, { useRef, useState, useMemo } from "react"; import { Canvas, useFrame } from "react-three-fiber"; import * as THREE from "three"; import five from "./assets/five.png";

Nel codice sopra, stiamo importando useRef , useState e useMemo . Useremo il gancio useRef per accedere alla mesh dei dadi e il gancio useState per verificare lo stato attivo dei dadi ludo. useMemo hook verrà utilizzato per restituire il numero sui dadi. Successivamente, stiamo importando Canvas e useFrame da react-three-fiber , il canvas viene utilizzato per disegnare la grafica sul browser, mentre useFrame consente ai componenti di agganciarsi al render-loop, questo rende possibile il rendering di un componente il contenuto di un altro. Successivamente, abbiamo importato i three pacchetti e quindi abbiamo importato un'immagine statica di un dado ludo.

Il prossimo passo per noi è scrivere la logica per il nostro componente Box . Innanzitutto, inizieremo con la creazione di un componente funzionale e aggiungeremo uno stato al nostro componente, facciamolo di seguito.

 const Box = (props) => { const mesh = useRef(); const [active, setActive] = useState(false); useFrame(() => { mesh.current.rotation.x = mesh.current.rotation.y += 0.01; }); const texture = useMemo(() => new THREE.TextureLoader().load(five), []); return ( <Box /> ); }

Nel codice sopra, stiamo creando un componente Box con oggetti di scena, quindi creiamo un ref chiamato mesh usando il gancio useRef , lo abbiamo fatto in modo da poter restituire sempre la stessa mesh ogni volta.

Una mesh è un elemento visivo in una scena, è un oggetto 3D che costituisce un poligono triangolare, di solito è costruito utilizzando una Geometria, che viene utilizzata per definire la forma del modello e Materiale che definisce l'aspetto del modello, è possibile scopri una mesh qui, puoi anche saperne di più sul gancio useRef qui.

Dopo aver inizializzato una mesh , dobbiamo inizializzare uno stato per la nostra applicazione usando l'hook useState , qui impostiamo lo stato attivo e sospeso dell'applicazione su false.

Successivamente, utilizziamo il gancio useFrame di react-three-fiber per ruotare la mesh (ludo dice), usando il codice seguente

 mesh.current.rotation.x = mesh.current.rotation.y += 0.01;

Qui, stiamo ruotando la posizione corrente della mesh ogni 0,01 secondi, questo viene fatto per dare una buona animazione alla rotazione.

 const texture = useMemo(() => new THREE.TextureLoader().load(five), []);

Nel codice sopra, stiamo creando una costante chiamata texture e passando in un hook useMemo come funzione per caricare un nuovo lancio di dadi, qui useMemo per memorizzare l'immagine del dado e il suo numero. Puoi conoscere il hook useMemo qui.

Successivamente, vogliamo eseguire il rendering del componente Box sul browser e aggiungere i nostri eventi, lo facciamo di seguito

 const Box = (props) => { return ( <mesh {...props} ref={mesh} scale={active ? [2, 2, 2] : [1.5, 1.5, 1.5]} onClick={(e) => setActive(!active)} > <boxBufferGeometry args={[1, 1, 1]} /> <meshBasicMaterial attach="material" transparent side={THREE.DoubleSide}> <primitive attach="map" object={texture} /> </meshBasicMaterial> </mesh> ); }

Nel codice sopra, stiamo restituendo il nostro componente Box e avvolgendolo nella mesh abbiamo passato tutte le proprietà del componente Box usando l'operatore spread, quindi abbiamo fatto riferimento alla mesh usando l'hook useRef . Successivamente, utilizziamo la proprietà scale di Three.js per impostare la dimensione della casella dei dadi quando è attiva su 2 e 1,5 quando non lo è. Ultimo ma non meno importante, abbiamo aggiunto un evento onClick per impostare lo state su active se non è impostato su predefinito.

 <boxBufferGeometry args={[1, 1, 1]} />

Per eseguire il rendering della scatola dei dadi, abbiamo eseguito il rendering del componente boxBufferGeometry da Three.js, boxBufferGeometry ci aiuta a disegnare linee e punti come scatole, abbiamo usato l'argomento args per passare costruttori come la dimensione della geometria della scatola.

 <meshBasicMaterial attach="material" transparent side={THREE.DoubleSide}>

Il meshBasicMaterial di Three.js viene utilizzato per disegnare geometrie in una forma semplice. Qui abbiamo passato l'attributo attach e abbiamo passato un props THREE.DoubleSide all'attributo side . Il THREE.DoubleSide definisce i lati o gli spazi che dovrebbero essere resi da react-three-fiber .

 <primitive attach="map" object={texture} />

Il componente primitive di Three.js viene utilizzato per disegnare grafici 3D. Abbiamo allegato la proprietà della mappa per mantenere la forma originale dei dadi ludo. Successivamente, renderemo il nostro componente Box nel file App.js e completeremo la nostra scatola di dadi ludo 3d. Il tuo componente dovrebbe essere simile all'immagine qui sotto.

Componente box per box ludo 3D

Rendering 3D Ludo Dice Box

In questa sezione, renderemo il nostro componente Box nel nostro App.js e completeremo il nostro ludo box 3d, per farlo prima, creiamo un componente App e lo avvolgiamo con un tag Canvas , questo per renderizzare i nostri modelli 3D, facciamolo qui sotto.

 const App = () => { return ( <Canvas> </Canvas> ); } export default App;

Successivamente, aggiungiamo una luce alle scatole, react-three-fiber ci fornisce tre componenti per illuminare i nostri modelli, sono i seguenti

  • ambientLight
    Questo è usato per illuminare tutti gli oggetti in una scena o modello allo stesso modo, accetta oggetti di scena come l'intensità della luce, questo illuminerà il corpo dei dadi ludo.
  • spotLight
    Questa luce viene emessa da un'unica direzione e aumenta all'aumentare delle dimensioni dell'oggetto, questo illuminerà i punti dei dadi ludo.
  • pointLight
    Funziona in modo simile alla luce di una lampadina, la luce viene emessa da un unico punto in tutte le direzioni, questo sarà necessario per lo stato attivo della nostra applicazione.

Implementiamo quanto sopra sulla nostra applicazione di seguito.

 const App = () => { return ( <Canvas> <ambientLight intensity={0.5} /> <spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} /> <pointLight position={[-10, -10, -10]} /> </Canvas> ); } export default App;

Nel codice sopra, abbiamo importato il componente ambientLight da react-three-fiber e aggiunto un'intensità di 0,5, quindi abbiamo aggiunto una posizione e un angolo al nostro componente spotLight e pointLight . Il passaggio finale della nostra applicazione è rendere il nostro componente box e aggiungere una posizione alle scatole dei dadi ludo, lo faremmo nel codice seguente

 <Box position={[-1.2, 0, 0]} /> <Box position={[2.5, 0, 0]} />

Al termine, i tuoi dadi ludo 3D dovrebbero essere simili all'immagine qui sotto:

Scatola di dadi ludo 3D

Una demo funzionante è disponibile su CodeSandbox.

Conclusione

react-three-fiber ha reso più facile creare animazioni e modelli 3D per le applicazioni React e React Native. Costruendo la nostra scatola di dadi ludo 3D, abbiamo appreso le basi di Three.js insieme ai suoi componenti e ai vantaggi di react-three-fiber , nonché a come usarlo.

Puoi spingerti oltre costruendo modelli 3D e animazioni nelle tue applicazioni React e Native usando il tuo react-three-fiber . Mi piacerebbe vedere quali novità ti vengono in mente!

Puoi leggere di più su Three.js e react-three-fiber nei riferimenti seguenti.

Risorse correlate

  • Documentazione Three.js
  • Fondamenti di Three.js
  • Repo React-Three-fiber GitHub di Poimandres
  • documentazione di reazione a tre fibre
  • Documentazione ufficiale di React Hooks (useState, useMemo, ecc.).