O scufundare în React și Three.js folosind react-three-fiber

Publicat: 2022-03-10
Rezumat rapid ↬ react-three-fiber este un instrument de redare puternic Three.js care ajută la redarea modelelor 3D și a animațiilor pentru React și aplicațiile sale native. În acest tutorial, veți învăța cum să configurați și să construiți modele 3D într-o aplicație React.

Astăzi, vom învăța cum să configuram și să folosim react-three-fiber pentru construirea și afișarea modelelor și animațiilor 3D în aplicațiile React și React Native.

Acest tutorial este pentru dezvoltatorii care doresc să afle mai multe despre animațiile modelului 3D de pe web folosind React și pentru oricine a avut limitări cu Three.js, cum ar fi incapacitatea de a crea pânză, de a lega evenimente utilizator, cum ar fi evenimentele de click și de a începe o buclă de randare, react-three-fiber vin cu aceste metode. Vom construi un model 3D pentru a înțelege mai bine cum să construim modele 3D Three.js folosind react-three-fiber .

Noțiuni introductive cu react-three-fiber

Three.js este o bibliotecă care facilitează crearea de grafică 3D în browser, folosește o pânză + WebGL pentru a afișa modelele și animațiile 3D, puteți afla mai multe aici.

react-three-fiber este un renderer React pentru Three.js pe web și react-native, este o creștere a vitezei cu care creați modele 3D și animații cu Three.js, câteva exemple de site-uri cu modele și animații 3D poate fi găsit aici. react-three-fiber reduce timpul petrecut cu animații datorită componentelor sale reutilizabile, a evenimentelor de legare și a buclei de randare, mai întâi să aruncăm o privire la ce este Three.js.

react-three-fiber ne permite să construim componente ale codului threeJS folosind starea React, cârlige și elemente de recuzită, de asemenea, vine cu următoarele elemente:

Element Descriere
mesh O proprietate care ajută la definirea formei modelelor noastre
hooks react-three-fiber definește cârlige care ne ajută să scriem funcții care ajută la definirea evenimentelor utilizatorului, cum ar fi onClick și onPointOver
Bucla de randare și bazată pe componente react-three-fiber este pe bază de componente și redă în funcție de schimbarea stării sau a depozitului
Mai multe după săritură! Continuați să citiți mai jos ↓

Cum se utilizează react-three-fiber

Pentru a utiliza react-three-fiber , începeți prin a utiliza comenzile de mai jos:

NPM

 npm i three react-three-fiber

Fire

 yarn add three react-three-fiber

Notă : pentru ca react-three-fiber să funcționeze, va trebui să instalați three (Three.js) așa cum am făcut mai sus.

Construirea unui model React 3D Ludo Dice și proiect de animație

Aici vom construi un model de zaruri ludo 3D folosind react-three-fiber așa cum avem în videoclipul de mai jos.

Vom folosi create-react-app pentru a inițializa proiectul nostru, pentru a face asta, să executăm comanda de mai jos pe terminalul nostru.

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

Comanda de mai sus inițializează un proiect React în mașina noastră locală, apoi să introducem cd -ul în director și să instalăm pachetele noastre react-three-fiber și three .

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

Odată ce pachetele sunt instalate, să pornim serverul nostru de dezvoltare folosind comanda

 npm start

Comanda de mai sus ar trebui să pornească serverul nostru de dezvoltare a proiectelor în browserul nostru. Apoi, să deschidem proiectul nostru în editorul nostru de text la alegere, în folderul nostru proiect src , ștergeți următoarele fișiere: App.css , App.test.js , serviceWorker.js și setupTests.js . Apoi, să ștergem tot codul care face referire la fișierele șterse din App.js

Pentru acest proiect, vom avea nevoie de o componentă Box pentru zarurile noastre ludo și componenta de App oferită de React.

Construirea componentei Box

Componenta Box va conține forma pentru zarurile noastre ludo, o imagine a unui zar ludo și o stare pentru a-l menține mereu în rotație. Mai întâi, să importăm toate pachetele de care avem nevoie pentru componenta noastră Box de mai jos.

 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";

În codul de mai sus, importăm useRef , useState și useMemo . Vom folosi cârligul useRef pentru a accesa rețeaua zarurilor și cârligul useState pentru a verifica starea activă a zarurilor ludo. useMemo hook va fi folosit pentru a returna numărul de pe zar. Apoi, importăm Canvas și useFrame din react-three-fiber , canvas -ul este folosit pentru a desena grafica în browser, în timp ce useFrame permite componentelor să se cupleze în bucla de randare, ceea ce face posibil ca o componentă să fie randată. continutul altuia. Apoi, am importat cele three pachete și apoi am importat o imagine statică a unui zar ludo.

Următorul pentru noi este să scriem logica pentru componenta noastră Box . În primul rând, vom începe cu construirea unei componente funcționale și vom adăuga o stare componentei noastre, să facem asta mai jos.

 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 /> ); }

În codul de mai sus, creăm o componentă Box cu elemente de recuzită, apoi creăm un ref numit mesh folosind cârligul useRef , am făcut acest lucru astfel încât să putem returna întotdeauna aceeași plasă de fiecare dată.

O plasă este un element vizual într-o scenă, este un obiect 3D care alcătuiește un poligon triunghiular, este de obicei construit folosind o Geometrie, care este folosită pentru a defini forma modelului și Material care definește aspectul modelului, puteți aflați despre o plasă aici, De asemenea, puteți afla mai multe despre cârligul useRef aici.

După inițializarea unei mesh , trebuie să inițializam o stare pentru aplicația noastră folosind cârligul useState , aici setăm starea hovered și activă a aplicației la false.

Apoi, folosim cârligul useFrame de la react-three-fiber pentru a roti ochiurile (zarurile ludice), folosind codul de mai jos

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

Aici, rotim poziția actuală a rețelei la fiecare 0,01 secunde, acest lucru se face pentru a oferi rotației o animație bună.

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

În codul de mai sus, creăm o constantă numită texture și trecem într-un cârlig useMemo de reactie ca o funcție pentru a încărca o nouă aruncare de zaruri, aici useMemo pentru a memora imaginea zarurilor și numărul acestuia. Puteți afla despre cârligul useMemo aici.

Apoi, dorim să redăm componenta Box în browser și să adăugăm evenimentele noastre, facem asta mai jos

 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> ); }

În codul de mai sus, ne întoarcem componenta Box și o împachetăm în mesh , am trecut toate proprietățile componentei Box folosind operatorul de răspândire, apoi am făcut referire la rețea folosind cârligul useRef . Apoi, folosim proprietatea scale din Three.js pentru a seta dimensiunea casetei de zaruri când este activă la 2 și 1,5 când nu este. Nu în ultimul rând, am adăugat un eveniment onClick pentru a seta state la active dacă nu este setat implicit.

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

Pentru a reda caseta de zaruri, am randat componenta boxBufferGeometry din Three.js, boxBufferGeometry ne ajută să desenăm linii și puncte, cum ar fi casetele, am folosit argumentul args pentru a trece constructori precum dimensiunea geometriei casetei.

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

meshBasicMaterial de la Three.js, este folosit pentru a desena geometrii într-o formă simplă. Aici am trecut atributul de attach și am trecut o recuzită THREE.DoubleSide atributului side . THREE.DoubleSide definește laturile sau spațiile care ar trebui redate prin react-three-fiber .

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

Componenta primitive din Three.js este folosită pentru a desena grafice 3D. Am atașat proprietatea hărții pentru a menține forma originală a zarurilor ludo. În continuare, vom reda componenta noastră Box în fișierul App.js și vom completa caseta de zaruri ludo 3d. Componenta dvs. ar trebui să arate similar cu imaginea de mai jos.

Componenta cutie pentru cutia ludo 3D

Redare 3D Ludo Dice Box

În această secțiune, vom reda componenta noastră Box în App.js și vom completa caseta de ludo 3d, pentru a face asta mai întâi, să creăm o componentă a App și să o împachetăm cu o etichetă Canvas , aceasta este pentru a reda modelele noastre 3D, hai sa facem asta mai jos.

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

Apoi, să adăugăm o lumină la cutii, react-three-fiber ne oferă trei componente pentru a ne lumina modelele, acestea sunt după cum urmează

  • ambientLight
    Acesta este folosit pentru a ilumina toate obiectele dintr-o scenă sau model în mod egal, acceptă recuzită precum intensitatea luminii, aceasta va lumina corpul zarurilor ludo.
  • spotLight
    Această lumină este emisă dintr-o singură direcție și crește pe măsură ce dimensiunea obiectului crește, aceasta va lumina punctele zarurilor ludo.
  • pointLight
    Aceasta funcționează similar cu lumina unui bec, lumina este emisă dintr-un singur punct în toate direcțiile, acest lucru va fi necesar pentru starea activă a aplicației noastre.

Să implementăm cele de mai sus în aplicația noastră de mai jos.

 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;

În codul de mai sus, am importat componenta ambientLight din react-three-fiber și i-am adăugat o intensitate de 0,5, apoi am adăugat o poziție și un unghi la componenta noastră spotLight și pointLight . Pasul final al aplicației noastre este să redăm componenta noastră cutie și să adăugăm o poziție la cutiile de zaruri ludo, am face asta în codul de mai jos

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

Când ați terminat, zarurile dvs. ludo 3D ar trebui să arate similar cu imaginea de mai jos:

Cutie de zaruri ludo 3D

O demonstrație funcțională este disponibilă pe CodeSandbox.

Concluzie

react-three-fiber a făcut randarea modelelor 3D și a animațiilor mai ușor de creat pentru aplicațiile React și React Native. Prin construirea cutiei noastre de zaruri ludo 3D, am învățat despre elementele de bază ale Three.js, împreună cu componentele și beneficiile sale react-three-fiber , precum și despre cum să-l folosim.

Puteți duce acest lucru mai departe, construind modele 3D și animații în aplicațiile React și Native, folosind react-three-fiber pe cont propriu. Mi-ar plăcea să văd cu ce lucruri noi vii!

Puteți citi mai multe despre Three.js și react-three-fiber în referințele de mai jos.

Resurse conexe

  • Documentația Three.js
  • Fundamentele Three.js
  • React-Three-fibre GitHub repo de Poimandres
  • documentație de reacții cu trei fibre
  • React Hooks (useState, useMemo etc.) documentație oficială