Skip to content

Schwänze animieren, für die der Rigger keinen Knochen vorgesehen hat ​

Von Oleg Sidorkin, CTO und Mitgründer von Cinevva

Aktualisiert am 11. September 2026: Was wir von der Maus gelernt haben ergänzt elastische Biegungen, Bodenkontakt und eine zweite Art von schwanzbedingtem Anheben des Körpers.

Ein Nutzer riggte einen anthropomorphen Fuchs mit unserem Rigger und spielte den Walk-Clip ab. Der Körper sah gut aus. Der Schwanz faltete sich wie ein nasses Handtuch um das linke Bein, und dort, wo die Gewichtungen des linken und rechten Beins aufeinandertrafen, riss das Mesh auseinander. Dieser Fuchs dient im Folgenden als durchgängiges Beispiel, und die Lösung ist inzwischen sowohl im Rigger als auch in der Runtime-Bibliothek aktiv, die seine Clips abspielt.

Sowohl der Fuchs als auch die Maus in diesem Artikel wurden mit unserem 3D-Modellgenerator erzeugt und anschließend in Cinevva geriggt und animiert.

Drei Exemplare eines laufenden Fuchses von hinten: das ursprüngliche Rig mit dem um das linke Bein gefalteten Schwanz, ein starrer, gerade herabhängender Schwanz und ein Schwanz auf einer Knochenkette, der nach oben und hinten getragen wird

Von links nach rechts, mitten im Schritt und im selben Frame: das Rig direkt aus dem Rigger, dasselbe Rig mit dem Schwanz als ein einziges Teil am Becken und der Schwanz auf einer eigenen Knochenkette, den die Runtime schwingen lässt. Alle drei können Sie weiter unten frei umkreisen.

Warum ein humanoider Rigger das tut ​

Unsere Fast-Engine basiert auf Make-It-Animatable, das ein festes Skelett im Mixamo-Stil vorhersagt: 22 Körperknochen oder 65 mit Fingern. Jeder Vertex im Mesh muss einem dieser Knochen zugewiesen werden. Ein Schwanz steht nicht auf der Liste, also tut das Modell das Nächstbeste, das es kennt, und weist die Vertices des Schwanzes dem Körperteil zu, der in seinem erlernten Merkmalsraum am nächsten liegt. Bei diesem Fuchs war das das linke Schienbein, während der Rest auf die beiden Oberschenkel verteilt wurde.

Das ist kein Fehler in den Gewichtungen. Es liegt an der Vorlage. Keine Eingabeaufforderung und keine Einstellung bringt das Modell dazu, einen Schwanzknochen auszugeben, denn es gibt keinen Schwanzknochen, den es ausgeben könnte. Dasselbe passiert mit Flügeln, Umhängen, langen Haaren und allem anderen, was am Rumpf hängt.

Bevor wir irgendetwas änderten, maßen wir, was das bei den 1.582 Schwanz-Vertices des Fuchses bewirkte. Der Abstand jedes Vertex zu den Knochen, die ihn tatsächlich bewegen, gewichtet nach den Gewichtungen, betrug bei einem 191 cm großen Modell durchschnittlich 47 cm. Der Schwanz wurde aus einem halben Meter Entfernung gesteuert.

Den Schwanz finden ​

Das geriggte GLB ist zu diesem Zeitpunkt alles, was wir haben, und mehr brauchen wir auch nicht. Der Verarbeitungsschritt funktioniert mit der Ausgabe jedes Riggers, nicht nur mit unserer.

Ein Abstandsfeld über dem Skelett. Für jeden Vertex p und jedes Knochensegment vom Gelenk a zum Gelenk b im Bind-Raum ist der Abstand zum Segment

d(p,ab)=‖p−(a+t(b−a))‖,t=clamp((p−a)⋅(b−a)∥b−a∥2,0,1)

und der Skelettabstand eines Vertex ist das Minimum über alle Segmente. Endgelenke erhalten hinter dem Gelenk einen kurzen Fortsatz, damit eine Schnauze oder eine Hand nicht als weit vom eigenen Knochen entfernt gilt. Ein Vertex ist weit entfernt, wenn dieser Abstand 7 % der Modellhöhe überschreitet. Beim Fuchs sind das 13 cm.

Zusammenhängende Bereiche weit entfernter Haut. Weit entfernte Vertices werden entlang der Faces des Meshes zu verbundenen Komponenten gruppiert. Ein Detail kostete uns eine Stunde: Exporteure trennen Vertices an UV- und harten Normalennähten. Dieses Mesh hat daher 23.129 Vertices, aber nur 29.081 Dreiecke, und der Face-Graph allein zerlegt einen einzigen Schwanz in Dutzende Inseln. Wir verschweißen die Vertices zunächst anhand ihrer Position, bestimmen die Zusammenhangskomponenten im verschweißten Graphen und schreiben die Gewichtungen anschließend für jeden ursprünglichen Vertex zurück.

Wo ist der Bereich befestigt? Der Ansatzring eines Bereichs besteht aus den nicht weit entfernten Vertices direkt daneben. Sein Mittelpunkt zeigt uns über das nächstgelegene Gelenk, wo der Bereich herabhängt – mit einer Bevorzugung: Ein Rumpf- oder Oberschenkelgelenk innerhalb des 1,5-Fachen der kürzesten Entfernung gewinnt, denn rund um das Becken liegen die Oberschenkelköpfe genauso nah wie die Hüften, und eine Schwanzwurzel zwischen ihnen gehört zum Körper. Den Gewichtungen des Ansatzrings vertrauen wir dabei bewusst nicht. Bei einem Schwanz, der als eigene Hülle modelliert ist – wie bei den meisten Spielmodellen –, ist der Ansatzring der eigene Wurzelring des Schwanzes und trägt dieselben fehlerhaften Gewichtungen, die wir gerade korrigieren wollen.

Ist es ein Körperanhang oder gehört es zum Körper? Dafür verwenden wir zwei Tests. Die weit vom Knochen entfernte Haut eines dicken Rumpfs umschließt einen Knochen, sodass ihr Schwerpunkt wieder auf dem Knochen liegt. Ein Schwanz ragt zu einer Seite heraus, weshalb sein Schwerpunkt weit von jedem Knochen entfernt ist. Wir verlangen, dass der Skelettabstand des Schwerpunkts mindestens 40 % der Reichweite des Bereichs beträgt. Dann folgt ein Formtest: Sind λ1≥λ2 die beiden größten Eigenwerte der Kovarianz des Bereichs, ist die Streckung λ1/λ2. Ein Schwanz erreicht hier etwa 2,6; ein Umhang oder Rock liegt nahe 1. Nur lange Bereiche, die am Becken hängen, werden zu Ketten. Lange Bereiche, die an der Wirbelsäule hängen – etwa eine Scheide, ein Köcher oder ein Riemen –, werden getragen, sind nicht gewachsen und bewegen sich starr mit dem Knochen, an dem sie befestigt sind. Vom Kopf herabhängende Ohren lassen wir unverändert: Sich starr mit dem Kopf zu bewegen, ist genau das, was Ohren brauchen.

Der Schwanz des Fuchses bestand aus zwei überlappenden Hüllen – Fell über Haut, niemals miteinander verschweißt. Deshalb werden Bereiche am selben Ansatz zusammengeführt, wenn sich ihre Bounding-Boxen um mehr als die Hälfte überlappen. Ein Schwanz, eine Kette.

Schritt eins: starr machen ​

Die ehrliche erste Lösung dauert einen Nachmittag. Jeder Vertex des Bereichs erhält auf Hips die Gewichtung 1,0. Der Schwanz hört auf zu reißen und bewegt sich als ein einziges Teil mit dem Becken. Er sieht wie ein Brett aus; das ist der mittlere Fuchs im Bild. Wir haben diese Version als Meilenstein veröffentlicht, weil ihre Dehnung konstruktionsbedingt exakt null beträgt und sie damit eine nützliche Referenz für die Messung weiter unten ist.

Schritt zwei: eine Kette entlang des Schwanzes wachsen lassen ​

Eine Koordinate entlang des Schwanzes. Wir führen Dijkstra vom Ansatzring über den Bereich aus und verwenden dabei die Kantenlängen als Kantengewichte. Jeder Schwanz-Vertex erhält einen geodätischen Abstand g von der Wurzel, und das 99. Perzentil von g ist die Schwanzlänge L: beim Fuchs 81 cm beziehungsweise 42 % seiner Körperhöhe.

Gelenke. Die Anzahl der Segmente beträgt K=clamp(round(L/0.1H),3,8), beim Fuchs also vier. Gelenk J0 ist der Schwerpunkt des Ansatzrings, und Gelenk Ji ist der Schwerpunkt der Haut, deren geodätischer Abstand innerhalb eines halben Segments um iL/K liegt. Zwei Durchläufe von Ji←12Ji+14(Ji−1+Ji+1) verhindern, dass die Kette dort im Zickzack verläuft, wo der Querschnitt asymmetrisch ist – was bei der Spitze eines buschigen Schwanzes immer der Fall ist. Die Knochen heißen Tail_1 bis Tail_K und werden durch ein gewichtungsloses Tail_End ergänzt. Sie sind Hips untergeordnet und verwenden dieselbe Bind-Rotation wie Hips, sodass jeder Knochen im Koordinatensystem seines Elternknochens eine reine Translation darstellt. Ihre inversen Bind-Matrizen ergeben sich direkt daraus, und die vorhandenen Clips referenzieren sie nie, sodass in nachgelagerten Schritten nichts kaputtgeht.

Gewichtungen. Mit s=Kg/L, k=⌊s⌋ und f=s−k gehört ein Vertex in Segment k zu Knochen k+1 und teilt sich die Enden mit seinen Nachbarn:

wprev=clamp(0.5−2f, 0, 0.5),wnext=clamp(2f−1.5, 0, 0.5),wself=1−wprev−wnext

An einem Gelenk treffen sich die beiden Knochen mit einer 50/50-Gewichtung; in der Mitte eines Segments gehört die Haut vollständig einem Knochen. Beim Wurzelsegment ist „prev“ Hips, sodass der Schwanz fließend in den Körper übergeht, anstatt am Ansatzring einen Knick zu bilden.

Nach diesem Verarbeitungsschritt sank der gewichtete Knochenabstand am Schwanz von 47 cm auf 17 cm, was ungefähr dem Radius des Schwanzes entspricht. Näher kann Haut dem Knochen, der sie steuert, kaum kommen.

Seitenansicht des laufenden Fuchses mit über dem Mesh eingezeichnetem Skelett; vier Schwanzknochen verlaufen vom Becken entlang des nach oben und hinten getragenen Schwanzes

Schritt drei: Jemand muss die Knochen bewegen ​

Keiner der Clips in unserer Bibliothek enthält Schwanzspuren. Ohne weitere Arbeit behält die Kette daher ihre Bind-Pose bei, und der Fuchs läuft mit einem Brett herum. Spiele lösen das mit prozeduraler Sekundärbewegung, und wir tun dasselbe – in der Runtime-Bibliothek, die jedes geriggte Modell ohnehin lädt.

Jede Gelenkspitze ist ein Partikel p mit der Geschwindigkeit v. Sein Ruheziel T ist die Position, an der sich die Spitze laut Bind-Pose befinden sollte, und wird in jedem Frame aus der aktuellen Welttransformation des Elternknochens berechnet. Das Partikel folgt einer gedämpften Feder:

p¨=ω2(T−p)−2ζωp˙+g

mit ω=2πf. Das Wurzelsegment schwingt mit f=0.9 Hz und die Spitze mit der Hälfte davon, denn ein Schwanz besteht an der Basis aus Muskeln und am Ende aus Fell. Das ursprüngliche Dämpfungsverhältnis betrug ζ=0.45; das Maus-Update weiter unten erhöht es auf 0.65, um Überschwingen zu reduzieren. Die Schwerkraft beträgt 1 m/s² statt 9,8; ein Schwanz hat Muskeln. Wir integrieren mit semi-implizitem Euler und erzwingen anschließend die Seilbedingung, indem wir p zurück auf die Kugel mit der Knochenlänge um den Knochenkopf projizieren. Ein Seil kann sich nicht dehnen, also darf das auch die Geschwindigkeit entlang des Seils nicht: Die radiale Komponente (p˙⋅n^)n^ wird entfernt, während die Schwingung erhalten bleibt. Zum Schluss wird daraus die Rotation des Knochens abgeleitet: das Quaternion, das seine Bind-Richtung in die Richtung des Partikels dreht.

Da die Partikel im Weltraum liegen, bleibt der Schwanz beim Drehen oder Beschleunigen der Hüften zurück und schwingt eigenständig. Nichts davon ist geskriptet.

Drei Fehler sind hier erwähnenswert, denn jeder davon sah gut aus, bis wir ihn gemessen haben.

Die erste Version zog jedes Partikel in jedem Frame um einen festen Anteil zu seinem Ziel: 12 % bei 60 fps. Als Feder ausgedrückt entspricht das ω≈0.12/Δt≈21 rad/s, also einem Zittern mit 3,4 Hz. Weil diese Steifigkeit die Wurzelsegmente kaum beweglich machte, sammelte sich außerdem die gesamte Bewegung an der Spitze. Die Feder in physikalischen Einheiten zu formulieren, behob beide Probleme auf einmal.

Die zweite Version speiste die Seilkorrektur als Geschwindigkeit zurück: Korrektur geteilt durch Δt. Das liest sich wie das übliche Update der positionsbasierten Dynamik und ist stabil, solange sich die Hüften langsam bewegen, wie in einem Laufzyklus. Je schneller sich der Elternknochen bewegt, desto größer wird die Korrektur und desto mehr Geschwindigkeit speist sie ein. Eine Hüftbewegung von einem halben Meter innerhalb von zwei Drittelsekunden genügte: Ein Knochen drehte sich um 95°, während seine Nachbarn sich um 3° bewegten. Ein Headless-Test, der die Hüften stärker schwingen ließ als jeder von uns ausgelieferte Clip, deckte das Problem auf; der Laufzyklus hätte es nie gezeigt.

Der dritte Fehler war der unten beschriebene Tragwinkel. Er wurde im lokalen Koordinatensystem jedes Gelenks angewendet, sodass ein Schwanz mit vier Knochen viermal angehoben wurde, sich zu einer Kugel am Rücken des Fuchses zusammenrollte und seine eigene Haut an jeder Biegung zerriss. Die Messung weiter unten deckte das auf: Die Kantendehnung des Schwanzes stieg auf ein p99 von 2,3 gegenüber einem Körper-Basiswert von 1,3 – schlechter als am Schienbein, mit dem alles begonnen hatte. carry bezeichnet jetzt die Anhebung des gesamten Schwanzes und wird auf seine Gelenke verteilt.

Clipping. Der Schwanz war so modelliert, dass er gerade zwischen den Beinen nach unten hing, und im Laufzyklus gingen die Füße durch ihn hindurch. Die Ruhepose, auf die die Feder zielt, entspricht daher nicht der des Meshes: Ein carry von 50° hebt die Ruheziele um die Seitenachse der Hüften nach hinten und oben an, so wie ein Fuchs seinen Schwanz in Bewegung trägt. Diese 50° sind die Anhebung des gesamten Schwanzes und werden auf seine Gelenke verteilt, sodass der Bogen sanft bleibt, unabhängig davon, ob die erzeugte Kette vier oder acht Knochen lang ist. Außerdem darf kein Partikel die durch die Schwanzwurzel verlaufende, nach vorn gerichtete Ebene überschreiten. So kann der Schwanz niemals zwischen die Beine schwingen.

Messung ​

Dies sind die ursprünglichen Messwerte des Fuchses vom 6. September, also vor den weiter unten beschriebenen Änderungen für die Maus. Sie dokumentieren den ersten Ketten-Solver und sind kein neuer Benchmark der überarbeiteten Standardwerte.

Standbilder beweisen nichts über das Zerreißen, deshalb messen wir die Kantendehnung während des Clips. Für jede Mesh-Kante, deren beide Vertices auf dem Schwanz liegen, berechnen wir zu 24 gleichmäßig über den Walk-Clip verteilten Zeitpunkten das Verhältnis ihrer geskinnten Länge zu ihrer Bind-Länge. Ein Verhältnis von 1 bedeutet unverformte Haut. Eine Kante, die über 1,5 gedehnt oder unter 0,67 gestaucht wird, gilt als zerrissen. Die Körperkanten werden auf dieselbe Weise gemessen und dienen als Basiswert für normale Skinning-Verformungen.

Walk-Clip, 96.864 Schwanzkanten-Samplesp95p99Maximumzerrissen
Ursprüngliches Rig1.602.424.0311.4%
Starr an Hips1.001.001.000%
Schwanzkette1.091.181.300%
Körper, zum Vergleich1.131.291.78—

Beim ursprünglichen Rig wurde eine von neun Schwanzkanten bis über die Rissgrenze gedehnt, und die schlimmste Kante erreichte das Vierfache ihrer Bind-Länge. Die schlimmste Kante der Kette ist 30 % länger und bleibt damit innerhalb des körpereigenen Basiswerts von 1,78; nichts reißt. Der starre Schwanz bleibt exakt bei 1,00, weil er sich als ein einziges Teil bewegt. Dieser Wert zeigte uns, dass das Testsystem selbst korrekt funktionierte, bevor wir seinen Ergebnissen für die Kette vertrauten.

Ein Schwanz, der tatsächlich schwingt, muss seine eigene Haut ein wenig verformen. Die Aufgabe der Kette besteht daher nicht darin, 1,00 zu erreichen, sondern unter den Werten zu bleiben, die der Körper ohnehin aufweist. Eine frühere Version dieser Tabelle zeigte für die Kette ein p99 von 1,03. Das sah besser aus, war aber schlechter: Der Schwanz bewegte sich kaum, weil der oben beschriebene Geschwindigkeitsfehler ihn so stark gedämpft hatte, dass er fast der starren Version entsprach.

Der Live-Vergleich ​

Drei Exemplare des Fuchses, derselbe Clip, derselbe Frame. Ziehen Sie zum Umkreisen und verwenden Sie das Mausrad zum Zoomen. Wechseln Sie zwischen Clips, schalten Sie die Schwanzphysik aus, um die Kette in ihrer angehobenen Ruhepose zu sehen, und blenden Sie die Knochen ein, um die Position der Kette zu erkennen.

Dieselbe Kette von der Seite, einzeln und mit eingezeichnetem Skelett. Im Clip „Sprint“ ist die Federwirkung am besten zu erkennen.

Was uns die Maus beigebracht hat ​

Der Fuchs zeigte, dass eine Kette das Aufreißen verhindern konnte. Bei einer Maus mit langem, dünnem Schwanz waren die verbleibenden Bewegungsfehler deutlich leichter zu erkennen. Eine scharfe Biegung, die im Fell eines Fuchses verschwindet, wirkt bei der Maus wie ein gebrochenes Gelenk. Ihr Schwanz reicht außerdem bis zum Boden, und seine modellierte Form krümmt sich zu einer Seite. Das sind drei verschiedene Probleme; eine höhere Federsteifigkeit löst nicht alle davon.

Probiere die Maus unten mit verschiedenen Animationen aus. Ziehe die Figur, um die Ansicht zu drehen, scrolle den Streifen mit Vorschaubildern horizontal oder nutze Suche und Kategoriefilter, um eine Bewegung zu finden. Klicke auf eine Kachel, um sie in der großen Vorschau abzuspielen. „Walk“, „Crouch Backward“, „Crawl Idle“ und „Back Flip“ sind gute Ausgangspunkte, um den Schwanz zu untersuchen. Der Streifen verwendet dieselben Live-Animationsvorschauen wie unser Animations-Hero und stellt den vollständigen Katalog bereit, wobei die Bewegungen beim Durchsuchen geladen werden.

Die vollständige Animationsbibliothek öffnen →, um diese Bewegungen mit deinem eigenen geriggten Charakter auszuprobieren und die gewünschten Clips zu exportieren.

Auch eine Federkette braucht Biegewiderstand ​

Die Partikel waren so eingeschränkt, dass die Länge jedes Knochens erhalten blieb, doch jedes Gelenk konnte weiterhin nahezu unabhängig schwingen. Längenbeschränkungen verhindern Dehnung; sie verhindern nicht, dass ein Gelenk einknickt. Die Maus machte genau diesen Unterschied sichtbar.

Vor den Korrekturen an der Maus: Das Schwanzskelett ändert nahe der Spitze abrupt seine Richtung, und das Mesh endet in einem Knick nach unten

Vor den Korrekturen: Die Segmentlängen beizubehalten reichte nicht aus, um die Kurve glatt zu halten.

Jetzt koppeln wir die zusätzlichen Biegungen benachbarter Gelenke, gemessen relativ zur Ruhekurve. Die Biegungen werden in einem gemeinsamen Referenzkoordinatensystem verglichen, damit unterschiedliche Knochenachsen eine Linksbiegung nicht in eine unzusammenhängende Verdrehung des nächsten Gelenks verwandeln. Jeder Schritt liest einen Schnappschuss seiner Nachbarn statt teilweise aktualisierter Werte. Die Kopplungsüberblendung beträgt 1−e−kΔt mit einer Standardrate von k=12 pro Sekunde statt eines festen Anteils pro gerendertem Frame.

Die elastische Biegung eines Gelenks ist auf 30° über seine Ruherichtung hinaus begrenzt. Außerdem haben wir die Dämpfung auf 0,65 erhöht und entfernen Geschwindigkeit, die weiter gegen den Biegeanschlag drückt, damit sie sich nicht ansammelt und ruckartig freigesetzt wird. Die Basis bleibt von der Hüfte gestützt, während die Spitze weicher bleibt. Bodenkontakt kann die Biegegrenze außer Kraft setzen, wenn der Schwanz auf dem Boden liegen muss.

Kopplung von Rotationen statt Partikelpositionen. Nummerieren wir die N Glieder, beginnend mit i=0 an der Hüfte. Sei hi der Anfang eines Glieds, pi seine vorhergesagte Spitze und ℓi seine Länge. Seine Kandidatenrichtung ist di=(pi−hi)/∥pi−hi∥. Im aktuellen Koordinatensystem des übergeordneten Elements sei ri die normierte Ruherichtung und d~i die Kandidatenrichtung. swing(a,b) bezeichne das kürzeste Einheitsquaternion, das den Einheitsvektor a auf b abbildet. Wenn Ai das Ruhekoordinatensystem dieses übergeordneten Elements in das gemeinsame Hüftkoordinatensystem dreht, lautet die mit den Nachbarn verglichene Biegung

qi=Aiswing(ri,d~i)Ai−1.

Diese Konjugation ändert das Koordinatensystem der Biegung; sie fügt dem Charakter keine weitere Rotation hinzu. Mit Schnappschüssen qjold aus dem vorherigen Schritt ergeben sich das Nachbarziel eines inneren Gelenks und die gekoppelte Biegung als

q¯i=slerp(qi−1old,qi+1old,12),α=1−exp⁡(−kΔt),qi∗=slerp(qi,q¯i,α).

An der Basis liegt das Nachbarziel auf halbem Weg zwischen der Biegung des nächsten Gelenks und dem Identitätsquaternion I, das die Stützung durch die Hüfte darstellt. Die freie Spitze verwendet nur ihren einen Nachbarn; ein Schwanz mit nur einem Glied überspringt die Nachbarkopplung. Bei k=12s−1 beträgt α ungefähr 0,181 bei 60 fps und 0,330 bei 30 fps. Dadurch erhält die Kopplung eine zeitbasierte Rate, auch wenn der vollständige Solver weiterhin Integrations- und Kontaktfehler aufweist, die vom Zeitschritt abhängen.

Für ein Einheitsquaternion qi∗ mit der skalaren Komponente wi beträgt der kürzeste Rotationswinkel θi=2arccos⁡(clamp(|wi|,0,1)). Der elastische Anschlag ist

qilimited={qi∗,θi≤θmax,slerp(I,qi∗,θmax/θi),θi>θmax,θmax=π/6.

Wir transformieren diese Biegung zurück in das Koordinatensystem des übergeordneten Elements und wenden sie vor den Kontaktprojektionen auf ri an. Dies ist eine lokale Regel zur Glättung von Biegungen, keine vollständige Simulation eines elastischen Stabs: Sie verteilt zusätzliche Krümmung und begrenzt sie, ohne den Anspruch zu erheben, eine globale Biegeenergie zu lösen.

Die geladene Pose ist nicht unbedingt die Bind-Pose ​

Die gespeicherte Datei der Maus enthielt bereits eine Rotation von etwa 28° am letzten Schwanzgelenk. Wir interpretierten diese geladene Rotation als neutral und addierten anschließend die Federbewegung. Dadurch wurde eine zuvor animierte oder exportierte Pose zu einem dauerhaften Bestandteil des Federziels.

Der Solver rekonstruiert jetzt, sofern vorhanden, neutrale lokale Transformationen aus den inversen Bind-Matrizen des Skeletts. Wenn ein Rig keinen Tail_End-Hilfsknochen besitzt, setzt sein letztes Segment die eingehende Tangente fort, ausgedrückt im lokalen Koordinatensystem dieses letzten Knochens. Einen Vektor aus dem Koordinatensystem des übergeordneten Elements zu kopieren ist falsch, sobald der Endknochen eine andere Ausrichtung hat.

Die einseitige Krümmung hatte noch eine weitere Ursache: Sie war in der eigentlichen Bind-Geometrie vorhanden. Die korrekte Rekonstruktion der Bind-Pose bewahrte daher diese Abweichung. Die Simulation verwendet nun standardmäßig einen zentrierten Ruhebogen, der im Hüftkoordinatensystem aufgebaut und in das Koordinatensystem jedes korrigierten übergeordneten Elements umgerechnet wird. Mit restCurve lässt sich die modellierte Krümmung wieder einblenden: 0 entspricht dem zentrierten Bogen, 1 behält die erstellte Kurve bei. Dadurch ändert sich das Ziel der Federn; das Mesh oder seine Skin-Gewichte werden nicht verändert.

Rekonstruktion der Referenztransformationen. Sei Bi die inverse Bind-Matrix eines Knochens. Seine Bind-Welttransformation lautet Wi0=Bi−1. Wenn also sowohl für den Knochen als auch für sein übergeordnetes Element Bind-Matrizen vorhanden sind, ergibt sich die neutrale lokale Transformation als

Li0=(Wparent(i)0)−1Wi0.

Durch Zerlegen von Li0 erhalten wir die benötigte lokale Translation und Rotation. Würden wir stattdessen das geladene Quaternion lesen, würde diese Referenz durch einen beliebigen gespeicherten Animationsframe ersetzt.

Konstruktion des zentrierten Bogens. Sei ai die erstellte Einheitsrichtung des Segments i im Hüftkoordinatensystem. Wir entfernen die seitliche Komponente der Wurzelrichtung und erhalten c=normalize(0,a0y,a0z); verschwindet diese Projektion, verwenden wir als Rückfallrichtung „nach unten“. Sei β∈[0,1] gleich restCurve und C der gesamte Fortschreibungswinkel im Bogenmaß. Wenn rot(q,v) die Rotation des Vektors v durch das Quaternion q bezeichnet, lautet die gewünschte Richtung im Hüftkoordinatensystem

Qi(β)=slerp(I,swing(c,ai),β),ui=Rx(Ci+1N)rot(Qi(β),c),ri=rot(Ai−1,ui).

Dabei ist Rx die Rotation um die seitliche Achse der Hüfte. Entscheidend ist, dass Ai die bereits auf vorgelagerte Gelenke angewendeten Ruhekorrekturen enthält. Dadurch ist ui die beabsichtigte absolute Richtung dieses Segments, statt die Begradigungskorrektur an jedem Gelenk erneut hinzuzufügen. Bei β=0 wird die modellierte seitliche Krümmung entfernt; bei β=1 bleiben ihre Richtungen erhalten, bevor die Fortschreibung angewendet wird.

Der Schwanz darf den Boden berühren, aber nicht die Maus anheben ​

Beim Bodenkontakt wird ein Segment auf den Schnittkreis seiner Längenkugel mit dem Boden gedreht. Würde man lediglich die Höhe eines Partikels begrenzen, würde sich der Knochen verkürzen; begrenzt man die Höhe und stellt anschließend die Länge wieder her, kann das Partikel erneut unter dem Boden landen. Für die Dicke lassen wir 0,025 Welteinheiten unterhalb der Mittellinie frei, verwerfen die nach unten gerichtete Kontaktgeschwindigkeit und dämpfen das Gleiten. Der ebene Boden liegt standardmäßig bei Welt-Y = 0 und kann verschoben oder deaktiviert werden. Dies ist eine Ebenenbeschränkung, keine Gelände- oder vollständige Mesh-Kollision.

Der Schnitt von Kugel und Boden. Schreiben wir F=g0+ρ für die Bodenhöhe zuzüglich des Abstands der Mittellinie, wobei standardmäßig g0=0 und ρ=0.025 gelten. Das Segment muss folgende Bedingungen erfüllen:

∥pi−hi∥=ℓi,(pi)y≥F.

Liegt der vorhergesagte Endpunkt unter dem Boden, definieren wir u=(F−hiy)/ℓi. Für |u|≤1 liegt der Kontakt auf einem horizontalen Kreis. Ist t eine horizontale Einheitsrichtung, lautet der korrigierte Endpunkt

pi′=hi+ℓi(1−u2t+uey),ey=(0,1,0).

Seine Höhe ist exakt F, und sein Abstand vom Anfang ist exakt ℓi, da (1−u2)+u2=1. Wir wählen t aus der horizontalen Projektion der Kandidatenrichtung; verschwindet diese Projektion, verwenden wir ersatzweise die Ruherichtung. Die Hintergrenzebene der Hüfte kann einschränken, welcher Teil des Kreises zulässig ist. Der Kontakt hat Vorrang vor dem elastischen Biegeanschlag. Liegt der Anfang so weit unter dem Boden, dass u>1 gilt, kann keine Rotation dieses Segments mit fester Länge den Boden erreichen; die Implementierung begrenzt u, statt den Knochen zu strecken oder den Körper anzuheben.

Nach den übrigen Geschwindigkeitsprojektionen wird bei einem Partikel mit Bodenkontakt die verbleibende Abwärtsgeschwindigkeit entfernt und seine Geschwindigkeit gedämpft:

vi′=e−γΔt[vixmax(0,viy)viz],γ=8s−1.

Dies ist ein unelastischer Kontakt mit einfacher Dämpfung, kein Coulomb-Reibungsmodell. Er verhindert, dass die Schwerkraft Abwärtsgeschwindigkeit aufbaut, während der Schwanz auf dem Boden ruht.

Damit war das Eindringen des Schwanzes behoben, doch es gab noch zwei andere Stellen, an denen ein Schwanz die Füße schweben lassen konnte.

Erstens setzte der Viewer den tiefsten Punkt des gesamten geladenen Meshes auf den Boden. Hing der gespeicherte Schwanz unter die Fußsohlen, wurde der gesamte Charakter angehoben, um Platz für den Schwanz zu schaffen. Bei der Platzierung im Viewer wird nun überwiegend vom Schwanz beeinflusste Skin-Geometrie ignoriert, wenn die Unterkante des Körpers bestimmt wird; die Kameraeinstellung berücksichtigt weiterhin den gesamten Charakter.

Zweitens berücksichtigte auch der Body-Grounding-Durchlauf des Retargeters den Schwanz. Während „Back Flip“ hob er das Becken an, um diese Skin-Geometrie vom Boden fernzuhalten, obwohl der unabhängige Schwanz-Solver sie anschließend ohnehin bewegen würde.

Welche Skin-Geometrie darf das Becken anheben? Sei S die Menge der abgetasteten Stützpunkte der Körper-Skin-Geometrie, T die Menge der überwiegend von Schwanzknochen beeinflussten Punkte und E die Menge der Punkte, die den Kontakt-Solvern der Gliedmaßen zugeordnet sind. Der Referenzboden wird bei der Kalibrierung aus S∖T bestimmt. Der verbleibende Abstand des Körpers in Frame t ist

fbody=minv∈S∖Tyv0,c(t)=minv∈S∖(T∪E)yv(t)−fbody,Lraw(t)=max(0,a(t)−c(t)).

Dabei ist a(t)≤0 der aus der Quellanimation abgeleitete zulässige Wert für das Absinken unter den Referenzboden. Lraw ist die angeforderte Anhebung vor der zeitlichen Glättung und dem Abgleich der Gliedmaßen durch den Retargeter. Derselbe Ausschluss des Schwanzes muss in beiden Minima gelten: Würde er nur aus der Prüfung der aktuellen Pose entfernt, bliebe der falsche Referenzboden bestehen. Die Implementierung tastet die Skin-Geometrie gruppiert nach dem dominanten Knochen ab, statt in jedem Frame jeden Vertex auszuwerten.

Für den folgenden Vergleich ist die angegebene zusätzliche Anhebung die Differenz zwischen den endgültigen Beckenbahnen und nicht lediglich zwischen den Rohkorrekturen:

Δyhips(t)=yhipstail counted(t)−yhipstail excluded(t).

Gemessene Beckenanhebung gegen Ende von „Back Flip“

Wir haben dieselbe Maus zu denselben Animationszeitpunkten abgetastet und dabei nur geändert, ob der Schwanz beim Body-Grounding berücksichtigt wurde. Beide Spalten verwenden dieselben Weltkoordinaten des Modells; die Differenz isoliert die zusätzliche Höhe, die durch die Berücksichtigung des Schwanzes entsteht.

Zeitpunkt im 1,93-s-ClipBeckenhöhe: Schwanz berücksichtigtBeckenhöhe: Schwanz ausgeschlossenZusätzliche Anhebung durch Berücksichtigung des Schwanzes
1,16 s50,5 cm35,0 cm15,4 cm
1,55 s81,3 cm70,3 cm11,0 cm
1,84 s92,2 cm77,2 cm15,0 cm
1,93 s90,6 cm77,2 cm13,4 cm

Der Charakter soll sich beim Aufstehen nach der Landung anheben. Der Fehler ist die zusätzliche Anhebung in der letzten Spalte, nicht diese beabsichtigte Aufrichtbewegung. Die Werte wurden unabhängig voneinander aus den abgetasteten Weltpositionen gerundet.

Bei dieser Maus beseitigte der Ausschluss des Schwanzes gegen Ende von „Back Flip“ etwa 15 cm zusätzliche Beckenanhebung. Gegen Ende blieb die Körperprüfung innerhalb von etwa einem Millimeter zum Referenzboden, statt mehrere Zentimeter darüber zu schweben. Die Skin-Geometrie des Schwanzes bestimmt nun weder den Boden des Körpers noch die Korrektur, die sein Becken anhebt. Der Schwanz-Solver selbst dreht ausschließlich Schwanzknochen; er verschiebt niemals das Modell, die Hüfte oder die Füße.

Eine Animation kann eine Pose übernehmen, bevor du sie überhaupt abspielst ​

Die angehobene Hocke machte ein separates Problem sichtbar. Wir erzeugen die Bibliotheksclips schrittweise, damit der Viewer mit der Wiedergabe beginnen kann, bevor alle Clips bereit sind. Das Retargeting verwendete dasselbe Skelett wie die Wiedergabe. Zwischen den Berechnungen konnte die Vorschau das Becken bewegen, woraufhin der nächste Clip diese animierte Pose als Kalibrierungsreferenz einlas. Ein Zurücksetzen beim Wechsel zwischen Clips konnte eine fehlerhafte Referenz nicht reparieren, die bereits in die erzeugten Tracks übernommen worden war.

Das Retargeting arbeitet nun mit privaten Skelettkopien, die aus einer stabilen, vor Beginn der Wiedergabe erfassten Kalibrierung erstellt werden. Spätere Clip-Anfragen verwenden diese Referenz erneut, und parallele Anfragen besitzen separate Knochen. Ein Regressionstest bewegt und dreht die Live-Hüfte absichtlich zwischen ausgelieferten Clips; die erzeugten Tracks müssen mit denen eines sauberen Durchlaufs identisch bleiben, und die Berechnung darf die Live-Pose nicht verändern. Nicht jede sichtbare Bewegung war ein Fehler. „Climb Idle“ weist in seiner Quellschleife ein leichtes Wippen des Beckens auf, während der Root unbewegt bleibt. Und bei einer neuen Berechnung von „Crawl Idle“ blieben die Hände der Maus während der gesamten Schleife unterhalb ihres Kopfes; der Screenshot mit erhobenen Händen passte zu einem früheren verunreinigten Clip und war kein Beleg dafür, dass die Quellanimation diese Pose vorsah. Der Vergleich von Quelle, neuer Berechnung und abgespieltem Ergebnis verhinderte, dass wir beabsichtigte Bewegungen glätteten, um einen Kalibrierungsfehler zu kaschieren.

Was wir jetzt prüfen ​

Die Prüfungen umfassen schnelle Hüftbewegungen bei Ketten unterschiedlicher Länge, gleichmäßigere Biegungen benachbarter Glieder, identische Reaktionen auf der linken und rechten Seite, die Wiederherstellung der Bind-Pose, einen gedrehten Endknochen ohne Hilfsknochen sowie einen sauberen Schleifenschluss nach dem Aufwärmen. Bodentests decken das Hocken, angehobene Bodenebenen sowie das Absetzen und Lösen beim Anheben der Hüfte ab. Separate Regressionstests stellen sicher, dass der Kontakt des Schwanzes niemals den Körper bewegt und dass die Hautgewichtung des Schwanzes keine Anhebung des Beckens auslösen kann.

Diese Prüfungen sichern konkrete Invarianten ab. Sie ersetzen weder die Beobachtung der Maus während ihrer Bewegungen noch liefern sie neue Werte für die Dehnung des Fuchses. Die Live-Beispiele verwenden den überarbeiteten Solver; die frühere Fuchstabelle bleibt als Dokumentation der ursprünglichen Messung erhalten.

Was sich dadurch für dich ändert ​

Wenn du unter cinevva.com/tools/rigger einen Charakter mit Schwanz riggst, erhält der Schwanz automatisch eine eigene Knochenkette, der Jobstatus enthält einen appendages-Eintrag mit einer Beschreibung des erkannten Fortsatzes und die Vorschau lässt ihn schwingen. Über die Plattform-API geriggte Modelle erhalten dieselbe Datei. Seit der ursprünglichen Integration in rt/1.1.12 erkennt createAnimator Tail_*-Knochen und animiert sie ohne zusätzlichen Code. Frequenz, Dämpfung, Gravitation und Tragewinkel der Feder lassen sich anpassen, wenn du einen schwereren oder trägeren Schwanz möchtest. Ältere Dateien ohne Schwanzkette können durch erneutes Rigging noch einmal durch diesen Verarbeitungsschritt geschickt werden. Die oben beschriebenen Änderungen vom 11. September sind jetzt in den Webvorschauen von Cinevva verfügbar. Spiele, die eine ältere Runtime-Version verwenden, und bereits exportierte Clips werden nicht automatisch aktualisiert. Vorhandene gebackene Clips müssen neu erzeugt werden, damit die Korrekturen wirksam werden.

In Blender. Das Add-on führt denselben Verarbeitungsschritt in der Rig-Tabelle aus, bevor es die Armature erstellt. So erhält ein auf deinem eigenen Rechner geriggter Schwanz dieselbe Kette mit denselben Namen. Neben „Fingers“ befindet sich ein Kontrollkästchen für „Tail“, und die Ergebniskarte zeigt an, was erkannt wurde.

Außerhalb unserer Runtime. Eine Feder in einem Spiel hilft niemandem, der die Datei in Blender, Unity oder Unreal öffnet, denn dort bliebe der Schwanz unbewegt. Deshalb wird sie beim Export jetzt gebacken: Jeder ausgewählte Clip wird simuliert, und die Rotationen des Schwanzes werden als echte Keyframes aufgezeichnet. Der Exporter lässt den Clip lautlos laufen, bis der Schwanz wieder an der Ausgangsposition des Verarbeitungsschritts angekommen ist, und beginnt erst dann mit der Aufzeichnung. Denn ein aus dem Kaltstart gebackener Zyklus schließt nicht sauber, sodass der Schwanz beim Schleifenanfang springt. Die Spitze ist absichtlich das weichste Glied. Daher klingt ihre Einschwingbewegung am langsamsten ab, und ein einziger Aufwärmdurchlauf genügt nicht immer.

Der Verarbeitungsschritt ist bewusst konservativ. Er erzeugt nur für ein langes, vom Becken herabhängendes Körperteil eine Kette. Ohren, Haare und Ärmel bleiben ebenso unangetastet wie breite Teile am Rumpf: Eine frühere Version ordnete einen Umhang oder Rock starr dem jeweiligen Rumpfknochen zu, doch die Ergebnisse bei echten Uploads haben uns umdenken lassen. Eines dieser Kleidungsstücke hatte 6.540 Vertices im Hüftbereich, die der Rigger sinnvoll auf Hüfte und beide Oberschenkel verteilt hatte; mit nur einem Knochen hätte es den Beinen überhaupt nicht mehr folgen können. Ein Kleidungsstück anhand einer Vermutung über seine Art einem einzelnen Knochen zuzuordnen, ist ein erheblicher Eingriff in den Charakter eines Nutzers. Deshalb geschieht dies jetzt nur noch auf ausdrücklichen Wunsch und nicht mehr automatisch. Abgesehen von der vorderen Ebene gibt es keine Kollision mit den Beinen und auch kein Schwingen im Leerlauf, wenn der Charakter stillsteht. Der Schwanz eines stehenden Fuchses hängt daher ruhig in seiner Tragepose. Diese beiden Punkte stehen als Nächstes auf der Liste, ebenso wie eine entsprechende Behandlung von Flügeln, die eine andere Ruhepose und eine andere Feder benötigen.