Skip to content

Animations de bases

Ce guide vous aidera à démarrer avec les animations de base dans TresJS.

Nous allons construire une scène simple avec un cube. Nous animerons ensuite le cube pour qu'il tourne autour des axes Y et Z.

useRenderLoop

Le composable useRenderLoop est le cœur des animations dans TresJS. Vous permet d'enregistrer une fonction de rappel qui sera exécutée chaque fois que le moteur de rendu met à jour la scène à la fréquence de rafraîchissement du navigateur.

Pour une explication détaillée de son fonctionnement, consultez la documentation de useRenderLoop.

ts
const { onLoop } = useRenderLoop()

onLoop(({ delta, elapsed }) => {
  // ~60FPS (Dépend de votre moniteur)
})

Donner la référence au cube

Pour animer le cube, nous devons lui donner une référence. Nous pouvons le faire en passant un Template Reference en utilisant la propriété ref dans le composant TresMesh. Cela renverra l’instance de THREE.

Pour améliorer les performances, nous utiliserons une Shallow Reference pour stocker la référence au lieu d'une référence régulière. Vous pouvez voir pourquoi ici

vue
<script setup lang="ts">
import { TresCanvas } from '@tresjs/core'

const boxRef: ShallowRef<TresInstance | null> = shallowRef(null)
</script>

<template>
  <TresCanvas>
    <TresMesh
      ref="boxRef"
      :scale="1"
    >
      <TresBoxGeometry :args="[1, 1, 1]" />
      <TresMeshNormalMaterial />
    </TresMesh>
  </TresCanvas>
</template>

Animer le cube

Maintenant que nous avons une référence au cube, nous pouvons l'animer. Nous utiliserons le rappel onLoop pour mettre à jour la rotation du cube.

ts
onLoop(({ delta, elapsed }) => {
  if (boxRef.value) {
    boxRef.value.rotation.y += delta
    boxRef.value.rotation.z = elapsed * 0.2
  }
})

Vous pouvez également utiliser delta de horloge interne de THREE ou elapsed pour animer le cube.

Mais pourquoi ne pas utiliser la réactivité ?

Vous vous demandez peut-être pourquoi nous n'utilisons pas la réactivité pour animer le cube. La réponse est simple : la performance.

vue
// Esto es una mala idea ❌
<script setup lang="ts">
import { TresCanvas } from '@tresjs/core'

const boxRotation = reactive([0, 0, 0])

onLoop(({ delta, elapsed }) => {
  boxRotation[1] += delta
  boxRotation[2] = elapsed * 0.2
})
</script>

On peut être tenté d'utiliser la réactivité pour animer le cube. Mais ce serait une mauvaise idée. La raison en est que la réactivité de Vue est basée sur des proxys et n'est pas conçue pour être utilisée dans une boucle de rendu qui se met à jour 60 fois ou plus par seconde.

La page intégrée ci-dessous montre le test de performances d'un proxy par rapport à un objet standard. Comme vous pouvez le constater, le proxy est 5 fois plus lent que l'objet standard.

Vous pouvez en savoir plus à ce sujet dans la section de Mise en garde.