Wenn eine Animation die Welt berühren muss
Von Oleg Sidorkin, CTO und Mitgründer von Cinevva
Eine Laufanimation weiß, wie sich die Beine bewegen. Sie weiß nicht, dass ein Fuß eine Stufe erreicht hat. Eine Greifanimation weiß, wie sich der Arm bewegt. Sie weiß nicht, wo sich dieses konkrete Schlüsselloch befindet oder dass jemand die Tasse verschoben hat.
Das ist das nächste Problem nach dem automatischen Rigging einer Figur: Die Animation muss während des laufenden Spiels auf die Szene reagieren. Wir haben in Cinevvas Three.js-Laufzeitumgebung eine experimentelle Korrekturebene implementiert. Sie liest die von der Animation erzeugte Pose, fragt die Szene ab und passt die Gelenke der Figur an, bevor das Bild gerendert wird.
Die folgenden Beispiele führen diesen Code in Ihrem Browser aus. In der Einzelbildschleife wird keine Anfrage zur Bewegungsgenerierung gestellt.
Probieren Sie den Unterschied aus
Die Demo startet automatisch. Wählen Sie ein Beispiel aus und schalten Sie Korrekturen aus und wieder ein. Die linke Figur zeigt die Basispause; die rechte erhält die Live-Korrektur. Pausieren Sie die Wiedergabe und ziehen Sie den Zeitschieberegler, um einen bestimmten Moment zu untersuchen. Ziehen Sie in einem der Ansichtsfenster, um die Kamera um die Figur kreisen zu lassen, scrollen Sie oder führen Sie eine Aufziehgeste aus, um zu zoomen, und ziehen Sie mit der rechten Maustaste, um die Ansicht zu verschieben. Beide Kameras bleiben synchronisiert, sodass Sie denselben Kontakt aus exakt demselben Winkel untersuchen können.
Jedes Beispiel verwendet denselben automatisch von Cinevva geriggten Frosch. Im Laufbeispiel wird Walk aus der Universal Animation Library abgespielt und mit demselben Code retargetiert, den auch Auto Rigger verwendet. In beiden Ansichtsfenstern läuft der tatsächliche Clip; rechts kommen Laufzeitkorrekturen für das Gelände hinzu. Die anderen Beispiele behalten die eingebettete Idle-Referenz und ihre Interaktions-Controller bei.
Der Lauf-Controller plant einen Schritt voraus. Er prognostiziert, wo sich die bewegliche Trittfläche beim Aufsetzen befinden wird, zentriert die gesamte Fußsohle des Frosches in ihrem Landebereich und führt den nächsten Schwung über die zukünftigen Stufenhöhen. Dabei bleiben Takt und Schwungform des Bibliotheksclips erhalten, während die Schrittlänge angepasst wird. Das Becken beginnt bereits vor dem Aufsetzen mit der Gewichtsverlagerung und Höhenänderung; anschließend positioniert die IK die Gliedmaßen auf den geplanten Zielen und verfeinert den sichtbaren Sohlenkontakt.
Aktivieren Sie Schrittplan, um die Umrisse der Sohlen an ihren prognostizierten Aufsetzpositionen und gestrichelte Schwungbahnen zu sehen. Beckenspur vergleicht die Körperbewegung, und Beckenspur speichern bewahrt die Messwerte auf. Dieser Planer verarbeitet derzeit die bekannten, sich verschiebenden Trittflächen der Demo. Er meldet nicht realisierbare Landungen; die Navigation auf beliebigem Gelände und physikalische Gleichgewichtskräfte fallen in separate Verantwortungsbereiche der Engine.
Eine Leiter hinaufklettern bewegt jeweils eine Gliedmaße weiter, während drei Kontaktpunkte ihre Sprossen festhalten. Die Leiter bewegt sich nach unten, damit der Kletterer im Bild bleibt. Explizite Ziele für Fußgelenke und Hände positionieren die Kontakte, während Führungen für Ellbogen und Knie dafür sorgen, dass die Gelenke nicht mit der Leiter kollidieren. Die Körperbewegung und Kontaktabfolge sind vorgegeben; dies ist kein automatischer Kletterplaner.
Was implementiert ist
| Funktion | Was die Laufzeitumgebung derzeit tut |
|---|---|
| Unebener Boden | Fragt für jeden Fuß einen Stützpunkt ab, richtet die kalibrierte Sohlennormale daran aus und passt die Beckenhöhe an. |
| Aufgesetzte Füße | Hält einen Standkontakt relativ zu der ihn tragenden Oberfläche fest. |
| Bewegliche Plattformen | Bewegt diesen Kontakt mit einer sich verschiebenden oder drehenden Stützfläche mit. |
| Handziele | Richtet einen Arm mit einer Überblendungsgewichtung auf eine Position und Ausrichtung im Weltkoordinatenraum aus. |
| Gehaltene Objekte | Leitet das Handgelenkziel aus der gewünschten Objektpose und einer festen Grifftransformation ab. |
| Unerreichbares Ziel | Begrenzt die Lösung und meldet, dass die Figur neu positioniert werden muss. |
Dies ist ein optionaler Laufzeitprototyp. Die interaktiven Beispiele demonstrieren die Implementierung; sie bedeuten nicht, dass sie in jedem mit Cinevva generierten Spiel automatisch aktiviert ist.
Ein aufgesetzter Fuß braucht ein Bezugssystem
Unser bestehender Retargeter korrigiert bereits einen Teil des Fußrutschens, wenn ein Clip zwischen Figuren mit unterschiedlichen Proportionen übertragen wird. Die Laufzeitanpassung an den Boden hat eine weitere Eingabe: die Oberfläche, auf der die Figur gerade steht.
Wenn ein Fuß in die Standphase eintritt, speichert die neue Ebene seinen Kontaktpunkt in den lokalen Koordinaten des tragenden Objekts. Auf einem statischen Boden bleibt der Fuß an Ort und Stelle, während sich der Körper bewegt. Auf einer beweglichen Plattform bewegt sich derselbe gespeicherte Punkt mit der Plattform. Würde er nur in Weltkoordinaten verankert, bliebe der Fuß zurück.
Das Becken bewegt sich anschließend innerhalb eines begrenzten Höhenbereichs, den beide Beine erreichen können, und jedes Bein wird auf sein Fußziel ausgerichtet. Bei einem frühen Test trat ein subtiler Fehler zutage: Die Glättung der Beckenbewegung über eine Reichweitengrenze hinweg ließ einen Fuß kurzzeitig über einem Hang schweben. Die Glättung bleibt nun innerhalb des realisierbaren Bereichs.
Der Frosch offenbarte einen weiteren Kalibrierungsfehler: Wenn der tiefste Zeh den Boden berührt, bedeutet das nicht, dass die Sohle vollständig aufliegt. Seine Demo passt nun eine Stützebene an jedes Fuß-Mesh in der jeweiligen Pose an und kalibriert sowohl Position als auch Normale. Der gerenderte Regressionstest misst während der gesamten Idle-Animation drei voneinander getrennte Sohlenkontakte sowie den tiefsten Oberflächenpunkt.
Die gemeinsame Prüfung der Körperunterstützung schätzt den Schwerpunkt anhand gewichteter Körpersegmente und berücksichtigt beispielhafte Lasten durch getragene Objekte. In den Stand- und Greifbeispielen wird sie verwendet, um das Becken in Richtung der belasteten Füße zu führen. Beim Laufen steuert der Schrittplaner die vorweggenommene Gewichtsverlagerung; eine statische Korrektur zur Zentrierung innerhalb der Standfläche darf der geplanten Bewegung nicht entgegenwirken. Die Diagnoseanzeigen zeigen weiterhin den geschätzten Schwerpunkt und die Stützkontakte an. Beim Laufen wird Geplante Gewichtsverlagerung gemeldet, und bei der Leiter wird darauf hingewiesen, dass die Griffkräfte weiterhin ungeprüft sind.
Das Laufen benötigt weiterhin ein Timing. Das Spiel liefert für jeden Fuß eine Gewichtung: wie stark er in diesem Moment als aufgesetzt behandelt werden soll. Ein Fuß in der Schwungphase muss freigegeben werden. Das Spiel liefert außerdem die Gangart, die Bewegung der Figur und den nötigen Abstand zur nächsten Stufe. Diese Entscheidungen werden nicht vom IK-Solver abgeleitet.
Erst den Schlüssel ins Schloss stecken, dann die Hand ausrichten
Es reicht nicht, das Handgelenk auf ein Schlüsselloch auszurichten. Der Schlüssel hat eine Länge, eine Einsteckachse und einen Griffversatz. Seine Spitze kann das Loch verfehlen, selbst wenn das Handgelenk sein Ziel perfekt erreicht.
In der Demo definiert die Interaktionssequenz die gewünschte Position und Drehung des Schlüssels. Der Griff gibt vor, wo sich das Handgelenk befinden muss, um den Schlüssel dort zu positionieren. Anschließend wird der Arm auf diese Handgelenkpose ausgerichtet. Der tatsächliche Schlüssel bleibt an der berechneten Hand befestigt, auch wenn die angeforderte Position unerreichbar ist.
Das Beispiel Unerreichbares Ziel demonstriert dieses Scheitern absichtlich. Die Gliedmaße wird nicht gestreckt, nur damit die Messwerte einen Erfolg anzeigen; die Laufzeitumgebung meldet, dass die Figur neu positioniert werden muss.
Dieses Beispiel umfasst vorgegebene Phasen für Annäherung, Einstecken und Drehen. Es plant noch keinen Griff der Finger und prüft die Form des Schlüssels nicht gegen den inneren Freiraum des Schlosses.
Auch das Eingießen ist ein Orientierungsproblem
Im Eingießbeispiel bleibt der Ausguss des Gefäßes über der Tasse, während das Gefäß um ihn herum geneigt wird. Durch die Drehung des Gefäßes verändert sich die erforderliche Position des Handgelenks. Derselbe Handzielmechanismus folgt dieser sich verändernden Pose.
Der blaue Strahl ist ein visueller Effekt, der während des Neigens aktiviert wird. Es handelt sich nicht um eine Flüssigkeitssimulation. Sein Zweck besteht hier darin, die Ausrichtung sichtbar zu machen: Ohne Korrektur verfehlt er die Tasse; mit Korrektur fällt er in den Auffangbereich.
Wo die Korrektur ausgeführt wird
Der Ablauf in einem Spiel lautet:
Figur bewegen → Animation auswerten → Pose-Versätze anwenden → Szenenkontakte lösen → Sekundärbewegung aktualisieren → rendern.
Die Laufzeitumgebung stellt dies über createAnimator mit einer optionalen sceneIK-Konfiguration bereit. Spiele übergeben Kontaktgewichtungen, Handziele und den Bodenkontaktstatus an update. Die Funktion kann auch einen vorhandenen Three.js-Animationsmixer umschließen.
Jedes Rig benötigt eine sinnvolle Kalibrierung der Füße und Griffe. Die Zuordnung von Knochennamen bringt uns zur richtigen Gliedmaße, doch ein Fußgelenk ist nicht die Unterseite eines Schuhs. Diese Version verwendet einen kalibrierten Stützpunkt pro Fuß; sie modelliert noch nicht die gesamte Stützfläche von Ferse und Zehen.
Die zugrunde liegenden Techniken haben etablierte Entsprechungen in Unitys Two-Bone IK und Unreals IK-Solvern. Unsere Implementierung ist eine kleine, engine-seitige Korrekturebene, die auf die Anforderungen unserer automatisch geriggten Figuren zugeschnitten ist.
Was wir geprüft haben – und was noch aussteht
Der erste Verifikationsdurchlauf umfasste 14 numerische und Integrationstests sowie acht gerenderte Szenarien, die über 3.840 Einzelbilder hinweg abgetastet wurden. Wir prüften bewegliche Stützflächen, Kontakte auf Schrägen, konstante Animationstracks, Koordinatentransformationen, Reichweitengrenzen und die Integration des Laufzeit-Animators. Die Browserautomatisierung verglich außerdem die Canvas-Darstellung bei aktivierten und deaktivierten Korrekturen und testete das schmale Layout.
Die Messungen prüfen den Fehler zwischen Gliedmaßen und Zielen. Sie beweisen nicht, dass jeder Teil des verformten Meshs kollisionsfrei ist oder dass das Ergebnis bei jeder Figur natürlich aussieht. Die Beispiele sind bewusst klein genug gehalten, um sie zusammen mit diesen Zahlen untersuchen zu können.
Die nächsten Ebenen sind Schrittplanung, eine bessere Unterstützung der Fußsohlen, Ganzkörperreichweite, Greifen mit den Fingern und kollisionsbewusste Interaktionsphasen. Physikalisch simulierte Flüssigkeiten sind wiederum ein separates System.
Das vorerst nützliche Ergebnis ist konkret: Eine Animation kann ihre zugrunde liegende Bewegung beibehalten, während ihre Füße und Hände in jedem Einzelbild auf die Szene reagieren. Damit erhält eine automatisch geriggte Figur einen Ausgangspunkt für die Interaktion mit der Welt um sie herum.