Die Grundidee: Sticker-Sheets
Das Grundkonzept ist überraschend einfach: Ich behandle die Gesichtselemente wie Sticker, die ich auf dem Gesicht des Charakters platziere.
Statt einer einzigen riesigen Textur teile ich das Gesicht auf mehrere Texturen und UV-Kanäle auf. Ich stelle mir jede dieser Texturen gern als Sticker-Sheet vor, auf dem jeder Ausdruck oder jedes Gesichtselement seinen eigenen kleinen Platz hat.
Bone-Treiber „wählen“ dann den Sticker aus, der angezeigt werden soll, indem sie die UV-Koordinaten verändern.
Dieser Ansatz wurde vom klassischen Look von Games wie Wind Waker inspiriert. Er eignet sich besonders gut für stilisierte, von älteren Games oder Toon-Stilen inspirierte Charaktere und ist zugleich flexibel genug für moderne Animations-Workflows.
Ein weiterer Grund für dieses System war, dass ich nahezu dasselbe Setup sowohl in Blender als auch in Unreal Engine nachbauen konnte. Dadurch lässt sich der gesamte Workflow viel einfacher pflegen.
Ich betrachte jedes Gesichtselement als wiederverwendbares Asset und nicht als einzigartigen Ausdruck. Sobald Augenbrauen, Augen, Pupillen und Münder getrennt sind, lassen sie sich kombinieren, sodass viel mehr Ausdrücke entstehen können, als ursprünglich gezeichnet wurden.
Warum diese Methode?
Neben dem visuellen Stil bietet sie einige praktische Vorteile.
Da alle Gesichtstexturen im Voraus geladen werden, wird der Texturspeicher bei diesem System direkt zu Beginn belegt. Für kleinere Textur-Sheets, wie sie bei dieser Ästhetik älterer Games üblich sind, funktioniert das sehr gut.
Außerdem muss die Engine während der Gesichtsanimation keine neuen Texturen streamen. Das hilft dabei, Ladehänger oder sichtbares Nachladen von Texturen zu vermeiden.
Das Ergebnis ist ein einfaches System, das ressourcenschonend, vorhersehbar und leicht zu animieren ist.
Das Gesicht aufteilen
Das Gesicht ist in vier voneinander unabhängige Bereiche unterteilt:
- 01Augenbrauen
- 02Augen
- 03Pupillen
- 04Mund
Jeder Bereich hat sein eigenes Textur-Sheet. Diese werden hauptsächlich über ihre Alphakanäle miteinander vermischt. Da alles getrennt bleibt, können verschiedene Ausdrücke einfach kombiniert werden, ohne für jede mögliche Gesichtspose eine eigene Textur zu benötigen.
Die „Sticker-Sheets“ erstellen
Alle Gesichtstexturen sind von Hand gezeichnet.
In meinem Fall habe ich Affinity Photo verwendet, aber jeder Bildeditor funktioniert genauso gut. Nimm einfach Photoshop, Krita, Clip Studio Paint oder das Programm, mit dem du dich am wohlsten fühlst.
Als besonders wichtig hat sich für mich die Organisation der Arbeitsdateien erwiesen. Wenn jedes Gesichtselement in eindeutig benannten Ordnern liegt und einheitliche Namenskonventionen verwendet werden, behält man viel leichter den Überblick, während das Projekt wächst.
Bevor du etwas zeichnest, empfehle ich außerdem, eine Liste mit allen Ausdrücken anzulegen, die du voraussichtlich brauchen wirst.
Dann ... füge ein paar leere Plätze hinzu.
Du weißt nie, wann du mitten in der Entwicklung plötzlich noch eine wütende Augenbraue oder ein etwas unbeholfeneres Lächeln brauchst. (≧∇≦)ノ
Leere Plätze sind günstig. Dein Rig neu aufzubauen, weil der Platz auf der Textur nicht ausreicht, ist es nicht.
Die Augen (⊙o⊙)
Die Augen sind wahrscheinlich mein Lieblingsteil des Rigs.
Im Kopf des Charakters ist ein Paar Bones verborgen, das die Pupillen über ihre UV-Offsets steuert. Echte Bones statt eigener Steuerelemente zu verwenden hat einen schönen Bonus: Die gesamte Funktionalität von Blenders Inverser Kinematik (IK) funktioniert sofort, und dieselben Steuerungen lassen sich gut auf Unreal Engine übertragen.
Die Pupillen-Bones verwenden einfach Blenders „Track To“-Constraint, um auf Ziel-Bones zu schauen. Dasselbe Konzept lässt sich später in Unreal Engine mit „Look At“-Nodes in einem Animation Blueprint nachbauen, sodass der Charakter Objekten in der Welt auf natürliche Weise folgen kann.
Die Bone-Bewegung in eine UV-Bewegung umzuwandeln ist eigentlich nur ein bisschen Trigonometrie.
... oder du schätzt es einfach nach Augenmaß. 🥁
Ich habe damit experimentiert, die Pupillenrotation einzuschränken, damit sie nicht über das Ziel hinausschießt. Am Ende fühlte es sich aber besser an, die Pupillen einfach sorgfältig zu animieren, statt weitere Constraints hinzuzufügen.
Das Sticker-Raster abbilden
Jede Position auf dem Steuerungsraster entspricht direkt einer Position auf dem Textur-Sheet.
Für das Setup habe ich die lokalen Offsets jeder Position gemessen und die Bone-Treiber mit den UV-Offsets verbunden.
Nur die Bones, die sich über dieses Raster bewegen, steuern die Ausdrücke. Ihre Bewegung ist begrenzt, damit sie nicht versehentlich zu weit aus den verfügbaren Ausdrucksplätzen driften. So lassen sie sich deutlich leichter animieren.
Treiber-Ausdrücke
Falls du noch nie mit Blender-Treibern gearbeitet hast: Sie sind überraschend unkompliziert.
Du kannst auf fast jeden Wert rechtsklicken (zum Beispiel den Wert eines Value-Nodes) und „Add Driver“ auswählen. Treiber können außerdem einfache Python-Ausdrücke verwenden.
Einer meiner Ausdrücke sieht so aus:
min(3, max(0, var * 33 + 0.5))
Der resultierende Wert wird einfach multipliziert und begrenzt, sodass er einer Position im Ausdrucksraster entspricht und innerhalb des verfügbaren Bereichs bleibt.
Der Rest der Arbeit geschieht dann in Blenders Material-Graph, wo die UV-Offsets in die richtigen Texturkoordinaten umgewandelt werden.
Einschränkungen
Wie jede Technik bringt auch diese ein paar Kompromisse mit sich.
Die größte Einschränkung ist die Texturgröße. Da alle Gesichtstexturen im Voraus geladen werden, funktioniert dieser Ansatz am besten mit relativ kleinen Textur-Sheets. Das ist für stilisierte oder von Retro-Games inspirierte Projekte meist ideal, wird mit steigender Texturauflösung aber weniger attraktiv.
Wie bereits kurz erwähnt, muss außerdem die Planung der Textur-Sheets berücksichtigt werden.
Wenn dir irgendwann die Plätze für Ausdrücke ausgehen, reicht es nicht, das Bild einfach zu vergrößern. Wahrscheinlich musst du Folgendes aktualisieren:
- das Blender-Rig
- das Material-Setup
- das Animation Blueprint in Unreal Engine
- die Textur-Sheets selbst
Wenn du von Anfang an ein paar zusätzliche Plätze freilässt, kannst du dir später überraschend viel Arbeit sparen.
Zukünftige Verbesserungen
Wie die meisten Tools entwickelt sich auch dieses Rig noch weiter.
Mit diesen Dingen möchte ich in Zukunft experimentieren:
- automatisches Blinzeln und Augenverhalten
- Teile des Setups vereinfachen, damit es leichter für mehrere Charaktere wiederverwendet werden kann
Bestimmt gibt es noch viele weitere Verbesserungsmöglichkeiten, an die ich bisher nicht gedacht habe - und genau das macht die Hälfte des Spaßes aus.
Abschließende Gedanken
Das ist im Grunde schon die ganze Idee!
Sobald alles eingerichtet ist, ist das System recht unkompliziert. Gleichzeitig gibt es mir viel Flexibilität beim Posieren von Gesichtsausdrücken und sorgt dafür, dass sich das Rig intuitiv animieren lässt.
Vor allem trifft es den stilisierten Look, den ich erreichen wollte, und fügt sich gut in meinen Workflow mit Blender und Unreal Engine ein.
Falls dich das dazu inspiriert, etwas Ähnliches zu bauen oder das System sogar zu verbessern, würde ich deine Ergebnisse sehr gern sehen!
Viel Spaß beim Riggen! ♪(^∇^*)