Um mergulho em React e Three.js Usando react-three-fiber

Publicados: 2022-03-10
Resumo rápido ↬ react react-three-fiber é um poderoso renderizador Three.js que ajuda a renderizar modelos 3D e animações para React e seus aplicativos nativos. Neste tutorial, você aprenderá como configurar e construir modelos 3D em um aplicativo React.

Hoje, vamos aprender como configurar e usar react-three-fiber para construir e exibir modelos 3D e animações em aplicativos React e React Native.

Este tutorial é para desenvolvedores que desejam aprender mais sobre animações de modelos 3D na web usando React e para qualquer pessoa que tenha limitações com Three.js como incapacidade de criar telas, vincular eventos de usuário como eventos de click e iniciar um loop de renderização, react-three-fiber vem com esses métodos. Construiremos um modelo 3D para entender melhor como construir modelos 3D do Three.js usando react-three-fiber .

Introdução react-three-fiber

O Three.js é uma biblioteca que facilita a criação de gráficos 3D no navegador, ele usa um canvas + WebGL para exibir os modelos 3D e animações, você pode saber mais aqui.

react-three-fiber é um renderizador React para Three.js na web e react-native, é um aumento na velocidade com que você cria modelos 3D e animações com Three.js, alguns exemplos de sites com modelos e animações 3D pode ser encontrado aqui. react-three-fiber reduz o tempo gasto em animações por causa de seus componentes reutilizáveis, eventos de vinculação e loop de renderização, primeiro vamos dar uma olhada no que é Three.js.

react-three-fiber nos permite construir componentes de código threeJS usando React state, hooks e props, ele também vem com os seguintes elementos:

Elemento Descrição
mesh Uma propriedade que ajuda a definir a forma de nossos modelos
hooks react-three-fiber define ganchos que nos ajudam a escrever funções que ajudam a definir eventos de usuário como onClick e onPointOver
Loop baseado em componentes e renderização react-three-fiber é baseado em componentes e renderiza de acordo com uma mudança no estado ou na loja
Mais depois do salto! Continue lendo abaixo ↓

Como usar react-three-fiber

Para usar react-three-fiber , você começa usando os comandos abaixo:

NPM

 npm i three react-three-fiber

FIO

 yarn add three react-three-fiber

Nota : Para react-three-fiber funcione, você precisará instalar three (Three.js) como fizemos acima.

Construindo um projeto de animação e modelo de dados Ludo React 3D

Aqui vamos construir um modelo de dados de ludo 3D usando react-three-fiber como temos no vídeo abaixo.

Estaremos usando create-react-app para inicializar nosso projeto, para isso vamos executar o comando abaixo em nosso terminal.

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

O comando acima inicializa um projeto React dentro de nossa máquina local, em seguida vamos cd no diretório e instalar nossos pacotes react-three-fiber e three .

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

Uma vez instalados os pacotes, vamos iniciar nosso servidor de desenvolvimento usando o comando

 npm start

O comando acima deve iniciar nosso servidor de desenvolvimento de projeto em nosso navegador. Em seguida, vamos abrir nosso projeto em nosso editor de texto de escolha, dentro da pasta src do nosso projeto, exclua os seguintes arquivos: App.css , App.test.js , serviceWorker.js e setupTests.js . Em seguida, vamos excluir todo o código que faz referência aos arquivos excluídos em nosso App.js .

Para este projeto, precisaremos de um componente Box para nossos dados ludo e nosso componente App que é fornecido pelo React.

Construindo o Componente da Box

O componente Box conterá a forma de nossos dados de ludo, uma imagem de um dado de ludo e um estado para mantê-lo sempre em rotação. Primeiro, vamos importar todos os pacotes que precisamos para o nosso componente Box abaixo.

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

No código acima, estamos importando useRef , useState e useMemo . Usaremos o gancho useRef para acessar a malha dos dados e o gancho useState para verificar o estado ativo dos dados ludo. O gancho useMemo será usado para retornar o número nos dados. Em seguida, estamos importando Canvas e useFrame do react react-three-fiber , o canvas é usado para desenhar os gráficos no navegador, enquanto o useFrame permite que os componentes se conectem ao loop de renderização, isso possibilita que um componente seja renderizado o conteúdo de outro. Em seguida, importamos os three pacotes e depois importamos uma imagem estática de um dado de ludo.

O próximo passo é escrever a lógica para o nosso componente Box . Primeiro, vamos começar com a construção de um componente funcional e adicionar estado ao nosso componente, vamos fazer isso abaixo.

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

No código acima, estamos criando um componente Box com props, em seguida criamos uma ref chamada mesh usando o hook useRef , fizemos isso para que possamos sempre retornar a mesma mesh todas as vezes.

Uma malha é um elemento visual em uma cena, é um objeto 3D que forma um polígono triangular, geralmente é construído usando uma Geometria, que é usada para definir a forma do modelo e Material que define a aparência do modelo, você pode aprenda sobre uma malha aqui, você também pode aprender mais sobre o gancho useRef aqui.

Após inicializar um mesh , precisamos inicializar um estado para nossa aplicação usando o hook useState , aqui configuramos o estado hover e active da aplicação para false.

Em seguida, usamos o gancho useFrame do react react-three-fiber para girar a malha (ludo dice), usando o código abaixo

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

Aqui, estamos girando a posição atual da malha a cada 0,01 segundo, isso é feito para dar uma boa animação à rotação.

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

No código acima, estamos criando uma constante chamada texture e passando um gancho useMemo como uma função para carregar um novo lançamento de dados, aqui o useMemo para memorizar a imagem do dado e seu número. Você pode aprender sobre o gancho useMemo aqui.

Em seguida, queremos renderizar o componente Box no navegador e adicionar nossos eventos, fazemos isso abaixo

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

No código acima, estamos retornando nosso componente Box e envolvendo-o na mesh , passamos todas as propriedades do componente Box usando o operador spread e, em seguida, referenciamos a malha usando o gancho useRef . Em seguida, usamos a propriedade scale de Three.js para definir o tamanho da caixa de dados quando estiver ativa para 2 e 1,5 quando não estiver. Por último, mas não menos importante, adicionamos um evento onClick para definir o state como active se não estiver definido como padrão.

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

Para renderizar a caixa de dados, renderizamos o componente boxBufferGeometry de Three.js, boxBufferGeometry nos ajuda a desenhar linhas e pontos como caixas, usamos o argumento args para passar construtores como o tamanho da geometria da caixa.

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

O meshBasicMaterial do Three.js é usado para desenhar geometrias de forma simples. Aqui passamos o atributo attach e um props THREE.DoubleSide para o atributo side . O THREE.DoubleSide define os lados ou espaços que devem ser renderizados por react-three-fiber .

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

O componente primitive do Three.js é usado para desenhar gráficos 3D. Anexamos a propriedade map para manter a forma original dos dados de ludo. Em seguida, vamos renderizar nosso componente Box no arquivo App.js e completar nossa caixa de dados ludo 3d. Seu componente deve ser semelhante à imagem abaixo.

Componente de caixa para caixa 3D ludo

Renderizando 3D Ludo Dice Box

Nesta seção, vamos renderizar nosso componente Box em nosso App.js e completar nossa caixa 3d ludo, para fazer isso primeiro, vamos criar um componente App e envolvê-lo com uma tag Canvas , para renderizar nossos modelos 3D, vamos fazer isso abaixo.

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

Em seguida, vamos adicionar uma luz às caixas, react-three-fiber nos fornece três componentes para iluminar nossos modelos, eles são os seguintes

  • ambientLight
    Isso é usado para iluminar todos os objetos em uma cena ou modelo igualmente, aceita adereços como a intensidade da luz, isso iluminará o corpo dos dados de ludo.
  • spotLight
    Esta luz é emitida de uma única direção, e aumenta à medida que o tamanho do objeto aumenta, isso acenderá as pontas dos dados de ludo.
  • pointLight
    Isso funciona de maneira semelhante à luz de uma lâmpada, a luz é emitida de um único ponto para todas as direções, isso será necessário para o estado ativo do nosso aplicativo.

Vamos implementar o acima em nosso aplicativo abaixo.

 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;

No código acima, importamos o componente ambientLight do react react-three-fiber e adicionamos uma intensidade de 0,5 a ele, em seguida adicionamos uma posição e um ângulo ao nosso componente spotLight e pointLight . O passo final para nossa aplicação é renderizar nosso componente box e adicionar uma posição às caixas de dados ludo, faríamos isso no código abaixo

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

Quando terminar, seus dados ludo 3D devem ser semelhantes à imagem abaixo:

caixa de dados ludo 3D

Uma demonstração funcional está disponível no CodeSandbox.

Conclusão

react-three-fiber tornou a renderização de modelos 3D e animações mais fáceis de criar para aplicativos React e React Native. Ao construir nossa caixa de dados ludo 3D, aprendemos sobre os fundamentos do Three.js juntamente com seus componentes e benefícios do react-three-fiber , bem como como usá-lo.

Você pode levar isso adiante construindo modelos 3D e animações em seus aplicativos React e Native usando react-three-fiber por conta própria. Eu adoraria ver as novidades que você inventa!

Você pode ler mais sobre Three.js e react react-three-fiber nas referências abaixo.

Recursos Relacionados

  • Documentação do Three.js
  • Fundamentos do Three.js
  • React-Three-fiber GitHub repo por Poimandres
  • documentação react-three-fiber
  • React Hooks (useState, useMemo, etc.) documentação oficial