React-Three-Fiber: Making 3D So Easy, You’ll Think You’re in a Game!

Eftee Codes
3 min readNov 9, 2024

--

Imagine creating 3D animations in your web app as effortlessly as coding up a React component. That’s the magic of React-Three-Fiber (R3F), a library that combines the power of Three.js with the flexibility of React. In this blog, we’ll explore React-Three-Fiber.

What is React-Three-Fiber?

React-Three-Fiber (R3F) is a React renderer for Three.js. Three.js is a popular 3D library for JavaScript, often used in games and VR. R3F abstracts this library and makes it easy to use with React’s component-based structure, so you can create and control 3D scenes with React hooks and components.

Why Use React-Three-Fiber?

R3F makes it simple for React developers to build 3D visualizations and interactive scenes without diving into Three.js’s complexity. Plus, it:

  • Integrates smoothly with React’s component structure.
  • Allows seamless composition with other React components.
  • Simplifies managing 3D scenes with hooks, state, and effects.

Setting Up a Project with R3F

Let’s start by creating a project with R3F:

npx create-react-app my-3d-app
cd my-3d-app
npm install @react-three/fiber three

Once installed, let’s import Canvas, the core component that acts as our 3D canvas

Core Concepts: Canvas, Meshes, and Materials

The building blocks of any R3F scene are:

  • Canvas: The main component that initializes a 3D environment.
  • Mesh: A basic 3D shape (e.g., cube, sphere) that holds geometry and materials.
  • Materials: Define the appearance of a mesh, like color and texture.

Building 3D Scenes

Let’s create our first 3D object, a spinning cube!

import React, { useRef } from 'react';
import { Canvas } from '@react-three/fiber';

function Cube() {
const meshRef = useRef();

// Rotate the cube
useFrame(() => (meshRef.current.rotation.y += 0.01));

return (
<mesh ref={meshRef} position={[0, 0, 0]}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color="royalblue" />
</mesh>
);
}

export default function App() {
return (
<Canvas>
<ambientLight />
<Cube />
</Canvas>
);
}

In this code:

  • Canvas creates a 3D rendering space.
  • Cube component renders a 3D cube using boxGeometry.
  • useFrame hook rotates the cube on each frame.

Animation and Interactions

One of the best things about R3F is how easily you can animate and interact with 3D objects. Let’s add an effect where the cube changes color when clicked.

function Cube() {
const meshRef = useRef();
const [active, setActive] = useState(false);

useFrame(() => (meshRef.current.rotation.y += 0.01));

return (
<mesh
ref={meshRef}
position={[0, 0, 0]}
onClick={() => setActive(!active)}
>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color={active ? 'orange' : 'royalblue'} />
</mesh>
);
}

Now, when you click on the cube, it will toggle between orange and blue.

Adding Lighting and Shadows

Lighting is essential in 3D scenes to make objects look realistic. R3F supports several light types, such as ambientLight, directionalLight, and pointLight.

Let’s add a light source that casts a shadow:

function App() {
return (
<Canvas shadows>
<ambientLight intensity={0.5} />
<directionalLight position={[5, 5, 5]} castShadow />
<Cube />
</Canvas>
);
}

Advanced Tips and Tricks

  • OrbitControls: Allow the user to rotate the scene for a better view.
  • GLTF Models: Import complex 3D models with animations.
  • Suspense: Load 3D assets and show a fallback while loading.

Conclusion

React-Three-Fiber lets you create stunning 3D visuals in React with ease. As you experiment, you’ll discover more possibilities, from intricate models to interactive VR scenes.

Happy coding!

--

--

Eftee Codes
Eftee Codes

Written by Eftee Codes

Full Stack Developer | Tech Enthusiast | Psychology & Economics Aficionado | Turning Code into Fun Experiences 🎮🧠

No responses yet