Drehen, projizieren, ankern
Der Schädel steht. Jetzt dreht er sich, und jedes Merkmal muss mitgehen – samt Verkürzung und Verdeckung. Der ganze Trick dabei ist, dass keine Merkmalsfunktion davon etwas weiß.
Zwischen der Kopfform und dem gezeichneten
Strich liegen drei Schritte: drehen, projizieren, ankern. Die ersten
beiden sind vier Zeilen Rechnung. Der dritte ist der
Feld – und er ist der Grund, warum in
gesicht.ts kein einziger Sinus einer Kopfdrehung steht.
Drehen und projizieren
Gedreht wird in fester Reihenfolge: erst yaw um die Y-Achse, dann pitch um X, dann roll um Z. Das ist keine Geschmacksfrage – dieselben drei Winkel in anderer Reihenfolge sind eine andere Drehung.
Es gibt sie in zwei Formen, weil sie in zwei Größenordnungen gebraucht
wird. Die Punktwolke dreht je Bild Zehntausende Punkte: dort steht die
drehMatrix einmal und wird auf jeden Punkt angewandt.
Ein Anker, eine Nasenspitze, ein Zopfende sind einzelne Punkte: dort
ist drehUm(p, pose) bequemer.
Beides ist dieselbe Rechnung: drehUm
baut die Matrix und wendet sie an. Hier standen einmal zwei
Rechenwege nebeneinander – die Matrix ausmultipliziert, drehUm als
Kette von drei Drehungen –, die dieselbe Reihenfolge einhalten
mussten, ohne dass irgendetwas sie dazu zwang. Wären sie
auseinandergelaufen, säße die Kontur eines gedrehten Kopfes (aus der
Wolke) neben seinem Gesicht (aus den Ankern) – und niemand hätte
gewusst, welche der beiden die falsche ist.
Danach die Projektion. Sie ist eine schwache Perspektive:
ein Skalar s = F/(F−z) mit der Brennweite
F = BRENNWEITE = 4.2. Nahes wird größer, Fernes kleiner,
und die Verkürzung eines gedrehten Gesichts entsteht daraus von selbst –
niemand rechnet sie aus.
Zwei Dinge stecken in diesen drei Zeilen. Erstens die
Homothetie: weil F mit der Größe skaliert
und alle Radien auch, kürzt sich die Größe aus s heraus –
darauf baut der Cache auf der nächsten Seite.
Zweitens das Vorzeichen von y: die Projektion dreht es um,
weil die Bildachse nach unten zeigt. Wer das übersieht, zeichnet
Schmollmünder (siehe unten).
Das Feld
Ein Feld ist ein Anker auf der Kopfoberfläche, aufgelöst
für genau eine Ansicht. macheFeld(u, v, sicht) tastet die
Fläche an drei dicht beieinander liegenden Stellen ab und liest daraus
alles ab, was ein Merkmal an diesem Ort braucht:
| Feld | Bedeutung |
|---|---|
x y z | die Bildposition des Ankers |
ex ey | die lokalen Achsen im Bild, Einheitsvektoren |
fx fy | die Stauchung quer und längs, gemessen gegen refU/refV |
nrm | die Normale als Bildschirmrichtung |
nz | ihre z-Komponente: positiv heißt zugewandt |
to(lx, ly, lift) | lokale Koordinate → Bildpunkt |
refU und refV kommen aus
macheSicht: die Längen derselben Schrittweite auf der
ungedrehten Fläche an der Nasenwurzel. Dadurch heißt
fx = 1 nicht „ein Einheitsmaß", sondern „so breit wie
frontal an der Nasenwurzel" – ein Maßstab, den jeder Anker teilt.
platz() im Kapitel Zonen rechnet
genau mit diesen beiden Faktoren zurück.
Merkmalsfunktionen zeichnen ausschließlich in −1…1 und
wissen nichts von der Drehung. Ein Auge ist ein Kreis bei
(0, 0) mit Radius 0.7. Dass es bei
gedrehtem Kopf schmal, gekippt und verdeckt ist, erledigt das Feld.
Der dritte Parameter von to ist der lift: er
hebt einen Punkt entlang der Normale von der Haut ab. So steht ein Ohr
neben dem Kopf statt darauf, und so sitzt ein Kopfhörer über der
Schläfe.
Am freien Anker sieht man das Wesentliche: schiebt man ihn nach außen,
wird der quere Arm des Achsenkreuzes kürzer und kürzer, bis er
verschwindet – fx geht gegen null. Nicht weil das Merkmal
kleiner wird, sondern weil die Fläche, auf der es liegt, sich wegdreht.
Ein Ohr wird nicht neben den Kopf, sondern in die Wange gezeichnet, und die abgewandte Seite besteht plötzlich jede Sichtbarkeitsprüfung.
Ursache: die Normale wurde zum Betrachter hin geflippt, damit sie
„immer nach vorn" zeigt. Dann ist nz nie negativ, der
Test nz < 0 greift nie, und der lift
trägt Merkmale auf der Rückseite mit gespiegelter Richtung nach
innen.
Lösung: die Normale zeigt auswärts vom Kopfzentrum.
macheFeld prüft das mit einem Skalarprodukt gegen den
Ortsvektor und dreht nur um, wenn das Kreuzprodukt nach innen zeigte.
nz < 0 heißt danach ehrlich: von der Kamera abgewandt.
Jedes Lächeln ist ein Schmollmund. Und zwar so überzeugend, dass man lange in der Kurve nach dem Fehler sucht statt im Vorzeichen.
Ursache: die y-Achse eines Ankers zeigt nach oben –
sie folgt dem Breitengrad zum Scheitel. Die y-Achse des Canvas zeigt
nach unten. Wer eine Mundkurve in Canvas-Richtung hinschreibt und
unverändert durch to schickt, bekommt sie gespiegelt
zurück.
Lösung: jede Formfunktion in gesicht.ts rechnet in
Canvas-Richtung und dreht das Vorzeichen in ihrem eigenen
to um – f.to(lx * r, -ly * r). Nicht im
Feld: dort wäre es für Normale und Achsen falsch.
Wenn der Anker über die Kante kippt
Bei starker Drehung wandert ein weit außen sitzendes Auge über die Silhouette. Geometrisch ist das richtig: die Fläche dort ist abgewandt, also gehört das Auge nicht ins Bild. Gezeichnet ist es ein Fehler – ein Gesicht mit nur einem Auge liest sich nicht als Perspektive, sondern als Panne.
sichtbarerAnker zieht den Längengrad in Schritten von 10 %
zur Mitte, bis das Feld wieder zur Kamera zeigt. Das Auge sitzt danach
schmal am Rand – und genau so gehört es sich. Beachte die Schwelle:
min = 0.42, nicht 0. Ein Anker, der gerade eben noch
zugewandt ist, hat ein fx nahe null, und ein Auge von null
Breite ist auch keine Lösung.
Die andere Richtung derselben Frage stellt sichtGrenzen:
wo trifft eine Rundlinie – ein Haaransatz, eine Hutkrempe – die
Silhouette? Gesucht wird von der am stärksten zugewandten Stelle aus
nach beiden Seiten, und die Kante selbst per Bisektion. Analytisch ginge
das nur für ein glattes Ellipsoid; kegel,
scheitelHoch, beule und kastig machen aus
dem Ellipsoid etwas, für das es keine geschlossene Lösung mehr gibt.
Wie viel Drehung ein Stil erträgt
Die DNA speichert den vollen Drehwunsch, der Stil begrenzt ihn.
begrenzePose tut das deterministisch, ohne Zufall – zwei
Aufrufe mit derselben Pose ergeben dieselbe Pose.
Interessant ist, was der Kopfkommentar der Datei über den
Kritzelstil der ersten Presse festhält. Der arbeitete
mit einem Fenster statt einer Obergrenze: yawMin
schloss die volle Front aus. Der Grund war nicht Geschmack, sondern
Geometrie – beides sind entartete Sonderfälle. Frontal zeigt die
Normale überall zur Kamera, der Kopf hat kein Volumen mehr. Im Profil
kollabiert die lokale x-Achse, fx geht gegen null, und nur
der lift trägt noch. Wer beides ausschließt, muss beides
auch nicht abfangen.
Der klare Stil dieser Ausgabe braucht das Fenster nicht: seine Köpfe
schauen zum Zeiger, und ein Kopf, der jemanden ansieht, steht nun einmal
fast frontal. Seine Grenzen sind
{ yaw: 0.4, pitch: 0.26, roll: 0.14 } – rund 23 Grad zur
Seite, kein yawMin.
Die Pose-Grenzen sind der einzige Ort, an dem ein Stil der Geometrie widerspricht. Alles andere – Verkürzung, Verdeckung, Reihenfolge – ergibt sich. Die Grenzen sagen nur, welchen Teil des Möglichen dieser Stil zeichnen kann, ohne dass es auffällt.
Die Brille als Gegenbeispiel
Fast alles im Gesicht ist ein Feld-Merkmal. Die Brille nicht – und das ist die einzige Stelle, an der der Stil den Anker bewusst verweigert.
Ein Glas, das über f.to gezeichnet wird, schmiegt sich der
Wölbung an und verkürzt wie Haut. Es sieht dann aus wie aufgemalt,
denn ein Brillenglas ist eine starre Scheibe: es liegt nicht auf dem
Gesicht, es steht davor. Deshalb ist die Brille hier eine echte Figur im
Kopfraum – zwei Kreise in der Frontalebene, ein Steg, zwei Bügel zum Ohr
–, gedreht und projiziert wie der Schädel selbst. Ein gedrehter Kopf
verkürzt ein Glas dann nur um den Kosinus der Drehung.
Der Unterschied ist bei kleiner Drehung kaum zu sehen und ab etwa einem halben Radiant nicht mehr zu übersehen: links legt sich das ferne Glas um die Wange und wird zum Strich, rechts bleibt es eine Scheibe, die perspektivisch schmaler wird. Gelernt wurde das in der ersten Presse, und es ist die Art Detail, die niemand benennen kann, die aber jeder sieht.