Interpolation von Bewegungen

Nobody

Mitglied
Hi ich weiss nicht ob das hier im richtigen bereich ist, weil es eigentlich ein Mathematisches "Problem" ist aber ich stells einfach mal hier rein....

Ich baue noch immer an einem Browsergame, bisher Interpoliere ich sowohl die eigenen Spielbewegungen als auch die der Kontrahenten mittels folgendem Prinzip.

PHP:
 function beiWertÄnderung {
....

speedFactorX = gesammtSchrittwWeite / schrittDauerBisZurNächstenÄnderung;
....
}

  function beiWertÄnderung {
....

schrittWeiteAktuellX = restStrreckeX - ( speedFactorX * restLaufZeitDesSchrittes);
....
}

ich hab nun hier nur die Formeln reingepostet weil es darum geht.


Rein technich berechne ich den Quotienten der zurückzulegenden gesammt Strecke bezogen auf die Zeit die hierfür gegeben ist, berechne dann die Strecke die in der restlichen Zeit nach diesen Quotienten zurück gelegt werden kann und ziehe das von der restlichen verbliebenen Strecke ab, somit bleibt ein "schritt" für x und einer für y mit dessen hilfe ich dann Anhand der Aktuellen Position die neue Berechne.

mein Problem liegt nun an foolgender Formel::
schrittWeiteAktuellX = restStrreckeX - ( speedFactorX * restLaufZeitDesSchrittes);

denn rein "subjektiv" betrachtet ist die Beschleunigung der Bewegung entgegen meiner Annahme nicht Linear sondern steigt die Beschleuningung JEDER GESAMMTSTRECKE zu Begin an bleibt dann annähernd kontinuierlich bis kurz vor beendigung des GESAMMT SCHRITTES und wird hier wieder langsamer...

Also die Kurve der Beschleunigung sieht übertreiben so:

................. ____________..............
beginn... /.......laufzeit........ \ ..ende

aus

Was bei der Bewegung der eigenen Spielfigur jetzt nicht sonderlich auffällt da hier die Schritte allgemen gesehen viel kürzer sind fällt bei Gegnern dann schon ins Gewicht, allerdings werden vom server nur alle 150ms werte gesendet und dazwischen die Schritte werden Interpoliert.

Das ergebniss ist dann keine schön weiche gleichmässige bewegung sondern eine die der beschleunigung eines autos mit verdrecktem vergaser sehr ähnelt...

Kann mir nun bitte ein Mathematisch begeisterter Mensch erklären warum dem so ist und mir evtl Literatur vorschlagen bzw einfach ne formel reinposten die linear ist?

zur Interpolation noch:

(Momentan werden die Aktuellen werte für eine Restlaufzeit bei 220ms gesetzt, so das eine 70 millisekündige Verzögerung und auch Reserve für die Ungleichmässig eintreffenden Servernachrichten existiert, die "normzeit" ist zwar 150 ms aber die scheduled Jobs worker (quartz) laufen da nicht wirklich rund so das 96 und 203 ms normal sind, zuweilen hatte ich auch schon werte um 324ms wobei hier vermutlich ein Paket verloren ging...)
 
Hoffe ich habe das richtig verstanden...

Also ich nehme an deine Figur beschleunigt schon konstant, aber weil die konstant beschleunigt heißt es die Differenz der Strecke, die deine "Figur" innerhalb gleicher Zeit zurücklegt nimmt zu!

Grob übersetzt kannst du deine Formeln mit den Physikalischen Formeln vergleichen:

v = s / t "Geschwindigkeit = Weg / Zeit"

Es gibt auch eine Formal für die Beschleunigung:

v = a * t "Geschwindkeit = Beschleunigung * Zeit"

Weiterhin ergibt s = 0,5 * a *(t^2) umgestellt nach a: a = 2*s / (t^2)

Eingesetzt in v = a *t sieht die Formel für die Gechwindkeit so aus:

v = 2*s / t

Hoffe ich hab mich da jetzt nicht vertan xD

Edit:

Auf deine bezogen hieße es dann meine ich so:

Code:
speedFactorX = 2 * gesammtSchrittwWeite / schrittDauerBisZurNächstenÄnderung;

und

Code:
schrittWeiteAktuellX = restStrreckeX - ( 0,5 * speedFactorX  * restLaufZeitDesSchrittes);
 
Zuletzt bearbeitet:
@ Honnie, nicht ganz....

v = s * t, stimmt schon (falls das " dahinter keine exp. 2 bedeuten sollte)

aber es wäre dann schon

PHP:
speedFactorX = gesammtSchrittwWeite / schrittDauerBisZurNächstenÄnderung;

den Namen SpeedFactorX habe ich gewählt da ich hier mit millisekunden und positionsangaben arbeite ich für die spielfiguren allerdings Die geschwindigkeit gemessen an Positionspunkten pro Minute rechne... demzufolge wäre die Geschwindigket der Spielfigur

PHP:
Geschwindigkeit pos/min = (gesammtSchrittwWeite / schrittDauerBisZurNächstenÄnderung) * 1000 * 60;

da ich ja nun jedochhauptsächlich ein problem bei der Interpolation der vom Server gesendeten Daten habe (hatte) war ich das problem so angegangen das ich

PHP:
üblicheTeitZwischenZweiServerNachrichten *= 1.5

Rechne und dann einfach anhand des sich daraus ergebenden SpeedFactors und der Verbleibenden restLaufZeit die Wegstrecke berechnet habe die noch möglich in dieser bei diesem speedFactor sich zu bewegen, das hatte ich von der aktuellVerbleibendenStrecke abgezogen und somit eine Aktuelle schritweite errechnet. Dies sowohl für X als auch für Y.

Mein Problem war/ist nun das, der Server trotz voreingestellter 150ms zeitdauer (ich benutze den quartz scheduller) zwischen 93 und 203 ms verstreichen lässt.

Was ich dabei nicht bedacht hatte, war das ich beim "setzen" der neuen restLaufZeit und dem nachfolgenden Inmterpolieren asynchron vorgehe und so für den allerersten schritt einer jeden Serverübertragung eine restLaufZeit herauskommt die 0 ist, womit sich auch für den ersten Schritt eine Strecke 0 ergibt.

Ich errechne das ganze nun so das ich das ZeitIntervall zwischen den Interpolationen * dem SpeedFactor nehme, so laufe ich zwar Gefahr das die Spielfigur "über das Ziel hinaus schiesst", jedoch erhalte ich eine gleichmässige Geschwindigkeit währen eines GesammtSchrittes

Die Unterschiedlichen Geschwindigkeiten bei den verschiedenen GesammtSchritten die mir serverseitig übermittelt werden müssten nun noch ausgeglichen werden, was sich vermutlich am einfachsten über einen "MittelwertBuffer" realisieren lässt also

PHP:
bufferWert = (aktuellerSpeed  + 9 * bufferWert) / 10;
aktuellerSpeed = bufferWert;

Im Moment läuft es soweit recht flüssig, es endsteht nurnoch ein leichtes "ruckeln" was aber mit besagter unterschiedlicher GeschammtSchrittGeschwindigkeit zu tun hat...


aber nun genug geschwafelt... ich bin da wie Columbo

Eine Frage hätte ich da noch...

bei mir sinds jedoch 2...

1) Gibt es neben besagtem "MittelwertBuffer" eine bessere Möglichkeit die abweichung von immerhin über 100% zwischen min und max wert des Server Zeit Intervalls auszugleichen?

2) Ich benutze Serverseitig den Red5 Media Server in welchem schon der Quartz Scheduller Implementiert ist, da dieser ja nun die meisten sorgen bereitet mit seinen Unterschiedlichen Zeitintervallen...
* liegt das hier "vermutlich" an der Implementierung des Quartz schedullers in Red5?
* liegt es am QuartzScheduller selbst?
* wäre mit einer eigenen Implementierung das Problem "vermutlich" beseitigt?
* Ist der Quartz Scheduller nicht eh ein wenig überladen, ich brauche ja eigentlich "nur" einen funktionierednen Timer mit einem !genauen! ZeitIntervall, nicht eines welches 10 Worker Startet die Asynchron laufen, weil hier hat workerX auf workerY immer genau das selbe interval wie im voran gegangenen...

falls mir da einer noch was zu sagen kann weil bei java hab ich absolut keinen plan nur jedesmal wenn ich nach java und timer google lande ich irgendwo bei Quartz... was mich nach den beschriebenen beobachtungen nun ziemlich wundert zumal die vorgänger version mit werten unter 500 ms gar nicht klar kam, entweder heap space oder er kam "aus dem tritt".

sorry 4 the long text

mfg
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück