Zanurz się w React i Three.js przy użyciu reakcji retrieve-three-fiber

Opublikowany: 2022-03-10
Szybkie podsumowanie ↬ React react-three-fiber to potężny renderer Three.js, który pomaga renderować modele 3D i animacje dla Reacta i jego natywnych aplikacji. W tym samouczku dowiesz się, jak konfigurować i budować modele 3D w aplikacji React.

Dzisiaj nauczymy się konfigurować i używać React react-three-fiber do budowania i wyświetlania modeli 3D i animacji w aplikacjach React i React Native.

Ten samouczek jest przeznaczony dla programistów, którzy chcą dowiedzieć się więcej o animacjach modeli 3D w Internecie za pomocą Reacta oraz dla każdego, kto miał ograniczenia w Three.js, takie jak niemożność tworzenia płótna, wiązania zdarzeń użytkownika, takich jak zdarzenia click i uruchamiania pętli renderowania, React react-three-fiber pochodzi z tych metod. Będziemy budować model 3D, aby lepiej zrozumieć, jak tworzyć modele 3D w formacie Three.js przy użyciu react-three-fiber .

Pierwsze kroki z react-three-fiber

Three.js to biblioteka ułatwiająca tworzenie grafiki 3D w przeglądarce, wykorzystuje płótno + WebGL do wyświetlania modeli 3D i animacji, więcej dowiesz się tutaj.

React-three-fiber to renderer React dla Three.js w sieci i natywny, zwiększa szybkość tworzenia modeli 3D i animacji za pomocą Three.js, kilka przykładów witryn z modelami i animacjami 3D można znaleźć tutaj. react-three-fiber skraca czas poświęcony na animacje ze względu na komponenty wielokrotnego użytku, zdarzenia wiążące i pętlę renderowania. Najpierw przyjrzyjmy się, czym jest Three.js.

React react-three-fiber pozwala nam budować komponenty kodu threeJS za pomocą stanu React, hooków i propsów, zawiera również następujące elementy:

Element Opis
mesh Właściwość, która pomaga zdefiniować kształt naszych modeli
hooks react-three-fiber definiuje hooki, które pomagają nam pisać funkcje, które pomagają definiować zdarzenia użytkownika, takie jak onClick i onPointOver
Oparta na komponentach i pętla renderowania react-three-fiber jest oparty na komponentach i renderuje się zgodnie ze zmianą stanu lub sklepu
Więcej po skoku! Kontynuuj czytanie poniżej ↓

Jak korzystać react-three-fiber

Aby użyć react-three-fiber , zacznij od poniższych poleceń:

NPM

 npm i three react-three-fiber

PRZĘDZA

 yarn add three react-three-fiber

Uwaga : aby react-three-fiber działała, musisz zainstalować three (Three.js), tak jak to zrobiliśmy powyżej.

Budowanie modelu kostki React 3D Ludo i projektu animacji

Tutaj zbudujemy model 3D kości ludo przy użyciu react-three-fiber , tak jak na poniższym filmie.

Użyjemy create-react-app do zainicjowania naszego projektu, w tym celu wykonaj poniższe polecenie na naszym terminalu.

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

Powyższe polecenie inicjalizuje projekt React na naszej lokalnej maszynie, następnie cd do katalogu i zainstalujmy nasze pakiety React react-three-fiber i three .

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

Po zainstalowaniu pakietów uruchommy nasz serwer deweloperski za pomocą polecenia

 npm start

Powyższe polecenie powinno uruchomić nasz serwer rozwoju projektu w naszej przeglądarce. Następnie otwórzmy nasz projekt w wybranym przez nas edytorze tekstu, w naszym folderze src projektu, usuńmy następujące pliki: App.css , App.test.js , serviceWorker.js i setupTests.js . Następnie usuńmy cały kod, który odwołuje się do usuniętych plików w naszym App.js .

W tym projekcie będziemy potrzebować komponentu Box dla naszych kości Ludo oraz komponentu App , który jest dostarczany przez React.

Budowanie komponentu Box

Komponent Box będzie zawierał kształt naszych kości ludo, obraz kości ludo oraz stan, w którym zawsze będzie się obracał. Najpierw zaimportujmy poniżej wszystkie potrzebne nam pakiety dla naszego komponentu 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";

W powyższym kodzie importujemy useRef , useState i useMemo . Użyjemy haka useRef , aby uzyskać dostęp do siatki kostek i haka useState , aby sprawdzić aktywny stan kości ludo. Haczyk useMemo posłuży do zwrócenia liczby na kostce. Następnie importujemy Canvas i useFrame z React react-three-fiber , canvas służy do rysowania grafiki w przeglądarce, podczas gdy useFrame pozwala komponentom podpiąć się do pętli renderowania, co umożliwia renderowanie jednego komponentu treść innego. Następnie zaimportowaliśmy three pakiety, a następnie zaimportowaliśmy statyczny obraz kości ludo.

Kolejnym zadaniem dla nas jest napisanie logiki dla naszego komponentu Box . Najpierw zaczniemy od zbudowania funkcjonalnego komponentu i dodania stanu do naszego komponentu, zróbmy to poniżej.

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

W powyższym kodzie tworzymy komponent Box z rekwizytami, następnie tworzymy ref o nazwie mesh za pomocą haka useRef , zrobiliśmy to tak, że za każdym razem możemy zwrócić tę samą siatkę.

Siatka jest elementem wizualnym w scenie, jest to obiekt 3D, który tworzy trójkątny wielokąt, zwykle jest budowany przy użyciu geometrii, która służy do definiowania kształtu modelu i materiału , który określa wygląd modelu, możesz dowiedz się o Mesh tutaj, Możesz również dowiedzieć się więcej o haczyku useRef tutaj.

Po zainicjowaniu mesh musimy zainicjować stan naszej aplikacji za pomocą haka useState , tutaj ustawiamy stan najechania i aktywny aplikacji na false.

Następnie używamy haczyka useFrame z React react-three-fiber do obracania siatki (kostki ludo), korzystając z poniższego kodu

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

Tutaj obracamy bieżącą pozycję siatki co 0,01 sekundy, aby zapewnić dobrą animację obrotu.

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

W powyższym kodzie tworzymy stałą zwaną texture i przekazujemy hook useMemo w React jako funkcję do załadowania nowego rzutu kostką, tutaj useMemo do zapamiętywania obrazu kostki i jego numeru. O haczyku useMemo się tutaj.

Następnie chcemy wyrenderować komponent Box w przeglądarce i dodać nasze zdarzenia, robimy to poniżej

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

W powyższym kodzie zwracamy nasz komponent Box i owijając go w mesh , przekazaliśmy wszystkie właściwości komponentu Box za pomocą operatora rozproszenia, a następnie odwołujemy się do siatki za pomocą haka useRef . Następnie używamy właściwości scale z Three.js, aby ustawić rozmiar pudełka na kości, gdy jest aktywne, na 2 i 1,5, gdy nie jest. Na koniec dodaliśmy zdarzenie onClick , aby ustawić state na active , jeśli nie jest ustawiony domyślnie.

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

Aby wyrenderować pudełko z kostką, wyrenderowaliśmy komponent boxBufferGeometry z Three.js, boxBufferGeometry pomaga nam rysować linie i punkty, takie jak pudełka, użyliśmy argumentu args do przekazania konstruktorów, takich jak rozmiar geometrii pudełka.

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

meshBasicMaterial z Three.js służy do rysowania geometrii w prostej formie. Tutaj przekazaliśmy atrybut attach i atrybut THREE.DoubleSide do atrybutu side . THREE.DoubleSide definiuje boki lub przestrzenie, które powinny być renderowane przez response react-three-fiber .

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

primitive komponent z Three.js służy do rysowania wykresów 3D. Załączyliśmy właściwość mapy, aby zachować oryginalny kształt kości do gry w Ludo. Następnie wyrenderujemy nasz komponent Box w pliku App.js i uzupełnimy nasze pudełko z kostkami do gry w 3D. Twój komponent powinien wyglądać podobnie do poniższego obrazu.

Komponent pudełka do pudełka Ludo 3D

Renderowanie 3D Pudełka na Kostki Ludo

W tej sekcji wyrenderujemy nasz komponent Box w naszym App.js i uzupełnimy nasze pudełko 3D Ludo. Aby to zrobić najpierw, stwórzmy komponent App i owińmy go tagiem Canvas , aby renderować nasze modele 3D, zróbmy to poniżej.

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

Następnie dodajmy światło do pudełek, react-three-fiber dostarcza nam trzy elementy do oświetlenia naszych modeli, są one następujące

  • ambientLight
    Służy do równego oświetlenia wszystkich obiektów w scenie lub modelu, akceptuje rekwizyty, takie jak intensywność światła, to oświetli korpus kości ludo.
  • spotLight
    To światło jest emitowane z jednego kierunku i zwiększa się wraz ze wzrostem wielkości obiektu, oświetlając punkty kości ludo.
  • pointLight
    Działa to podobnie do światła żarówki, światło emitowane jest z jednego punktu we wszystkich kierunkach, będzie to konieczne do aktywnego stanu naszej aplikacji.

Zaimplementujmy powyższe w naszej aplikacji poniżej.

 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;

W powyższym kodzie zaimportowaliśmy komponent ambientLight z react-three-fiber i dodaliśmy do niego intensywność 0,5, a następnie dodaliśmy pozycję i kąt do naszego komponentu spotLight i pointLight . Ostatnim krokiem naszej aplikacji jest wyrenderowanie naszego komponentu pudełka i dodanie pozycji do pudełek z kostkami do gry Ludo, zrobilibyśmy to w poniższym kodzie

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

Po zakończeniu twoja kostka ludo 3D powinna wyglądać podobnie do poniższego obrazu:

Pudełko na kości ludo 3D

Działające demo jest dostępne na CodeSandbox.

Wniosek

React react-three-fiber ułatwił tworzenie modeli 3D i animacji dla aplikacji React i React Native. Budując nasze pudełko do gry w kości do gry w 3D, poznaliśmy podstawy Three.js, jego komponenty i korzyści z react-three-fiber , a także sposób jego używania.

Możesz posunąć się dalej, budując modele 3D i animacje w aplikacjach React i Native, korzystając z własnych rozwiązań React react-three-fiber . Chętnie zobaczę, jakie nowe rzeczy wymyślisz!

Możesz przeczytać więcej na temat Three.js i react-three-fiber w poniższych odnośnikach.

Powiązane zasoby

  • Dokumentacja Three.js
  • Podstawy Three.js
  • React-Three-fiber repozytorium GitHub autorstwa Poimandres
  • React-three-fiber dokumentacja
  • React Hooks (useState, useMemo itp.) oficjalna dokumentacja