Animating the 3D cube with Three.js
Tags: javascript, animation, webdev, tutorial
Published: 2023-08-24 13:59:29


## Introduction

In today's digital world, web technology has become incredibly powerful. We've reached a point where you can experience captivating 3D graphics right in your web browser. Imagine this—no need for plugins or external tools; it's all within the realm of pure web content. And guess what's driving this exciting change? It's WebGL, a fantastic technology that makes rendering both 2D and 3D graphics possible. But hey, let's be real—it might seem a bit tricky, especially for those starting out. That's where Three.js comes in as a superhero! Three.js is like your trusty sidekick—it simplifies the complex bits and offers a much friendlier path into the enchanting world of 3D web graphics. In this article, let's embark on a journey to explore the basics of bringing 3D graphics to life using WebGL and the magical powers of Three.js.

## WebGL and Three.js: A Perfect Match
WebGL is a low-level, complex API. While it provides tremendous power and flexibility, it also comes with a steep learning curve. On the other hand, Three.js provides a higher-level abstraction, enabling developers to create 3D scenes without delving deep into the intricacies of WebGL.

## Starting Simple: A Rotating Cube
Let's animate a 3D cube using Three.js to illustrate how easy it is to get started.

### 1. Setup
First, include the Three.js library in your project:
```javascript
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
```

### 2. Create a Simple Scene
We need three main components: a scene, a camera, and a renderer.
```javascript
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
```

### 3. Add the Cube with texture
To display a cube, we'll need a box geometry and a material to cover it.
```javascript
const geometry = new THREE.BoxGeometry();
  const textureLoader = new THREE.TextureLoader();
  const materials = [
    new THREE.MeshBasicMaterial({ map: textureLoader.load('https://threejs.org/examples/textures/crate.gif') }),
    new THREE.MeshBasicMaterial({ map: textureLoader.load('https://threejs.org/examples/textures/crate.gif') }),
    new THREE.MeshBasicMaterial({ map: textureLoader.load('https://threejs.org/examples/textures/crate.gif') }),
    new THREE.MeshBasicMaterial({ map: textureLoader.load('https://threejs.org/examples/textures/crate.gif') }),
    new THREE.MeshBasicMaterial({ map: textureLoader.load('https://threejs.org/examples/textures/crate.gif') }),
    new THREE.MeshBasicMaterial({ map: textureLoader.load('https://threejs.org/examples/textures/crate.gif') })
  ];
  const cube = new THREE.Mesh(geometry, materials);
  scene.add(cube);
``` 

### 4. Animate the Cube
We'll create an animation loop that rotates the cube.
```javascript
function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();
```

### 5. Position the Camera
Lastly, we need to position the camera slightly out so that it can view the cube:
```javascript
camera.position.z = 5;
```

Now, you'll see a spinning cube on a blank canvas. The ease of setting up this scene demonstrates the power of Three.js.

![cube-gif](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ob0jxx274c0dwbq0418.gif)

## Conclusion
With just a few lines of code, we've delved into the world of 3D graphics on the web. The combination of WebGL for rendering power and Three.js for abstraction makes it accessible for developers to create stunning visual content directly within the browser. As you explore deeper into this realm, you'll find that the possibilities—from intricate game worlds to detailed simulations—are nearly limitless. Happy coding!

Connect with me
- [LinkedIn](https://www.linkedin.com/in/aneeqa-khan-990459135/)
- [GitHub](https://github.com/AneeqaKhan)