Dieser Leitfaden soll dir helfen, von Version 1 zur neusten Version von TresJS 🤩✨ zu migrieren.
::: code-group
pnpm update @tresjs/core
npm update @tresjs/core
yarn upgrade @tresjs/core
:::
TresJS ist jetzt ein Vue Custom Renderer 🎉, der innerhalb einer umhüllenden Komponente TresCanvas
liegt, die den WebGLRenderer
und die Scene
für dich erstellt und eine neue Instanz der Vue-App zur Darstellung der Szene erzeugt.
Dies war wahrscheinlich das am meisten gefragte Feature für TresJS. Jetzt funktionieren die Tres-Komponenten mit Volar und bieten Type-Intellisense.
TresJS generiert nun zur Kompilierungszeit Typdeklarationen für alle Komponenten basierend auf dem Three.js-Katalog. Das bedeutet, dass du alle Three.js-Komponenten verwenden kannst und Type-Intellisense dafür erhälst.
Das TresPlugin
ist nun optional. Du kannst TresJS ohne das Plugin verwenden, indem du die Komponenten direkt aus tresjs/core
importierst:
<script setup lang="ts">
import { TresCanvas } from '@tresjs/core'
</script>
<template>
<TresCanvas>
<TresPerspectiveCamera
:position="cameraPosition"
:fov="cameraFov"
:aspect="cameraAspect"
:near="cameraNear"
:far="cameraFar"
/>
<TresMesh
:geometry="geometry"
:material="material"
/>
</TresCanvas>
</template>
::: tip Aufgrund von Performance und Bundlegröße ist dieser Ansatz zu empfehlen, da durch das Tree-Shaking nur die tatsächlich verwendeten Komponenten importiert werden. :::
Die Komponente <TresScene />
ist nun veraltet, da die Szene jetzt durch <TresCanvas />
erstellt wird.
Am Anfang dachte ich, dass es eine gute Idee wäre, eine separate Komponente für die Szene zu haben, um den Aufbau so ähnlich wie möglich an plain Three.js zu halten. Es stellte sich aber heraus, dass es nicht wirklich nützlich war.
Du kannst jetzt eine Szene so erstellen:
<template>
<TresCanvas>
<TresPerspectiveCamera
:position="cameraPosition"
:fov="cameraFov"
:aspect="cameraAspect"
:near="cameraNear"
:far="cameraFar"
/>
<TresMesh
:geometry="geometry"
:material="material"
/>
</TresCanvas>
</template>
Um deinen Code zu migrieren, kannst du einfach die Komponente <TresScene />
entfernen und die Kinder in die Komponente <TresCanvas />
verschieben.
useCatalog
ist jetzt veraltetDie Funktion useCatalog
ist veraltet. Du kannst den Katalog jetzt direkt von @tresjs/core
importieren.
Du kannst mehr darüber hier lesen: Erweiterung
Ändere dies:
import { useCatalog } from '@tresjs/core'
import { TextGeometry } from 'three/addons/geometries/TextGeometry'
const { extend } = useCatalog()
extend({ TextGeometry })
Zu diesem:
// Korrekt ✅
import { extend } from '@tresjs/core'
import { TextGeometry } from 'three/addons/geometries/TextGeometry'
extend({ TextGeometry })
getModel
ist jetzt veraltetDie Funktion getModel
ist veraltet. Du kannst jetzt direkt die Eigenschaft model
verwenden.
Ändere dies:
// Falsch ❌
<script setup lang="ts">
import { useGLTF } from '@tresjs/cientos'
const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf', { draco: true })
const modelRef = ref()
watch(modelRef, ({ getModel }) => {
const model = getModel()
model.position.set(0, 0, 0)
})
</script>
<template>
<primitive :object="nodes.MyModel" />
</template>
Zu diesem:
// Korrekt ✅
<script setup lang="ts">
import { useGLTF } from '@tresjs/cientos'
const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf', { draco: true })
const modelRef = ref()
watch(modelRef, (model) => {
// Do something with the model
model.position.set(0, 0, 0)
})
</script>
<template>
<primitive :object="nodes.MyModel" />
</template>
Die Komponente TresOrbitControls
muss nach der Kamera im Baum stehen. Dies liegt daran, dass die Controls die Kamera kennen müssen, um zu funktionieren.
Ändere dies:
// Falsch ❌
<template>
<TresCanvas>
<TresOrbitControls />
<TresPerspectiveCamera />
</TresCanvas>
</template>
Zu diesem:
// Korrekt ✅
<template>
<TresCanvas>
<TresPerspectiveCamera />
<TresOrbitControls />
</TresCanvas>
</template>
Für Version 3 haben wir die gesamte State-Logik umstrukturiert, um sie flexibler und einfacher für Entwickler von Plugins und Paketen des Ökosystems zu machen. Anstatt wie in Version 2 einen Store zu verwenden, nutzen wir jetzt einen Kontextanbieter basierend auf provide/inject
.
Die Funktion useTres
ist jetzt ein Alias für die Funktion useTresContext
, um bestehende Demos und Experimente nicht zu brechen, aber erwäge künftig useTres
zu verwenden.
Anstelle eines großen reaktiven Objekts erhältst du jetzt direkt die Referenzen scene
und renderer
, unter anderem.
Ändere dies:
// Falsch ❌
import { useTres } from '@tresjs/core'
const { state, setState } = useTres()
console.log(state.scene)
Zu diesem:
// Korrekt ✅
import { useTresContext } from '@tresjs/core'
const { scene, renderer } = useTresContext()
console.log(scene.value)
Für detailliertere Informationen über das neue Context-Provider-System kannst du den Abschnitt API DOCS lesen.