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:

FeldBedeutung
x y zdie Bildposition des Ankers
ex eydie lokalen Achsen im Bild, Einheitsvektoren
fx fydie Stauchung quer und längs, gemessen gegen refU/refV
nrmdie Normale als Bildschirmrichtung
nzihre 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.

Die eingestülpte Wange

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.

Der Schmollmund

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.