React Three Fiber Hooks

Starter pack

In questa lezione, scopriremo quali sono gli hook useThree e useFrame forniti da React Three Fiber, e come e quando utilizzarli.

useThree

useThree dà accesso al modello state che contiene il renderer predefinito, la scena, la camera, la dimensione del viewport e così via.

Mentre spiegherò ciascuna delle proprietà dello state che utilizzeremo al momento opportuno, puoi trovare l'elenco completo delle proprietà nella documentazione.

Per utilizzarlo, dobbiamo importarlo da @react-three/fiber, e quindi chiamarlo all'interno del nostro componente:

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

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

// ...

Sebbene questo modo di usare useThree funzioni, causerà il re-render del componente al cambiamento di altri valori diversi da quelli ottenuti dal destructuring.

Invece, possiamo utilizzare il pattern del selector per ottenere solo i valori di cui abbiamo bisogno:

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

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

In questo modo, il componente si rigenererà solo quando il valore camera cambierà.

Tieni presente che i valori interni di threejs non sono reattivi. Se cambia camera.position, il componente non si rigenererà. (Fortunatamente)

Ora che abbiamo accesso alla camera, possiamo modificare il fov (campo visivo) per ingrandire o ridurre:

// ...

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

  // ...
};

// ...

Note:

  • il metodo updateProjectionMatrix è necessario per comunicare a threejs che la camera è cambiata e deve essere aggiornata.
  • passando un valore stringa come primo parametro a useControls, possiamo raggruppare le proprietà per cartella.

Il nostro campo visivo della camera viene aggiornato correttamente dai controlli

useFrame

Threejs è una libreria basata su render-loop. Significa che ciò che vediamo sullo schermo è il risultato di un ciclo che renderizza la scena ad ogni frame. Come un video è una successione di immagini, una scena 3D è una successione di frame.

Il hook useFrame ci consente di eseguire codice su ogni frame renderizzato, come eseguire effetti, aggiornare controlli e animazioni.

Quando si punta ai 60fps, il callback sarà invocato 60 volte al secondo.

Three.js logoReact logo

React Three Fiber: The Ultimate Guide to 3D Web Development

✨ You have reached the end of the preview ✨

Go to the next level with Three.js and React Three Fiber!

Get full access to this lesson and the complete course when you enroll:

  • 🔓 Full lesson videos with no limits
  • 💻 Access to the final source code
  • 🎓 Course progress tracking & completion
  • 💬 Invite to our private Discord community
Unlock the Full Course – Just $85

One-time payment. Lifetime updates included.