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:

GenBereichWas es bedeutet
augeU0.30 … 0.80halber Augenabstand im Längengrad
mitte−0.36 … 0.14Mitte des Gesichtsfelds. Tief heißt: große Stirn
spreizung0.62 … 1.10wie weit Augen, Nase und Mund vertikal auseinanderliegen
skala0.78 … 1.30Größ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

KonstanteWertWarum gerade so
AUGENZONE0.34 Anteil am Abstand Augenlinie ↔ Mundlinie. Reicht über die Augenlinie hinaus, dort sitzt auch die Nasenwurzel
MUNDZONE0.5 Nicht kleiner: bei 0.2 wurde aus einem gezeichneten Zahngitter ein schwarzer Klecks
BRUECKE0.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
WANGE1.35 Wie weit die Augenzone nach außen reicht. Das Ohr sitzt bei 1.48
MUNDBREITE0.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 Zone als Maß genommen

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.

Kleine Züge in einem großen Kopf sind ein Baby

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.

Doppelt gestaucht

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.

RegelBeispielWarum
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.