Die Maus will immer noch nicht blinzeln
Von Oleg Sidorkin, CTO und Mitgründer von Cinevva
Wir haben viel Arbeit in die Werkzeuge gesteckt, die eure Modelle in Cinevva zum Leben erwecken: in ihr Rigging, das Übertragen von Animationen und das Beheben all der unschönen Details, die erst sichtbar werden, sobald sie sich bewegen. Dabei haben wir uns mit Beinen beschäftigt, die sich nicht beugen lassen, mit Animationstransfer und mit Schwänzen, denen die nötigen Knochen zur Steuerung fehlen.
Jetzt möchte ich diesen Charakteren Emotionen geben. Ein Charakter sollte überrascht, genervt oder zufrieden aussehen können und nicht nur durch eine Szene laufen. Dafür muss sich das Gesicht bewegen: Augenlider, Brauen, Wangen und ein Mund, der mehr kann, als in seiner Ruhepose zu verharren.
Wir haben begonnen, uns aktuelle Forschungsarbeiten zum Gesichts-Rigging anzusehen, um herauszufinden, wie weit wir von einem vorhandenen Mesh zu brauchbarer Mimik kommen können. Dies ist der erste Bericht über diese Arbeit: was wir tatsächlich ausführen konnten, wie wir den Charakter vorbereitet haben und was bei unserem Versuch passiert ist.
Unser Testobjekt war die Maus aus der Arbeit am Schwanz. Sie hatte bereits ein Körper-Rig und sechs Animationsclips. Sie konnte gehen, springen und sprinten, doch ihr Gesicht blieb dabei immer starr.
Wir probierten NFR aus, eine Forschungsimplementierung, die Gesichtsausdrücke auf ein bereitgestelltes Gesichts-Mesh überträgt. Die erste Ausgabe war eine Übersicht mit Posen namens „Kiefer öffnen“, „Lächeln“, „Blinzeln“, „Lippen spitzen“ und „Brauen anheben“. Ich konnte darin kaum eine brauchbare Animation erkennen. Der Kiefer hatte die Schnauze verzogen; die meisten anderen Bilder sahen nahezu gleich aus.
Bevor wir das Ergebnis beurteilten, mussten wir jedoch ein Problem bei der Vorbereitung beheben. Beim Erstellen des Eingabe-Meshes hatten wir einen großen Teil der Augenränder der Maus weggeschnitten. Also überarbeiteten wir den Ausschnitt, führten den Vorgang erneut aus und renderten beide Versuche in Bewegung. Hier sind sie.
Was in NFR eingespeist wurde
Der vollständige Charakter hat 22.744 exportierte Vertices und 30 Gelenke, aber keine Blendshapes für das Gesicht und keine eigenen Kiefer- oder Augenknochen. Wir mussten die Gesichtssteuerung hinzufügen, ohne das bestehende Rig zu beeinträchtigen.
Die Anforderungen von NFR an die Eingabedaten erklären, warum wir nicht einfach die GLB-Datei übergeben konnten. NFR erwartet eine Gesichtsoberfläche mit ausgeschnittenen Augen- und Mundöffnungen, ohne innere Strukturen und Augäpfel, und ein Mesh, das ungefähr an den Beispielen ausgerichtet ist. Wir entfernten den Hinterkopf, die Ohren und den Hals, legten die Öffnungen an und behielten das größte zusammenhängende Teilstück. Übrig blieben 777 Vertices und 1.296 Dreiecke.
Jeder Vertex in diesem Ausschnitt entsprach weiterhin einer Position auf dem ursprünglichen Charakter. Nach der Inferenz subtrahierten wir das vorhergesagte neutrale Gesicht von jedem vorhergesagten Gesichtsausdruck, rechneten die Offsets zurück auf die Skalierung der Maus und wendeten sie auf die entsprechenden ursprünglichen Vertices an. Die Bewegung wurde zum Rand des Ausschnitts hin ausgeblendet, damit sie nicht abrupt dort endete, wo das Gesicht in den restlichen Kopf überging.
So erhielten wir neun Blendshapes: gespeicherte Vertex-Offsets, die über einen Regler in das neutrale Mesh eingeblendet werden können. Wenn alle Regler auf null standen, wurde die ursprüngliche Maus wiederhergestellt. Wir behielten ihr Skelett, ihre Texturen und die sechs Körperclips bei und fügten dann für jeden Gesichtsausdruck einen eigenen Testclip hinzu.
Die Inferenz selbst dauerte auf einer T4 etwa sieben Sekunden, sobald Checkpoint und Eingabedaten geladen waren. Einen brauchbaren Gesichtsausdruck zu erhalten, würde länger dauern.
Wir hatten genau die Teile weggeschnitten, die wir brauchten
Unsere ersten Ausschnitte für die Augen waren breite Ellipsen. Bei diesem Gesicht entfernten sie einen großen Teil des Rands um jedes Auge. Der Ausschnitt für den Mund lag unterhalb der sichtbaren Lippenlinie. Keiner der beiden Fehler war anhand der Kennzahlen des Meshes offensichtlich: Es hatte endliche Koordinaten, keine degenerierten Dreiecke und keine Nicht-Mannigfaltigkeitskanten.
Betrachtet man jedoch den Ausschnitt, wird das Problem recht deutlich. Wir erwarteten eine Bewegung der Augenlider, nachdem wir einen großen Teil der Oberfläche entfernt hatten, die diese Bewegung ermöglichen könnte.
Für den zweiten Durchlauf renderten wir den Kopf von vorn und aus zwei schrägen Perspektiven. Ich nutzte die Bilderkennung des Assistenten, um die Augenöffnungen, Augenränder, Lippenlinie, Schnauze, Nase, Brauen und Schnurrhaare zu markieren. Diese Umrisse wurden auf die sichtbaren Dreiecke des ursprünglichen Meshes projiziert. Indem wir die Projektions- und Dreiecks-IDs beibehielten, konnten wir prüfen, welche tatsächlichen Teile des Gesichts die jeweiligen Ausschnitte überstanden hatten.

Wir markierten 131 sichtbare Dreiecke als Bestandteile der beiden Augenränder. Der erste Ausschnitt hatte davon nur 25 beibehalten. Beim neuen waren es 123. Das ist eine nützliche Verbesserung der Eingabedaten, auch wenn damit die Erhaltung anhand unserer eigenen Markierungen gemessen wird und nicht die Genauigkeit einer unabhängigen Segmentierung.
Wir änderten außerdem die Ausrichtung. Statt sie an die bisherige Referenzausdehnung anzupassen, verwendeten wir korrespondierende Gesichtsmerkmale, um eine einheitliche Skalierung und Position festzulegen. Der neue Ausschnitt hatte 586 Vertices und 952 Dreiecke. Er enthielt weiterhin Lücken und offene Ränder; bei diesem Durchlauf wurde vorhandene Geometrie ausgewählt, statt neue Augenlider oder einen Mundinnenraum zu erstellen.
Mehr Bewegung, mehr Verzerrung
Beim zweiten Durchlauf verwendeten wir dieselben Gewichtungen und dieselben neun Regler für Gesichtsausdrücke. Dieses Mal wollte ich die gesamte Bewegung sehen. Deshalb renderten wir Zwischenstufen zwischen der neutralen Pose und dem jeweils vollständig ausgeprägten Gesichtsausdruck und kehrten anschließend zur neutralen Pose zurück. Das Video oben zeigt beide Versionen bei identischer Beleuchtung.
Die Augen bleiben weiterhin offen. Der Kieferregler verändert die Schnauze, ohne eine überzeugende Mundöffnung zu erzeugen. Einige Mundregler bewirken mehr als zuvor, insbesondere die Trichterform, aber dabei verzieht sich die Oberfläche.
Um diese Verzerrung zu quantifizieren, untersuchten wir die Kantenlängen. Für jede Kante im Charakter-Mesh teilten wir ihre Länge beim vollständig ausgeprägten Gesichtsausdruck durch ihre Länge in der neutralen Pose und zählten die Kanten, deren Länge sich mehr als verdoppelte.
| Regler | Erster Ausschnitt: Kanten über 2× | Überarbeiteter Ausschnitt: Kanten über 2× | Stärkste Dehnung im überarbeiteten Ausschnitt |
|---|---|---|---|
| Kiefer öffnen | 13 | 44 | 5,27× |
| Links lächeln | 0 | 30 | 5,53× |
| Mundtrichter | 0 | 89 | 11,29× |
Bei einer kurzen Kante kann das Verhältnis sehr groß ausfallen, weshalb ich einen Gesichts-Rig nicht allein anhand dieses Werts bewerten würde. In diesem Fall stimmt er jedoch mit dem überein, was die Renderings zeigen. Der überarbeitete Mund bewegt sich stärker, doch ein Teil dieser Bewegung besteht aus unerwünschter Dehnung.
Wir haben drei Dinge gleichzeitig geändert: den Ausschnitt, die Ausrichtung und das Ausblenden am äußeren Rand. Dieser Vergleich kann uns nicht sagen, welche Änderung für welches Artefakt verantwortlich war. Er zeigt jedoch, dass die überarbeitete Vorbereitung als Ganzes die Probleme mit dem Gesicht dieses Charakters nicht gelöst hat.
Warum wir NFR verwendet haben
Bevor wir dieses Experiment durchführten, sahen wir uns andere Implementierungen an. GNM Head von Google ließ sich laden und erzeugte Gesichtsausdrücke auf seinem eigenen menschlichen Kopf-Mesh. Um diese Gesichtsausdrücke auf unsere Maus zu übertragen, wäre ein eigener Anpassungs- und Übertragungsschritt erforderlich gewesen. Example-Based Facial Rigging benötigte korrespondierende Ausdrucksbeispiele, über die unser Charakter nicht verfügte.
RigAnyFace und OmniFaceRig waren ebenfalls relevant. Mit Stand vom 11. September 2026 hatten wir jedoch für keines der beiden Projekte öffentlich verfügbaren Inferenzcode samt Gewichtungen gefunden, den wir ausführen konnten. Beim Datensatz-Link von OmniFaceRig stand weiterhin „Coming Soon“. NFR bot einen veröffentlichten Checkpoint und einen Weg für eigene Meshes, weshalb wir damit bis zu einer animierten Maus weiterarbeiteten.
Es handelte sich nicht um fünf vergleichbare Durchläufe. Wir testeten NFR auf unserer Gesichtsoberfläche, prüften GNM auf dessen eigenem Kopf und mussten bei den anderen Projekten wegen ihrer Eingabeanforderungen oder mangelnden Verfügbarkeit aufhören.
Für den nächsten Versuch brauchen wir ein Augenlid
Der Ausschnitt war schlecht, und es hat sich gelohnt, ihn zu korrigieren. Doch selbst ein erhaltener Augenrand verfügt nicht über genügend Geometrie oder die richtige Bewegung, um das Auge abzudecken. Beim Mund besteht ein ähnliches Problem: Wir können an der Schnauze ziehen, aber in diesem Experiment wurden weder die Öffnung noch der Innenraum aufgebaut, die für diese Pose nötig sind.
Als Nächstes würde ich mich auf ein einzelnes Blinzeln und eine einzelne Kieferöffnung konzentrieren. Das Augenlid braucht eine Form, mit der es sich über dem Auge schließen kann, und Lippen sowie Mundinnenraum müssen vorbereitet werden. Anschließend können wir die Korrekturformen für diese beiden Bewegungen anpassen oder von Hand erstellen. Bevor weitere Regler hinzukommen, sollten wir sie sowohl von der Seite als auch von vorn überprüfen.
Wir haben beide Versuche einschließlich der unverarbeiteten Vorhersagen und der exakten Ausschnitte aufbewahrt, damit wir die nächsten Ergebnisse mit diesem Resultat vergleichen können. Vorerst sind der Körper-Rig und seine Animationen weiterhin intakt. Die Gesichtsformen bleiben ein Experiment; ich würde sie nicht in einem fertigen Charakter verwenden.