---
title: 基础动画
description: 如何使用 useRenderLoop 组合函数来为您的对象添加动画。
author: alvarosabu
thumbnail: /recipes/animations.png
difficulty: 0
---
# 基础动画
本指南将帮助您开始使用 TresJS 进行基本的动画。
我们将创建一个简单的场景,其中包含一个立方体。然后,我们将立方体添加动画,使其围绕 Y 和 Z 轴旋转。
## useRenderLoop
`useRenderLoop` 组合式函数构成了 TresJS 动画的核心。它允许您注册一个回调函数,该函数将在渲染器以浏览器的刷新率更新场景时每次调用。
要查看其工作原理的详细说明,请参考 [useRenderLoop](/api/composables#userenderloop) 文档。
```ts
const { onLoop } = useRenderLoop()
onLoop(({ delta, elapsed }) => {
// 将在每一帧运行 ~ 60FPS(取决于您的显示器)
})
```
## 获取立方体的引用
要为立方体设置动画,我们需要获取它的引用。我们可以通过使用 [模板引用](https://cn.vuejs.org/guide/essentials/template-refs.html) 将 ref 属性传递给 `TresMesh` 组件来实现。这将返回 THREE 实例。
为了提高性能,我们将使用 [Shallow Ref](https://v3.vuejs.org/guide/reactivity-fundamentals.html#shallow-reactivity) 来存储引用,而不是常规引用。原因请参阅此处[here](../advanced/caveats.md#reactivity)
```vue
```
## 使立方体动起来
现在我们已经获得了立方体的引用,就可以对其进行动画处理了。我们将使用 `onLoop` 回调更新立方体的旋转。
```ts
onLoop(({ delta, elapsed }) => {
if (boxRef.value) {
boxRef.value.rotation.y += delta
boxRef.value.rotation.z = elapsed * 0.2
}
})
```
你也可以使用内部[THREE clock](https://threejs.org/docs/?q=clock#api/en/core/Clock)的 `delta` 或 `elapsed` 来为立方体制作动画。
## 为什么不使用响应式系统?
你可能想知道为什么我们不使用响应式系统来为立方体制作动画。答案很简单,性能。
```vue
// This is a bad idea ❌
```
我们可能会忍不住使用响应式系统来为立方体制作动画。但这并不是一个好主意。
原因是 Vue 的响应式系统基于代理: https://vuejs.org/guide/extras/reactivity-in-depth.html#how-reactivity-works-in-vue,它并不适合用于每秒更新 60 次或更多的渲染循环中。
下面的嵌入页面展示了一个[代理 vs 普通对象的基准测试](https://measurethat.net/Benchmarks/Show/12503/0/object-vs-proxy-vs-proxy-setter) 。正如你所看到的,代理比普通对象慢 5 倍。
你可以在 [注意事项](../advanced/caveats.md#reactivity) 部分了解更多关于这个方面的内容。