Wo ein Merkmal sitzt
Vier gewürfelte Zahlen bauen das ganze Gesichtslayout. Sie sagen nicht nur, wo Augen, Nase und Mund sitzen, sondern auch, wie viel Platz jedes von ihnen hat.
Ein Merkmal sitzt hier nicht in Pixeln, sondern in Kugelkoordinaten des
Kopfes: u ist der Längengrad – 0 an der Nasenmitte,
±1.48 am Ohr –, v der Breitengrad, +1.57 am Scheitel,
−1.57 am Kinn. Das sind dieselben beiden Zahlen, aus denen die
Kopfform ihre Oberfläche baut. Wie ein
Merkmal von dort ins Bild kommt, steht im nächsten Kapitel
(Raum); hier geht es darum, wer die Adressen
vergibt.
Vier Gene
macheLayout zieht vier Zahlen und leitet alles Übrige aus
ihnen ab:
| Gen | Bereich | Was es bedeutet |
|---|---|---|
augeU | 0.30 … 0.80 | halber Augenabstand im Längengrad |
mitte | −0.36 … 0.14 | Mitte des Gesichtsfelds. Tief heißt: große Stirn |
spreizung | 0.62 … 1.10 | wie weit Augen, Nase und Mund vertikal auseinanderliegen |
skala | 0.78 … 1.30 | Größenfaktor für alle Gesichtsmerkmale |
Sie kommen aus einem geforkten Strom:
macheLayout(strom(seed, 'layout')). Das ist
keine Kosmetik. Läge das Layout im Hauptstrom, müsste es dort
vor der Merkmalswahl gezogen werden – die Merkmale hängen ja
von der Lage ab. Jede spätere Änderung am Layout, und sei es ein
einziger neuer rng.range-Aufruf, verschöbe dann die
Merkmale aller Seeds. Ein Seed ist aber die Adresse eines
Gesichts.
Was eine Zone ist
Eine Zone ist der Platz eines Merkmals auf dem Kopf: Mitte und Halbmaße in Kugelkoordinaten. Genau das bedeutet ein Rahmen in einer Zeichnung – wer ihn füllt, stößt nirgends an.
Zwei Eigenschaften tragen die ganze Konstruktion. Die Zonen
kacheln: keine Lücke, keine Überlappung. Und die
Mitte einer Zone ist nicht zwingend der Anker des
Merkmals, das darin sitzt – die Gesichtsmitte aus dem Gen
mitte liegt anderswo als der Nasenanker, der die Mitte
seiner Zone ist.
Ohne Zonen setzt das Layout nur Anker, und die Größe kommt aus einem unabhängigen Faktor. Dann läuft bei eng stehenden Ankern eine lange Nase durch den Mund – und niemand kann sagen, welche der beiden Zahlen falsch war.
Die Nasenzone ist der interessante Fall: sie ist Wurzel und Rücken in einem. Sie beginnt oben auf Augenhöhe und endet unten an der Mundzone. Dass sie die Augenzonen trotzdem nicht überlappt, liegt an ihrer Breite: sie ist nur so breit wie die Nasenbrücke und läuft zwischen den Augen hindurch.
Die Konstanten
| Konstante | Wert | Warum gerade so |
|---|---|---|
AUGENZONE | 0.34 | Anteil am Abstand Augenlinie ↔ Mundlinie. Reicht über die Augenlinie hinaus, dort sitzt auch die Nasenwurzel |
MUNDZONE | 0.5 | Nicht kleiner: bei 0.2 wurde aus einem gezeichneten Zahngitter ein schwarzer Klecks |
BRUECKE | 0.45 | Anteil des halben Augenabstands für die Nasenbrücke. Der Rest ist Augenbreite – deshalb bleiben eng stehende Augen klein, ohne dass es jemand extra klemmt |
WANGE | 1.35 | Wie weit die Augenzone nach außen reicht. Das Ohr sitzt bei 1.48 |
MUNDBREITE | 0.62 | Halbe Mundbreite im Längengrad. Zusammen mit MUNDZONE die Proportion jedes Mundes |
Die Zone ist die Obergrenze, nicht das Maß
Die Zone sagt, wo ein Merkmal nicht hindarf. Sie sagt nicht, wie groß es ist. Das ist der Unterschied, an dem die erste Fassung dieser Ausgabe gescheitert ist.
Die Augen sind zwei Prozent der Kopfbreite groß – Stecknadeln, kaum als Augen zu erkennen.
Ursache: die Zonenhöhe wurde direkt als Augengröße genommen. Die Augenzone ist aber flach: zwischen Braue und Nasenwurzel ist wenig Platz, und dieser Platz ist die Grenze, an die das Auge nicht stoßen darf – nicht seine Größe.
Lösung: Wunschmaß aus der Gesichtsskala, gedeckelt durch die Zone, und mit einer Untergrenze, unter der kein Merkmal fallen kann.
Man sieht die Bauart in jeder der vier Zeilen: ein
Math.min aus Wunsch und Zonenmaß, umschlossen von einem
klemm. Und die Deckel sind lose – hoehe * 4.5
für das Auge, hoehe * 1.9 für die Mundhöhe. Ein gedrängtes
Gesicht bekommt kleinere Züge, aber keine Nadeln.
Das Blatt sieht aus wie eine Kinderstube: alle Köpfe wirken jung, weich und gleich, ganz gleich wie verschieden ihre Schädel sind.
Ursache: die Augengröße hing hart an der Zonenhöhe. Wo die Zonen eng lagen, wurden die Züge winzig – und winzige Züge in einem großen Kopf sind das Kindchenschema. Das Blatt soll aber Leute zeigen, keine Babys.
Lösung: Untergrenzen für Auge, Nase und Mund, und ein
skala-Bereich, der nach oben offener ist als früher.
Groß gezeichnete Züge sind Erwachsene.
Merkmale schrumpfen, sobald der Kopf sich dreht. Tief sitzende Zonen werden zum Strich.
Ursache: jedes Merkmal wird in einem lokalen System
gezeichnet, das an seinem Anker hängt – die Funktion
f.to(lx, ly) rechnet eine Koordinate aus
−1…1 in einen Bildpunkt um. Dabei staucht sie beide
Achsen mit den Verkürzungsfaktoren fx und
fy der Oberfläche an dieser Stelle. Wer die Zonenmaße
also in Bildpixeln misst – die sind ja bereits verkürzt – und
hineingibt, staucht sie ein zweites Mal.
Lösung: platz() rechnet beide Achsen verkürzt
zurück, jede mit ihrem eigenen Faktor. Was danach
herauskommt, ist ein Maß im lokalen System – genau das, was
to() erwartet. Woher fx und fy
kommen, steht im Kapitel Raum.
Lage und Katalog
Aus den Genen fallen drei benannte Stufen: augenAbstand
(eng · normal · weit), gesichtsLage (tief · mitte · hoch)
und gesichtsGroesse (klein · normal · groß). Sie sind
Zeichenketten und keine Zahlen, und zwar aus einem einzigen Grund: sie
sind der Anknüpfpunkt für Bedingungen im Katalog.
Der Katalog hält die Varianten als Daten – Gewichte, dazu Bedingungen.
Zwei davon hängen an der Lage: nurBei ist hart, die
Variante fällt raus; lieber ist weich, ihr Gewicht
verdreifacht sich. Die dritte hängt an einem schon gezogenen Merkmal
statt an der Lage: nichtMit.
| Regel | Beispiel | Warum |
|---|---|---|
nurBei |
weit, ring, offen nur bei normalem oder weitem Augenabstand |
Große Augenformen brauchen Platz zwischen den Ankern, sonst überlappen sie in der Nasenwurzel |
lieber |
punkt und strich lieber bei engem Abstand |
Kleine Formen dicht beieinander sind die stärkste Karikatur |
nurBei |
grinsen, zaehne, offen nur bei normalem oder großem Gesicht |
Ein Zahngitter in einem gedrängten Mund ist ein schwarzer Klecks |
nichtMit |
kappe, stirnband, kopfhoerer nicht über einer Haarmasse |
Sie liegen auf der Haut; über einer Schale drücken sie einen Wulst am Ansatz heraus |
nichtMit |
augenringe nicht neben rosigen Backen |
Zwei Aussagen an derselben Stelle lesen sich als Ausschlag |
nichtMit |
wangenbogen nur bei Augen mit Augapfel (WANGENBOGEN_AUGEN) |
Ein Strich oder ein Kreuz hat keinen unteren Rand, den eine Wange verdecken könnte |
nichtMit schaut auf das, was in macheDna
vorher schon gezogen wurde – die Kopfbedeckung kommt nach der Frisur,
das Zeichen nach Auge und Backen. Damit ist die Ziehreihenfolge Vertrag in
zweifacher Hinsicht: sie hält die Ströme stabil, und sie stellt
sicher, dass eine Bedingung nur nach hinten schaut.
Der Umweg wäre kürzer gewesen: irgendetwas ziehen und die
unverträgliche Kombination hinterher auf keine setzen.
Genau so stand es hier, und es war eine stille Lüge – das Gewicht der
gestrichenen Variante fiel unter den Tisch, statt sich auf die
erlaubten zu verteilen. Hüte über Frisuren waren dadurch ein Viertel
seltener, als der Katalog sagte.
Die letzte Zeile ist die wichtigste: fällt durch nurBei
alles heraus, gewinnt die ungefilterte Liste. Eine
Kategorie darf nie leer sein – ein Kopf ohne Augen ist kein Kopf,
sondern ein Absturz.