React Three Fiber Hooks

Starter pack

Dans cette leçon, nous découvrirons ce que sont les hooks useThree et useFrame fournis par React Three Fiber, comment et quand les utiliser.

useThree

useThree donne accès au modèle state qui contient le renderer par défaut, la scène, la caméra, la taille du viewport, etc.

Bien que j'expliquerai chaque propriété du state que nous utiliserons au moment approprié, vous pouvez trouver la liste complète des propriétés dans la documentation.

Pour l'utiliser, nous devons l'importer depuis @react-three/fiber, puis l'appeler dans notre composant :

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

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

// ...

Bien que cette façon d'utiliser useThree fonctionne, elle provoquera le re-render du composant lors de changements d'autres valeurs que celles obtenues par destructuration.

Nous pouvons plutĂ´t utiliser le pattern selector pour obtenir uniquement les valeurs dont nous avons besoin :

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

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

De cette façon, le composant se re-rendera uniquement lorsque la valeur de la camera change.

Gardez à l'esprit que les valeurs internes de threejs ne sont pas réactives. Si la camera.position change, le composant ne se re-rendera pas. (Heureusement)

Maintenant que nous avons accès à la caméra, nous pouvons modifier le fov (champ de vision) pour zoomer ou dézoomer :

// ...

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

  // ...
};

// ...

Notes :

  • la mĂ©thode updateProjectionMatrix est nĂ©cessaire pour indiquer Ă  threejs que la camĂ©ra a changĂ© et doit ĂŞtre mise Ă  jour.
  • en passant une valeur string comme premier paramètre Ă  useControls, nous pouvons regrouper les propriĂ©tĂ©s par dossier.

Notre champ de vision de la caméra est correctement mis à jour depuis les contrôles

useFrame

Threejs est une bibliothèque basée sur un render-loop. Cela signifie que ce que nous voyons à l'écran est le résultat d'une boucle qui rend la scène à chaque frame. Tout comme une vidéo est une succession d'images, une scène 3D est une succession de frames.

Le hook useFrame nous permet d'exécuter du code à chaque frame rendue, comme lancer des effets, mettre à jour des contrôles, et des animations.

Lorsqu'on cible 60fps, le callback sera invoqué 60 fois par seconde.

End of lesson preview

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