Wawa Sensei logo
LoginEnroll now

React Three Fiber Hooks

Starter pack

рдЗрд╕ рдкрд╛рда рдореЗрдВ, рд╣рдо рдЬрд╛рдиреЗрдВрдЧреЗ рдХрд┐ React Three Fiber рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд useThree рдФрд░ useFrame hooks рдХреНрдпрд╛ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдФрд░ рдХрдм рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

useThree

useThree state рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ renderer, scene, camera, viewport рдХрд╛ рдЖрдХрд╛рд░, рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред

рдЬрдмрдХрд┐ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ state рдЧреБрдгреЛрдВ рдХреЛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдЙрдЪрд┐рдд рд╕рдордп рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЖрдк documentation рдореЗрдВ рдЧреБрдгреЛрдВ рдХреА рдкреВрд░реНрдг рд╕реВрдЪреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕реЗ @react-three/fiber рд╕реЗ import рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ component рдХреЗ рднреАрддрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

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

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

// ...

рдЬрдмрдХрд┐ useThree рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ component рдХреЛ рдЙрди рдЕрдиреНрдп рдорд╛рдиреЛрдВ рдкрд░ рдлрд┐рд░ рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рдирдХрд╛ рд╣рдордиреЗ destructuring рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП selector pattern рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

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

рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ, component рдХреЗрд╡рд▓ рддрднреА рдлрд┐рд░ рд╕реЗ рд░реЗрдВрдбрд░ рд╣реЛрдЧрд╛ рдЬрдм camera рдорд╛рди рдмрджрд▓рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ threejs рдЖрдВрддрд░рд┐рдХ рдорд╛рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ camera.position рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ component рдлрд┐рд░ рд╕реЗ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред (рд╕реМрднрд╛рдЧреНрдп рд╕реЗ)

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреИрдорд░рд╛ рддрдХ рдкрд╣реБрдБрдЪ рд╣реИ, рддреЛ рд╣рдо fov (field of view) рдХреЛ zoom in рдпрд╛ out рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// ...

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

  // ...
};

// ...

рдиреЛрдЯреНрд╕:

  • updateProjectionMatrix рд╡рд┐рдзрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ threejs рдХреЛ рдмрддрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреИрдорд░рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ useControls рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рд╣рдо рдЧреБрдгреЛрдВ рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдХреИрдорд░реЗ рдХрд╛ рдлрд╝реАрд▓реНрдб рдСрдлрд╝ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓реНрд╕ рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ

useFrame

Threejs рдПрдХ render-loop рдЖрдзрд╛рд░рд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рд▓реВрдк рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬреЛ рд╣рд░ frame рдкрд░ рджреГрд╢реНрдп рдХреЛ render рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЙрддреНрддрд░рд╡рд░реНрддреА рдХреНрд░рдо рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдПрдХ 3D рджреГрд╢реНрдп frames рдХрд╛ рдПрдХ рдЙрддреНрддрд░рд╡рд░реНрддреА рдХреНрд░рдо рд╣реИред

useFrame hook рд╣рдореЗрдВ рд╣рд░ rendered frame рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд░рдирд┐рдВрдЧ рдЗрдлреЗрдХреНрдЯреНрд╕, рдЕрдкрдбреЗрдЯрд┐рдВрдЧ рдХрдВрдЯреНрд░реЛрд▓реНрд╕, рдФрд░ рдПрдиреАрдореЗрд╢рдиред

60fps рдХреЛ рдЯрд╛рд░рдЧреЗрдЯ рдХрд░рддреЗ рд╕рдордп, callback рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 60 рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

End of lesson preview

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