React Three Fiber Hooks

Starter pack

En esta lecci贸n, descubriremos qu茅 son los hooks useThree y useFrame proporcionados por React Three Fiber, c贸mo y cu谩ndo usarlos.

useThree

useThree da acceso al modelo state que contiene el renderer predeterminado, la escena, la c谩mara, el tama帽o del viewport, etc.

Aunque explicar茅 cada una de las propiedades del state que utilizaremos en el momento adecuado, puedes encontrar la lista completa de propiedades en la documentaci贸n.

Para usarlo, necesitamos importarlo desde @react-three/fiber y luego llamarlo dentro de nuestro componente:

import { Canvas, useThree } from "@react-three/fiber";
// ...

const Cube = (props) => {
  const { camera } = useThree();
  // ...
};

// ...

Aunque esta forma de usar useThree funciona, causar谩 que el componente se vuelva a renderizar en otros cambios de valores diferentes a los que obtuvimos mediante destructuring.

En su lugar, podemos usar el patr贸n de selector para obtener solo los valores que necesitamos:

import { Canvas, useThree } from "@react-three/fiber";

const Cube = (props) => {
  const camera = useThree((state) => state.camera);
  // ...
};

De esta manera, el componente solo se volver谩 a renderizar cuando el valor camera cambie.

Ten en cuenta que los valores internos de threejs no son reactivos. Si la camera.position cambia, el componente no se volver谩 a renderizar. (Afortunadamente)

Ahora que tenemos acceso a la c谩mara, podemos modificar el fov (campo de visi贸n) para acercar o alejar:

// ...

const Cube = (props) => {
  const camera = useThree((state) => state.camera);

  const updateFov = (fov) => {
    camera.fov = fov;
    camera.updateProjectionMatrix();
  };

  useControls("FOV", {
    smallFov: button(() => updateFov(20)),
    normalFov: button(() => updateFov(42)),
    bigFov: button(() => updateFov(60)),
    hugeFov: button(() => updateFov(110)),
  });

  // ...
};

// ...

Notas:

  • El m茅todo updateProjectionMatrix es necesario para decirle a threejs que la c谩mara ha cambiado y necesita ser actualizada.
  • Al pasar un valor de cadena como primer par谩metro a useControls, podemos agrupar propiedades por carpeta.

Nuestro campo de visi贸n de la c谩mara se actualiza correctamente desde los controles

useFrame

Threejs es una biblioteca basada en un render-loop. Esto significa que lo que vemos en la pantalla es el resultado de un bucle que renderiza la escena en cada frame. As铆 como un video es una sucesi贸n de im谩genes, una escena 3D es una sucesi贸n de frames.

El hook useFrame nos permite ejecutar c贸digo en cada frame renderizado, como ejecutar efectos, actualizar controles y realizar animaciones.

Cuando se apunta a 60fps, el callback se invocar谩 60 veces por segundo.

End of lesson preview

To get access to the entire lesson, you need to purchase the course.