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 рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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.