---
title: Basic Animations
description: This guide will help you understand refs, useFrame and how to make basic animations with Fiber
nav: 17
---
This tutorial will assume some React knowledge, and will be based on [this starter codesandbox](https://codesandbox.io/s/getting-started-01-12q81?from-embed), so just fork it and follow along!
We will build a really small, continuous animation loop, that will be the basic building block of more advanced animations later on.
## `useFrame`
`useFrame` is a Fiber hook that lets you execute code on every frame of Fiber's render loop. This can have a lot of uses, but we will focus on building an animation with it.
It's important to remember that **Fiber hooks can only be called inside a `` parent**!
```jsx
import { useFrame } from '@react-three/fiber'
function MyAnimatedBox() {
useFrame(() => {
console.log("Hey, I'm executing every frame!")
})
return (
)
}
```
This loop is the basic building block of our animation, the callback we pass to `useFrame` will be executed every frame and it will be passed an object containing the state of our Fiber scene:
For example, we can extract time information from the `clock` parameter, to know how much time has elapsed in our application, and use that time to animate a value:
```jsx
useFrame(({ clock }) => {
const a = clock.elapsedTime
console.log(a) // the value will be 0 at scene initialization and grow each frame
})
```
`clock` is a [three.js Clock](https://threejs.org/docs/#api/en/core/Clock) object, from which we are getting the total elapsed time, which will be key for our animations.
## Animating with Refs
It would be tempting to just update the state of our component via `setState` and let it change the `mesh` via props, but going through state isn't ideal, when dealing with continuous updates, commonly know as [transient updates]().
Instead, we want to **directly mutate our mesh each frame**. First, we'll have to get a `reference` to it, via the `useRef` React hook:
```jsx
import React from 'react'
function MyAnimatedBox() {
const myMesh = React.useRef()
return (
)
}
```
`myMesh` will now hold a reference to the actual three.js object, which we can now freely mutate in `useFrame`, without having to worry about React:
```jsx
useFrame(({ clock }) => {
myMesh.current.rotation.x = clock.elapsedTime
})
```
Let's have a closer look:
- We are destructuring `clock` from the argument passed to `useFrame`, which we know is the state of our Fiber scene.
- We are accessing the `rotation.x` property of `myMesh.current` object, which is a reference to our mesh object
- We are assigning our time-dependent value `a` to the `rotation` on the `x` axis, meaning our object will now infinitely rotate between -1 and 1 radians around the x axis!
**Exercises**
- Try `Math.sin(clock.elapsedTime)` and see how your animation changes
## Next steps
Now that you understand the basic technique for animating in Fiber, [learn how event works](/tutorials/events-and-interaction)!
If you want to go deeper into animations, check these out:
- [Animating with React Spring](/tutorials/using-with-react-spring)