image: bad.webp image_alt: "Ein Bad ganz in Fliesen: ein Becken voll klarem, blaugrünem Wasser mit Rand und Geländer, darin eine runde Säule; dahinter führt eine weiße Treppe auf ein Podest mit einem Plastikstuhl." kind: projekt duration: 1 Doppelstunde curriculum: "Sek I: Digitale Bilder und Visualisierung; Oberstufe: Vertiefung Computergrafik (Spiegelung, Portale)" topics: [computergrafik] reference: [workspace, kartografie] template: https://github.com/specht/backrooms-starter.git template_name: der Backrooms-Vorlage

Level 2: Das Bad

Unter den gelben Gängen riecht es nach Chlor. Du baust ein Bad aus Fliesen, Schritt für Schritt: ein Becken voll Wasser, einen Rand und ein Geländer, runde Säulen, die im Wasser stehen, und eine Treppe auf ein Podest, von dem aus ein Bademeister über alles wacht, nur dass keiner da ist. Dann machst du das Wasser trüb, dunkel oder lässt es ab, und zum Schluss siehst du, wie das Programm Wasser zeichnet, das es gar nicht gibt, und warum es dafür nicht das ganze Level zeichnen darf.

Hinter einer Tür im Gang ist ein Bad. Das Wasser bewegt sich, obwohl kein Wind geht. Ich habe nicht hineingefasst.

Zettel, mit Klebeband an einer Fliese befestigt
Level 2, »Das Bad«
Überlebensschwierigkeit Klasse 2: Die Fliesen sind glatt, das Wasser ist tief. Wie tief, steht in einer Aufgabe.
Ausdehnung gekachelt, so weit man sieht
Ausgänge einer, durch das Licht (siehe »Ein Ausgang«)

1. Wo du weitermachst

Diese Seite baut auf Level 1 auf: auf deinem Level, so wie es am Ende von Level 1 war, mit Vorgang, Rampe, krummem Gang, Treppenhaus, Dachboden und Schacht. Öffne den Ordner /workspace/backrooms-starter wieder in VS Code und starte die Vorschau (»Go Live«).

2. Ein Bad, Schritt für Schritt

Ein Becken

Der Vorgang hinter dem Saal bekommt in seiner Südwand eine Tür, zwei Felder breit und oben rund wie der Bogen zum Salon:

#......2###33###
[3]
door = bad 3
arch = 2.3              # oben rund, in der Mitte 2,3 m hoch

Leg dahinter rooms/bad.room an, eine Halle aus Fliesen, unten dunkel wie der Lambris im Salon, mit einem Becken in der Mitte:

# Hinter dem Vorgang: ein Bad. Das Wasser ist still. Zu still.

[room]
name = Bad
height = 4.5
walls = tiles
floor = tiles
wallpaper = #d6e4e1
carpet = #b9ccc8
ceiling = #e6efec
dado = 1.1, #2f4a4a     # unten dunkle Fliesen
dado_material = tiles

[map]
###33###########
#..............#
#..L.......L...#
#..............#
#..WWWWWWWWWW..#
#..WWWWWWWWWW..#
#..WWWWWWWWWW..#
#..............#
#..L.......L...#
#..............#
################

[L]
light = #e4f3ff
size = 1.4
power = 1.4

[W]
pool = 2.2              # so tief ist das Becken unter dem Boden
water = 0.25            # so tief unter dem Boden steht das Wasser

Jedes Feld mit W gehört zum Becken, nebeneinander sind sie eins. pool sagt, wie tief es unter den Boden des Raums reicht, water, wie tief darunter das Wasser steht: Hier steht es 25 cm unter dem Rand. Ins Wasser gehen kannst du nicht.

Eine Halle aus weißen Fliesen, unten an den Wänden dunkelgrün gefliest; im Boden ein langes, rechteckiges Becken voll hellem, blaugrünem Wasser, ohne Rand.

Aufgabe 1Wie tief ist das Wasser?

Im Becken des Bads steht pool = 2.2 und water = 0.25. Wie tief ist das Wasser im Becken?

m

Ein Rand und ein Geländer

[W]pool = 2.2              # so tief ist das Becken unter dem Bodenwater = 0.25            # so tief unter dem Boden steht das Wasserrim = 0.15, 0.3         # ein Rand aus Fliesen, 15 cm hoch, 30 cm breitrailing = on            # ein Geländer auf dem Rand

rim legt einen Rand aus Fliesen um das Becken, 15 cm hoch und 30 cm breit; du kannst hinaufsteigen. railing = on stellt ein Geländer aus Metall darauf, überall dort, wo man am Rand stehen kann; um die Ecken biegt es sich.

Dasselbe Becken mit einem niedrigen, gefliesten Rand und einem Geländer aus glänzendem Metall darauf, das an den Ecken in Bögen herumläuft.

Säulen im Wasser

Zwei runde Säulen sollen im Becken stehen, vom Boden des Beckens bis an die Decke. Eine Säule ist ein Block; damit ihr Feld trotzdem zum Becken gehört, sagt in = W, in welchem Becken sie steht:

#..WWWWWWWWWW..##..WWWOWWWOWW..##..WWWWWWWWWW..#
[O]
block = 0.8, 6.7, 0.8   # vom Boden des Beckens bis an die Decke
shape = round
material = tiles
color = #e8eeec
in = W                  # die Säule steht im Becken

Mit in = W gehört das Feld zum Becken der W, und die Säule steht trotzdem darin. Die Säule steht auf dem Boden des Beckens und reicht von dort bis an die Decke: 2,2 m plus 4,5 m, darum ist ihr Block 6,7 m hoch.

Das Becken mit Rand und Geländer, darin eine runde, weiß geflieste Säule, die aus dem Wasser bis an die Decke reicht.

Ausprobieren: Genauso hängt eine Leuchte über dem Wasser: ein eigener Buchstabe im Becken, mit light = #e4f3ff und in = W. Wie sieht ihr Licht im Wasser aus? Und was passiert, wenn du bei einer Säule in = W weglässt?

Ein Podest für den Bademeister

An der Ostseite führt eine Treppe auf ein Podest neben dem Becken, und oben steht ein Stuhl, wie für einen Bademeister:

#..............##..WWWWWWWWWWPP##..WWWOWWWOWWPC##..WWWWWWWWWWSS##............SS##..L.......L.SS##..............#
[S]
stairs = north, 2       # eine Treppe nach Norden, 2 m hinauf
material = tiles
color = #e8eeec
railing = on

[P]
raise = 2               # oben ein Podest, so hoch, wie die Treppe steigt
material = tiles
color = #e8eeec
railing = on

[C]
model = models/plastic_monobloc_chair_01/plastic_monobloc_chair_01_1k.gltf   # Poly Haven, CC0
height = 0.88
rotation = 270          # mit Blick über das Becken
on = P                  # auf dem Podest

Treppe und Podest kennst du aus dem Treppenhaus in Level 1. Diese Treppe steht frei im Raum; ihr Geländer läuft auf der offenen Seite hinauf und oben um das Podest herum, in einem Stück. Der Stuhl steht in einem eigenen Feld, und mit on = P gehört es zum Podest: Der Stuhl steht oben.

3. Anderes Wasser

Das Wasser hat noch drei Einträge. tint ist seine Farbe, so, wie Weiß hinter 2 m davon aussieht; ohne Angabe #86b8b5, blaugrün. waves sagt, wie groß die Wellen sind: 1 ruhig, 2 größer und schneller, 0 glatt wie Glas. Und water = off lässt das Becken leer; ohne Geländer fällst du dann hinein. So sähe das Bad mit dreien davon aus, vom Ende des Beckens aus über seine ganze Länge; danach bleibt es klar:

Steht eine Säule oder eine Leuchte mit in = W in einem Becken, nimmt ihr Feld alles vom Becken der W: Tiefe, Wasser, Farbe und Wellen.

4. Unten im Schacht

Die Kisten im Schacht sind weg. Wo sie standen, ist Wasser, so tief, dass ich den Grund nicht sehe.

Zettel, nass, kaum noch zu lesen

Der Schacht hinter dem krummen Gang aus Level 1 bekommt statt der Kisten ein Becken, mit einem Geländer darum. Ersetze in rooms/schacht.room die Kisten im Grundriss durch ein Becken:

#..........##....BBBB..#1....BBBB.W##....BBBB..##....BBBB..##..S...L...#

und den Abschnitt [K] durch:

[B]
pool = 1.4              # unten im Schacht ein Becken
water = 0.2
tint = #9fbfb4
railing = on

Wer durch die Tür ins Leere tritt, fällt gleich hinter ihr senkrecht hinunter, an der Westwand: Das Becken fängt erst vier Felder weiter an. Von unten siehst du dann übers Geländer aufs Wasser.

Aus dem krummen Gang durch eine Tür steil hinunter in einen weiß gefliesten Schacht; ganz unten ein Becken voll blaugrünem Wasser hinter einem Geländer, daneben ein Plastikstuhl.

5. Im Maschinenraum: Wasser und was gezeichnet wird

Ich habe mich umgedreht, und der Raum hinter mir war weg. Nicht dunkel, weg. Als ich wieder hinsah, war er da, als wäre nichts.

Notiz am Rand einer Karte, mit Bleistift

Wasser, das es nicht gibt

Wie macht man Wasser? Gar nicht, eigentlich: Die Wasserfläche zeigt zwei andere Bilder desselben Raums. Für das eine schaut eine zweite Kamera von unten nach oben, so tief unter der Wasserfläche, wie du über ihr bist: Das ist die Spiegelung. Für das andere zeichnet das Programm nur, was unter dem Wasser liegt, den Boden und die Wände des Beckens. Wie viel du von welchem Bild siehst, hängt davon ab, wie flach du schaust: Von oben siehst du hinein, flach darüber spiegelt es fast nur, wie an einem echten See (Fresnel). Je mehr Wasser zwischen dir und dem Boden liegt, desto blaugrüner wird er, denn Wasser schluckt Rot am stärksten. Langsame Wellen, aus Rauschen gerechnet, verbiegen beide Bilder ein wenig, und wo sie das Licht bündeln, tanzen helle Linien über den Boden.

Das steht in engine/water.js. Auch die Fliesen glänzen: In ihnen spiegeln sich die Leuchten, umso stärker, je flacher du über sie schaust; das rechnet der Shader in engine/main.js aus, ohne ein zweites Bild.

Zwei Bilder mehr für jedes Bild, in dem Wasser zu sehen ist: Das kostet. Zeichnete das Programm jedes Mal das ganze Level, mit allen Räumen, wäre das bald zu langsam, vor allem auf dem Handy. Darum zeichnet es nur, was du von deinem Platz aus sehen kannst.

Was gezeichnet wird

In einen anderen Raum siehst du nur durch eine Öffnung, eine Tür oder ein Loch. Solche Öffnungen heißen Portale, und so sucht portals.js für jedes Bild aus, was gezeichnet wird:

  1. Der Raum, in dem du stehst, ist zu sehen, soweit er im Bild liegt.
  2. Jedes seiner Portale wird aufs Bild gerechnet, als Rechteck um die Öffnung. Liegt das Rechteck im Bild, siehst du durch das Portal in den Raum dahinter, aber nur durch dieses Rechteck.
  3. Von dort geht es durch die Portale dieses Raums weiter, jedes beschnitten auf das Rechteck, durch das du gerade schaust. Bleibt nichts übrig, ist dieser Weg zu Ende.

Gezeichnet werden nur die Räume, die so erreicht werden; alle anderen kosten nichts, und ein Becken zeichnet seine beiden Bilder nur, wenn sein Raum dabei ist. So suchten schon Spiele wie Descent (1995) und Duke Nukem 3D (1996) aus, was sie zeichnen. In der Automap zeigt U, welche Räume von deinem Platz aus gezeichnet werden: Sie bleiben hell, alle anderen werden blass, die Portale, durch die du schaust, sind orange, dein Blickfeld ist rot.

Ausprobieren: Öffne die Automap, drück U und dreh dich langsam einmal im Kreis. Räume kommen dazu und verschwinden, je nachdem, welche Türen im Bild sind. Manchmal bleibt ein Raum hell, den du gar nicht siehst, weil eine Wand ihn verdeckt: Woran liegt das?

Was ein Shader ist, steht im Handbuch zu GLSL. Wenn du am Programm etwas änderst und nichts mehr geht: Die Konsole des Browsers (F12) sagt, in welcher Zeile es hakt, und git diff zeigt, was du geändert hast.

6. Ein Ausgang

Die Leuchten gehen nie aus. Ich habe versucht, eine zu erreichen, um sie abzuschrauben. Sie ist warm. Nicht heiß, warm. Wie etwas, das atmet. Ich glaube, wer verstehen will, wie es hier hell wird, muss dorthin, wo das Licht gemacht wird.

Funkspruch, Ende fehlt

Weiter geht es in Level 3: Lampen an der Wand, Möbel, und wie das Programm das Licht berechnet, das zwischen den Wänden hin- und herfällt.