Sanfte Bewegung / Beschleunigen & Abbremsen

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Stimpy
Beiträge: 49
Registriert: 02.03.2011, 15:16
Wohnort: Seelze / Hannover
Kontaktdaten:

Sanfte Bewegung / Beschleunigen & Abbremsen

Beitrag von Stimpy »

Hallo liebe ZFX'ler,

irgendwie stecke ich mal wieder im Wust der Mathematik fest :shock: Also hoffe ich , dass mir hier vielleicht jemand weiterhelfen kann.

Es geht darum eine Bewegung zu erzeugen die sanft beschleunigt, dann sich linear bewegt und abbremst am Ende. Die Schwierigkeit liegt darin, dass ich ein Startwert habe der völlig verschieden sein kann aber der Endwert immer 45 sein muss und die Bewegung immer in der selben Framezahl erledigt sein soll. ich habe mit Sinus und Cosinus schon probiert aber ich habe Probleme das man auf 45 kommt, einfach Beschleunigen und Bremsen per Kurve ist kein Problem. Das ganze Versuche ich jetzt Vorzuberechnen in einer Schleife mit einer beliebigen Anzahl an Bewegungsframes.

Evtl. hat jemand dafür ja eine Formel

Grüße

Stimpy
antisteo
Establishment
Beiträge: 854
Registriert: 15.10.2010, 09:26
Wohnort: Dresdem

Re: Sanfte Bewegung / Beschleunigen & Abbremsen

Beitrag von antisteo »

e(x) ist die Differenz zum Wunschwert, der Fehlerwert
du regelst jeden Frame xx% von -e(x) auf den realen Wert drauf.

95% sind eine sehr rasche Annäherung an den Wert
3% ist eine sehr seichte Bewegung
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Sanfte Bewegung / Beschleunigen & Abbremsen

Beitrag von CodingCat »

Bei einer festen Framezahl würde ich eine nicht-iterative Variante bevorzugen. Das was du willst hört sich eigentlich genau wie Smoothstep an. Bei 0 Frames Parameter 0, bei Endframe Parameter 1, das Ergebnis auf den Bereich [Startwert, 45] skalieren.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Andre
Establishment
Beiträge: 186
Registriert: 21.12.2011, 20:33

Re: Sanfte Bewegung / Beschleunigen & Abbremsen

Beitrag von Andre »

Vielleicht kann auch das hier dir weiterhelfen:

Code: Alles auswählen

x = (( 1 -  Smoothing) * OldValue) + (Smoothing * TargetValue)
Wobei Smoothing eine Zahl so um die 1 herrum ist.

Wenn das ganze FPS abhängig sein soll, so kannst du einfach die beiden "Smoothing"-Werte mit der DeltaTime multiplizieren.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2367
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Sanfte Bewegung / Beschleunigen & Abbremsen

Beitrag von Jonathan »

Ansich sollte man das sehr geschickt mit Polynomen lösen können. Auf das Polynom, das Cat verlinkt hat, kommt man vermutlich durch die 4 Bedingungen "Ableitung in 0 und 1 muss 0 sein; Startwert 0, Endwert 1". Daraus erhält man dann also 4 Gleichungen und kann ein Gleichungssystem aufstellen und lösen und bekommt so die gewünschte Funktion.
In diesem Beispiel ändert sich die Geschwindigkeit natürlich ständig. Wenn du wirklich möchtest, dass die "Kurve" in der Mitte linear ist, kannst du deine Funktion auch in 3 Teile aufteilen, Beschleunigung, Bewegung und Abbremsung. Für jeden Teil kannst du dir dann wieder Bedingungen aufstellen, aus der Anzahl der Bedingungen bekommst du den Grad deines Polynoms (-1, weil man ja bei 0 anfängt zu zählen), dann stellst du wieder ein Gleichungssystem auf, und löst es.

Alternativ kannst du dir auch eine Funktion basteln, die nicht angibt, zu welchem Zeitpunkt das Objekt wo ist, sondern die angibt, zu welchem Zeitpunkt das Objekt wie schnell ist. Die Position des Objektes zu einem beliebigen Zeitpunkt bekommst du dann heraus, indem du diese Funktion integrierst. Der Vorteil ist, dass du hierbei vermutlich kein Gleichungssystem lösen musst.
Am Ende musst du dann natürlich alles passend skalieren, aber den Faktor hat man dann ja sehr schnell ermittelt.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten