Hinter den Kulissen der Rollenketten Animation

OK, inzwischen ist die bisherige Version meiner Rollenketten Animation veröffentlicht und ich hatte Zeit, mir die einmal aus der Distanz anzusehen.

Bahnkurve der Kettenglenke während eines kompletten Umlaufs (Anklicken für Vergrösserung)

Es gibt ersichtliche Mängel, Wünsche, die offen geblieben sind sowie Pläne, wie man das verbessern könnte. Darum soll es hier gehen.

Zunächst zu den Mängeln. Dazu muss ich ein wenig ausholen und beschreiben, wie (und mit welchem Ziel!) ich diese Animation einer Rollenkette aufgebaut habe.

Der Kettenumlauf, d.h. die Bahnkurve, auf der sich alle Kettengelenke bewegen, und zwar in exakt gleichbleibendem Abstand zueinander, gliedert sich in vier Segmente:

  • Kreisbogenförmige Umschlingung Antriebsritzel
  • Kettenlinie (Katenoide) unteres Trum
  • Kreisbogenförmige Umschlingung (grosses) Kettenrad
  • Geradlinige Kettenlinie oberes Trum

Jedes Segment ist softwareseitig dafür verantwortlich, alle Rollen zu zeichnen, deren Zylinderlängsachse in seinem Bereich sichtbar sein sollen. Dabei findet keine Zählung oder Buchführung statt. Das heisst, Rollen buchen sich weder in ein Segment ein, noch buchen sie sich aus, noch findet eine Zählung statt. Insbesondere findet keinerlei Übergabe einer Rolle von einem Segment ans nächste statt. Auch ist die Anzahl von Rollen in jedem Segment ist nicht konstant, sondern kann je nach Winkelstellung des Antriebsritzels geringfügig schwanken. Für das (kleine) Antriebsritzel bei der vorliegenden Geometrie/Zähnezahl z.B. zwischen [6 .. 7] Rollen.

Damit diese Unabhängigkeit trotzdem zu einer geschlossenen und kontinuierlichen Animation führt, müssen alle Segmente nahtlos, d.h. ohne Lücken und/oder Überlappung an ihre jeweiligen Nachbarn anschliessen. Zudem sollen alle Segmentübergänge «tangential» erfolgen, also ohne erkennbare Richtungsänderung in der Bahnkurve der Rollen. Für echte Perfektion müsste(!) man an sämtlichen Segmentgrenzen berücksichtigen, dass Ritzel/Kettenräder keine Kreiskonturen aufweisen, sondern Polygone sind, siehe auch «Polygoneffekt«. D.h., eine unvermeidliche Richtungsänderung zwischen dem letzten, vollständig auf dem Ritzel aufliegenden Kettenglied und dem ersten «frei in der Luft» verlaufenden Kettenglied muss zumindest «minimal» sein.

Damit die Rollenketten Animation «natürlich» aussieht, sollte sie im unteren Trum einen kleinen Durchhang aufweisen. In einem realen Rollenkettenantrieb stellt sich dieser Durchhang als Saldo von der Gesamtlänge der Kette (Teilung * Anzahl Kettenglieder), Zähnezahl der beteiligten Ritzel bzw. Kettenräder sowie Achsabstand natürlicherweise passend ein. Die Nachahmung dieses Wegs war mir in meiner Animation leider versperrt, da die mathematische Behandlung einer Katenoide, insbesondere unter Berücksichtigung des Polygoneffekts, mathematisches Wissen erfordert, über welches ich leider nicht verfüge. So war ich auf Näherungen angewiesen welche erwartungsgemäss den nahtlosen und überlappungsfreien Übergang an Segmentgrenzen stören. 🥲

Den Berührpunkt zwischen Katenoide und einem Kreis(!) mit Polygonradius des Antriebsritzels habe ich hilfsweise grafisch ermittelt, auf der Basis der folgenden Überlegung:

Ausgehend von der Gleichung einer generischen Katenoiden

habe ich mir zunächst eine kleine Excel-Tabelle präpariert (Am Ende dieses Artikels zum Download angehängt), um mich mit der ungewohnten hyperbolischen trigonometrischen Funktion ein wenig vertraut zu machen:

Katenoid Playground – klick to enlarge

Schnell war klar, dass die beiden Parameter x0 und y0 eine Verschiebung des Scheitelpunkts (tiefster Punkt mit horizontaler Tangente) der Katenoide bewirken.

Da ich eine horizontale Tangente im Übergang zum unteren Eintritt ins grosse Kettenrad im Sinn hatte, waren die nötigen Werte für x0 und yo für eine Verschiebung des Scheitelpunkts in diesen Punkt per trial&error schnell gefunden, und zwar schlussendlich exakt. Hinweis an dieser Stelle: der Parameter y0 weist eine Abhängigkeit von den Zähnezahlen der beiden beteiligten Ritzel/Kettenräder und dem noch zu bestimmenden «Vergrösserungsfaktor» alpha auf.

Blieb die Ermittlung des «tangentialen» Übergangs der Kettenlinie in den Kreis mit Polygonradius des Antriebsritzels. Durch Variation des Wertes «alpha» in meiner o.a. Excel-Tabelle konnte ich dessen Wert mässig exakt in den Bereich zwischen 950 und 1050 eingrenzen. Da mir dieser interaktive Weg zu lästig wurde und auch nicht die gewünschte Exaktheit versprach, habe ich den Rechner für mich arbeiten lassen und in einem durch x-Koordinaten und alpha-Werten definierten Zielbereich für 41 * 41 Rasterpunkte mit variierenden x- und alpha-Werten den Abstand zum echten Tangentenpunkt zwischen Katenoide und Kreisbahn mit Polygonradius ermitteln lassen.

Und zwar so:

Für eine Annäherung an den tatsächlichen Tangentenpunkt verwende ich eine Kombination aus ungefährem x-Wert und ungefährem Alpha-Wert. Damit berechne ich den resultierenden Punkt der durch alpha definierten Katenoiden. (x0 und y0 hatte ich bereits vorher bestimmt – diese ändern sich durch Variation von alpha nicht!)

Da ich den echten Tangentenpunkt nicht kenne, kann ich zunächst auch nicht wissen, einen wie grossen Fehler ich durch die Annahme eines x- und alpha-Werts mache.

Aber!

Ich weiss, dass im echten Tangentenpunkt die Katenoide echt tangential an den Kreis mit Polygonradius anliegt. Die Steigung der Tangente lässt sich auch durch einen Ingenieur 😏 leicht berechnen:

Der Endpunkt einer Normalen im wahren Tangentenpunkt mit Länge «Polygonradius» muss exakt im Drehpunkt des Ritzels liegen:

Normale ab wahrem Tangentenpunkt mit Länge = Polygonradius (grün) hat ihren Endpunkt exakt im Zentrum der Zielscheibe

Den vorherigen Satz bitte einmal sacken lassen und verstehen.


Daher gibt der Abstand des Endpunkts einer Normalen an die Tangente eines geschätzten Näherungspunkts an den Tangentenpunkt mit der Länge Ritzelradius zum Koordinatenursprung ein exaktes Mass für den Abstandsfehler der Näherung. Klingt kompliziert, ist aber im Grunde sehr anschaulich. Formelmässig sieht das so aus:

Die letzte der obigen Formeln beschreibt den Abstand («d» wie distance) in Abhängigkeit der x-Koordinate und des Vergrösserungsfaktors «alpha», den eine Katenoide vom wahren Tangentenpunkt aufweist. Dabei stelle ich die Grösse des Fehlers als Höhe (z-Koordinate) eines Punkts auf der Fehlerfläche dar.

Programm-technisch habe ich das so implementiert:

Im graphisch-visuellen Endergebnis sieht das dann wie folgt aus, wenn ich die Anzeige der Rollen ausgeblendet und hilfsweise eine grüne Kreisscheibe mit Radius Polygonradius eingeblendet habe:

Die Abstands- oder «Fehlerfläche» erweist sich wenig überraschend als invertierte Kegeloberfläche, mit ihrer nach unten weisenden Spitze exakt(!) auf dem wahren Tangentenpunkt zwischen Katenoide und Kreis mit Polygonradius sitzend. Das ist eine schöne Bestätigung der formelmässigen Zusammenhänge zwischen Eingabe von x und alpha und dem resultierenden Abstand «d» = Fehler. Immerhin!

Aber eigentlich interessiert mich die Vorhersage, bzw. die Berechnung von alpha und x für den wahren Tangentenpunkt. Die schrittweise Herleitung der Formel der Fehlerfläche d(alpha, x) (s.o.) sieht zwar schön «clean» und übersichtlich aus, verdeckt aber die dahinter liegende Komplexität.

Das Minimum einer Funktion von zwei Variablen (einer Fläche) über einem betrachteten Intervall kann man sich anschaulich als horizontal tangierende Ebene an die untersuchte Fläche vorstellen. Mathematisch erfordert dies die Aufstellung der beiden partiellen Ableitungen

∂ d(alpha, x)/ ∂alpha und ∂ d(alpha, x)/ ∂x

und Ermitteln der Nullstellen dieser partiellen Ableitungen.

Als ich aber die obige «cleane» Darstellung der Gleichung für d(alpha, x) durch wiederholtes Einsetzen der Zwischenschritte ausgeschrieben vor mir sah:

habe ich dann doch kapituliert 😩

Ich hoffe, man legt mir das nicht als Faulheit aus …

Hilfsweise habe ich dann auf mein oben skizziertes grafisches Verfahren zurückgegriffen und durch wiederholtes, symmetrisches Verkleinern der Wertebereiche für alpha und x, bei gleichzeitiger Verringerung der Schrittweite des Rasters, den Suchbereich soweit verengt, bis ich die Werte für alpha und x mit – wie ich annahm – hinreichender Genauigkeit von jeweils 5 signifikanten Stellen ermittelt hatte.

Aber nochmals: die so ermittelten Werte für alpha und x gelten in der genannten Genauigkeit nur für den angenommenen Tangentenpunkt zwischen Katenoide und einem Kreis mit Polygonradius, während tatsächlich aufgrund des Polygoneffekts der Kontakt der Katenoiden mit einem wandernden Punkt des sich drehenden Polygons erfolgt.

Als Folge der so eingeführten Ungenauigkeiten kommt es zu sichtbaren Darstellungsfehlern während der Animation, welche ich als «Dark Flash» und «Bright Flash» bezeichne. Was hat es damit auf sich?

Dark Flash und Bright Flash

Bei der Darstellung einer animierten Rollenkette folgt das Auge in der Regel nicht einer einzelnen Rolle, sondern nimmt, integrierend, den Kettenumlauf als Ganzes wahr. Wenn irgendwann eine Rolle in dem erwarteten regelmässigen Bild fehlt, wird diese Lücke in der regelmässigen Abfolge der Rollen sofort als Fehler wahrgenommen, egal an welcher Stelle sie vorliegt. Das wäre dann ein Dark Flash. «Flash» deshalb, weil bei 120 fps (wie auf meinem MacBook Pro M4 Max) dieser Fehler nur 1 frame lang, also etwa 8 Millisekunden lang andauert.

Umgekehrt wird das Erscheinen einer (hellen) Rolle ausserhalb des regelmässigen Kettenumlaufs gerade vor einem dunklen Hintergrund besonders auffällig als Bright Flash wahrgenommen.

Hintergrund der Entstehung von Dark Flash und Bright Flash ist die Verwendung von InstancedMeshes der Three.js Programmierumgebung. Man nutzt diese InstancedMeshes zur Performance Optimierung, wenn mehrere Objekte gleicher Geometrie und gleichen Materials mit unterschiedlichen Welt Transformationen (Position, Orientierung, Skalierung) gezeigt werden sollen.

Zu Beginn der Nutzung von InstancedMeshes alloziert man vorab über den dritten Parameter «count» die gewünschte Anzahl von Instanzen, die man zukünftig zu nutzen gedenkt:

mesh = new THREE.InstancedMesh( geometry, material, count );

Von diesem Moment an übernimmt der Entwickler die Verantwortung dafür, für ausnahmslos alle allozierten Instanzen vor deren Nutzung eine gültige Welt Transformationsmatrix bereitzustellen.

Zurück zu dem Segmenten der Rollenketten Animation:

Wegen der beschriebenen Ungenauigkeiten an den Segmentgrenzen können zwei Arten von Fehlern auftreten:

  1. Beide benachbarten Segemente fühlen sich für eine «im Grenzbereich» liegende Rolle verantwortlich. In der Folge bedienen sich beide Segmente aus dem Pool der anfänglich allozierten und genau abgezählten Instanzen. Mit der Folge, dass für die letzte Rolle keine Instanz mehr übrig ist – es kommt zum Dark Flash.
  2. Keins der benachbarten Segmente fühlt sich für eine «im Grenzbereich» liegende Rolle verantwortlich. In der Folge bedient sich keins der beiden Segmente aus dem Pool der anfänglich allozierten und genau abgezählten Instanzen. Dies hat zwei Folgen: An einer Stelle, an der eigentlich eine Rolle hätte gezeichnet werden müssen, bleibt eine Lücke – ein Dark Flash. Weitere Folge ist, dass der Pool allozierter Instanzen nicht vollständig verbraucht wurde. Für die letzte, ungenutzte Instanz wurde keine Transformationsmatrix bereitgestellt. Also erscheint diese letzte Rolle per default im Koordinatenursprung, im Zentrum des Antriebsritzels – als Bright Flash.

Ausblick

Es gibt also Verbesserungspotenzial.

Falls ich einen neuen Versuch einer Rollenketten Animation unternehmen würde, sollte er neben der Vermeidung der oben geschilderten Fehler als zusätzliches feature einen variablen Achsabstand, und resultierend einen variablen Kettendurchhang entlang einer passenden Katenoiden aufweisen. Als geheimes Fernziel würde ich im Endausbau gerne eine belastbare (quantifizierbare) Antwort auf die Frage erhalten, wie sich der Durchhang der Motorrad-Kette bei Einfederung der Hinterradschwinge verändert …

Unsortierte Stoffsammlung:

  • durchgängige Betrachtung von Ritzel und Kettenrad als Polygon
  • Identifikation der Aufhängepunkte der Kettenlinie an der letzten/ersten Rolle, die noch/schon vollständig in ihrer Tasche zwischen zwei benachbarten Zähnen sitzt (d.h.: per frame variable Aufhängepunkte)
  • Identifikation der (je nach Achsabstand veränderlichen) x-Position des tiefsten (Scheitel-) Punkts der Katenoiden. Wahrscheinliche Vereinfachung bei Symmetrie (gleiche Zähnezahl beider Ritzel).
  • Betrachtung der Katenoiden als zwei Halb-Katenoiden rechts und links des Scheitelpunkts (mit jeweils gleichen x0, y0, alpha)
  • Gesamtlänge der Kette konstant mit gerader Anzahl von Kettengliedern
  • Aufteilung der Kettenlänge in fixen Teil (Rollen vollständig in Ritzel/Kettenrad, sowie geradlinige Verbindung oben).
  • Rest der Kettenlänge entfällt auf Katenoide.
  • mögliche Vereinfachung der Katenoide durch Verzicht auf hyperbolische trigonometrische Funktionen und Ersatz durch Taylor-Reihe aureichender Genauigkeit

Resourcen, unsortiert:

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert