тЪбя╕П Limited Black Friday Deal
Get 50% off on the React Three Fiber Ultimate Course with the promo code ULTIMATE50
Buy Now
Fundamentals
Core
Master
Shaders
React Three Fiber Hooks
рдЗрд╕ рдкрд╛рда рдореЗрдВ, рд╣рдо рдЬрд╛рдиреЗрдВрдЧреЗ рдХрд┐ 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.