Licht und Schatten
Diese Anleitung wird dir helfen, mit einfachen Lichtern und Schatten in TresJS zu beginnen.
Wir werden eine einfache Szene mit drei Meshes und einer Ebene erstellen, aber nur zwei der Meshes werden Schatten werfen.
Einrichten der Szene (optional)
Wir importieren alle Module, die wir benötigen. Zusätzlich können wir Orbit-Controls von Cientos verwenden um unsere Szene besser zu beobachten, siehe hier wie das geht.
Das erste Objekt unserer Szene wird die Ebene sein, die Schatten empfängt. Zwei weitere Objekte werden Schatten werfen und das letzte wird überhaupt keinen Schatten werfen.
Wir verwenden das MeshToonMaterial, weil wir so den "weichen Schattierungseffekt" sehr leicht sehen können.
<script setup lang="ts">
import { OrbitControls } from '@tresjs/cientos'
import { TresCanvas } from '@tresjs/core'
</script>
<template>
<TresCanvas
clear-color="#111"
window-size
>
<OrbitControls />
<TresPerspectiveCamera :position="[5, 7.5, 7.5]" />
<TresMesh
:position="[-2, 2, 0]"
:rotation="[0, Math.PI, 0]"
>
<TresConeGeometry :args="[1, 1.5, 3]" />
<TresMeshToonMaterial color="#82DBC5" />
</TresMesh>
<TresMesh
:position="[0, 0, 0]"
>
<TresBoxGeometry :args="[1.5, 1.5, 1.5]" />
<TresMeshToonMaterial color="#4F4F4F" />
</TresMesh>
<TresMesh
:position="[2, -2, 0]"
>
<TresSphereGeometry />
<TresMeshToonMaterial color="#FBB03B" />
</TresMesh>
<TresMesh
:position="[0, -3, 0]"
:rotation="[-Math.PI / 2, 0, 0]"
>
<TresPlaneGeometry :args="[10, 10, 10, 10]" />
<TresMeshStandardMaterial color="#f7f7f7" />
</TresMesh>
</TresCanvas>
</template>
Lichter (Erklärung)
Wie du weißt, sind alle Teile von three.js in TresJS verfügbar. Das gilt auch für alle Arten von Lichtern. Wir müssen nur das Präfix Tres
hinzufügen, um sie als Vue-Komponente zu nutzen.
Aber nicht alle Lichter können Schatten erzeugen! Zum Beispiel ist der Zweck eines ambientLight alle Seiten deiner Szene zu beleuchten, dabei sollen keine Schatten erzeugt werden. Im Gegensatz dazu kann und sollte ein DirectionalLight, das die Sonne imitiert, Schatten werfen.
Schatten (Erklärung)
Es gibt verschiedene Arten von Schatten. Zum Beispiel wird der "weiche Schatten" automatisch erzeugt, wenn ein Objekt von einer Seite mehr Licht erhält. Ein "Standard Three.js Schatten" auf einer Oberfläche, muss von einem Mesh geworfen und von einem anderen Mesh empfangen werden. Wie wir in unserem Beispiel sehen, empfängt die Ebene
einen Schatten, wirft aber keinen. Beachte, dass nicht alle Materialien Schatten werfen beziehungsweise empfangen können.
Intern generiert Three.js automatisch ein neues Mesh mit einem ShadowMaterial, das in jedem Frame aktualisiert wird. Somit werden Schatten automatisch mit animiert, wenn du Animationen verwendest. Das ist aber auch der Grund, warum du Schatten vorsichtig verwenden solltest, da sie die Performance beeinträchtigen können.
WARNING
Die übermäßige Verwendung von Schatten auf diese Weise kann die Performance beeinträchtigen. Es gibt jedoch Möglichkeiten, die Performance zu verbessern. Für weitere Informationen, siehe dieses Video
Schatten aktivieren
Folgende drei Schritte brauchen wir.
Schatten im Renderer aktivieren
//...
<template>
<TresCanvas
clear-color="#111"
shadows
window-size
/>
//...
</template>
Das Licht zum Werfen von Schatten konfigurieren
Wir können einfach das Boolean cast-shadow
hinzufügen. Vue interpretiert es als ein prop
mit dem Wert true
.
Umgebungslicht erzeugt hier keine Art von Schatten
//...
<template>
<TresAmbientLight :intensity="1" />
<TresDirectionalLight
cast-shadow
:position="[0, 2, 0]"
:intensity="1"
/>
//...
</template>
Objekte zum Werfen oder Empfangen von Schatten einstellen
Ähnlich wie im vorherigen Schritt konfigurieren wir das Mesh, von dem wir möchten, dass es Schatten wirft (unsere Kugel), mit der Eigenschaft cast-shadow
. Zusätzlich konfigurieren wir das Objekt, das Schatten empfangen soll (unsere Ebene), mit der Eigenschaft receive-shadow
.
//...
<template>
<TresMesh
cast-shadow
:position="[2, -2, 0]"
>
<TresSphereGeometry />
<TresMeshToonMaterial color="#FBB03B" />
</TresMesh>
<TresMesh
receive-shadow
:position="[0, -3, 0]"
:rotation="[-Math.PI / 2, 0, 0]"
>
<TresPlaneGeometry :args="[10, 10, 10, 10]" />
<TresMeshStandardMaterial color="#f7f7f7" />
</TresMesh>
//...
</template>
Jetzt haben wir alle notwendigen Schritte, um Schatten zu unserer Szene hinzuzufügen abgeschlossen. Wenn wir nun das, was wir in grundlegenden Animationen gelernt haben, anwenden und unseren Würfel bewegen, wirst du sehen, dass der Schatten auch animiert wird 🤩
<script setup>
import { TresCanvas, useRenderLoop } from '@tresjs/core'
import { shallowRef } from 'vue'
const boxRef = shallowRef()
const { onLoop } = useRenderLoop()
onLoop(() => {
if (boxRef.value) {
boxRef.value.rotation.y += 0.01
}
})
</script>
<template>
//...
<TresMesh
ref="boxRef"
cast-shadow
:position="[0, 0, 0]"
>
<TresBoxGeometry :args="[1.5, 1.5, 1.5]" />
<TresMeshToonMaterial color="#4F4F4F" />
</TresMesh>
//...
</template>
Beachte, dass wir absichtlich cast-shadow
nicht auf den Cone
angewendet haben, damit er keinen Schatten wirft