Skip to content

Modelle laden

Alle Modelle, die in dieser Anleitung verwendet werden, stammen von Alvaro Saburido.

3D-Modelle sind in Hunderten von Dateiformaten verfügbar, jedes mit unterschiedlichen Zwecken, variierenden Eigenschaften und Komplexität.

In dieser Anleitung konzentrieren wir uns auf das Laden von gLTF-Modellen (GL Transmission Format), dem häufigsten Format für 3D-Modelle im Web.

Es gibt verschiedene Möglichkeiten, Modelle in TresJS zu laden.

WARNING

Bitte beachte, dass wir in den vorherigen Beispielen das "top-level" await verwendet haben. Stelle sicher, dass du es mit einer Suspense-Komponente umgibst.

Verwendung von useLoader

Das Composable useLoader ermöglicht es dir, jeden Typ von three.js-Loader und eine URL zum Laden der Ressource zu übergeben. Es gibt ein Promise mit der geladenen Ressource zurück.

Eine detaillierte Erklärung, wie useLoader verwendet wird, findest du in der Dokumentation von useLoader.

ts
import { useLoader } from '@tresjs/core'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader'

const { scene } = await useLoader(GLTFLoader, '/models/AkuAku.gltf')

Dann kannst du die Szene des Modells in einer primitive-Komponente von TresJS übergeben, um sie zu rendern:

html
<TresCanvas>
    <primitive :object="scene" />
</TresCanvas>

Die Komponente <primitive /> ist keine eigenständige Komponente im Quellcode von Tres. Stattdessen ist sie Teil der Kernfunktionalität von Tres. Wenn du <primitive> verwendest, wird dies zu einem Aufruf von createElement, der das entsprechende three.js-Objekt basierend auf der bereitgestellten "object"-Eigenschaft erstellt.

Beachte im obigen Beispiel, dass wir die Suspense-Komponente verwenden, um die TresCanvas-Komponente zu umgeben. Dies liegt daran, dass useLoader eine Promise zurückgibt und wir warten müssen, bis sie erfüllt ist, bevor wir die Szene rendern können.

Verwendung von useGLTF

Eine bequemere Möglichkeit, Modelle zu laden, ist die Verwendung des Composables useGLTF, das im Paket @tresjs/cientos verfügbar ist.

ts
import { useGLTF } from '@tresjs/cientos'

const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf')

Ein Vorteil der Verwendung von useGLTF ist, dass du eine draco-Eigenschaft übergeben kannst, um die Draco-Kompression für das Modell zu aktivieren. Dies wird die Größe des Modells reduzieren und die Performance verbessern.

ts
import { useGLTF } from '@tresjs/cientos'

const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf', { draco: true })

Alternativ kannst du Objekte innerhalb des Modells leicht mit der Eigenschaft nodes auswählen.

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

const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf', { draco: true })
</script>

<template>
  <TresCanvas
    clear-color="#82DBC5"
    shadows
    alpha
  >
    <TresPerspectiveCamera :position="[11, 11, 11]" />
    <OrbitControls />
    <primitive :object="nodes.MyModel" /> // "MyModel" dient hier nur als Platzhalter
  </TresCanvas>
</template>

Verwendung von GLTFModel

Die Komponente GLTFModel ist eine Hülle um useGLTF, die im Paket @tresjs/cientos verfügbar ist.

vue
<script setup lang="ts">
import { OrbitControls, GLTFModel } from '@tresjs/cientos'
</script>
<template>
  <TresCanvas clear-color="#82DBC5" shadows alpha>
    <TresPerspectiveCamera :position="[11, 11, 11]" />
    <OrbitControls />
    <Suspense>
      <GLTFModel path="/models/AkuAku.gltf" draco />
    </Suspense>
    <TresDirectionalLight :position="[-4, 8, 4]" :intensity="1.5" cast-shadow />
  </TresCanvas>
</template>

Dieser Ansatz ist zwar einfacher, bietet aber weniger Kontrolle über das Modell.

Verwendung von useFBX

Das Composable useFBX ist im Paket @tresjs/cientos verfügbar.

ts
import { useFBX } from '@tresjs/cientos'

const model = await useFBX('/models/AkuAku.fbx')

Dann muss man nur das dem primitive das model zuweisen:

html
<TresCanvas shadows alpha>
    <primitive :object="model" />
</TresCanvas>

Verwendung von FBXModel

Die Komponente FBXModel ist eine Hülle um useFBX, die im Paket @tresjs/cientos verfügbar ist. Ihre Verwendung ist ähnlich wie bei GLTFModel:

vue
<script setup lang="ts">
import { OrbitControls, FBXModel } from '@tresjs/cientos'
</script>
<template>
  <TresCanvas clear-color="#82DBC5" shadows alpha>
    <TresPerspectiveCamera :position="[11, 11, 11]" />
    <OrbitControls />
      <Suspense>
        <FBXModel path="/models/AkuAku.fbx" />
      </Suspense>
      <TresDirectionalLight :position="[-4, 8, 4]" :intensity="1.5" cast-shadow />
  </TresCanvas>
</template>