Seite 1 von 1

[gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 11:28
von joggel
Guten Morgen,

da ich zur Zeit einen scroll-down 2D-SpaceShooter programmiere, stehe ich gerade vor einem mathematischen Problem.

Die feindlichen Raumschiffe sollen sich von Oben nach Unten bewegen, jedoch nicht einfach nur "runter fallen" sondern einen Pfad passieren der von Links nach Rechts und wieder zurück verläuft.
Also quasi so in der Art:
Unbenannt.png
Ich möchte also die Position auf dem Pfad zu einem ganz bestimmten Zeitpunkt errechnen.
Sobald das Raumschiff den Bildschirm "betritt" beginnt die Messung der Zeit!
Achso, die Geschwindigkeit mit der sich das Raumschiff bewegt ist natürlich auch gegeben: v ^^

Ich habe die Vermutung, dass man das mit hilfe von Splines realisieren kann, denke aber fast, dass das zu umständlich ist.

Gruß

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 12:06
von Schrompf
Ka Thema. Von oben nach unten geht's linear, also ist y = t * v_vertikal. Und für x generieren wir einen doppelten Sägezahn in der Form:

x = fmod( t * querfrequenz ); // Ergibt einen einfachen Sägezahn, der von links nach rechts linear steigt und dann zurückspringt
x = abs( 2.0f * fmod( t * querfrequenz ) - 1.0f); // Ergibt dann einen doppelten Sägezahn, der linear von links nach rechts und zurück verläuft.

Beide Werte jeweils skalieren, bis sie den von Dir gewünschten Bildschirmbereich abdecken.

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 12:07
von Artificial Mind
Mit Splines bekommst du hauptsächlich eine Pfad, der 'smooth' ist.

Für den linearen Fall kannst du das einfach so machen:
t_start: Anfangszeit
v: Geschwindigkeit
t_curr: Aktuelle Zeit

Aktuelle Strecke
s = v * (t_curr - t_start)

Code: Alles auswählen

vector<Point> Points = ...;
int currP = 0;
while ( s > 0 ) {
  float dis = distance(Points[currP], Points[currP + 1]);
  if ( s < dis )
    return lerp(Points[currP], Points[currP + 1], s / dis);
  s -= dis;
  ++currP;
}
Das wird auch vermutlich schnell genug sein, ansonsten kann man da auch mit binärer Suche tricksen.
Natürlich ist das eher Pseudocode und es fehlen noch die Randfälle.

EDIT: Schrompf war schneller :D

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 12:11
von joggel
Das sieht alles sehr brauchbar und vernünftig aus.
Ich danke den Beteiligten :)

schönes Wochenende...

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 16:17
von joggel
Habe da noch ein paar Fragen...

@Schrompf:
Was meinst Du mit "querfrequenz"?

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 16:28
von Schrompf
Eine Frequenz ist immer eine Anzahl Auftreten pro Sekunde. Die Querfrequenz hier gibt also an, wie oft pro Sekunde einmal komplett hin und wieder zurück bewegt wird. Du solltest da also sowas wie 1/20 oder sowas einsetzen, damit der Weg dann 20s braucht.

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 16:36
von joggel
Achso, also wie oft (in der sekunde) die richtung umschlägt.
Mh... finde ich irgendwie nicht sehr schön.
Vorallem, es wird nicht unbedingt eine regelmäßige Bewegung. Der Anstieg von P1 zu P2 kann einen anderen haben, als bspw P3 zu P4.
Ich will also die Möglichkeit haben, dass ich ganz unregelmäßige Passpunkte übergebe und dass sich dieses Raumschiff dann mit konstanter Geschwindigkeit zwischen diesen bewegt.

Ich schaue mir mal die Variante von Artifacial Mind an...

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 22:01
von Artificial Mind
Meine Version funktioniert für beliebige Punktlisten. Ich denke auch, dass das kein Performanceproblem gibt. Außer vielleicht bei 100.000 Raumschiffen mit jeweils 1000 Waypoints.

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 22:30
von joggel
Prima!!
Da werde ich mich mal an diese Implementation machen, allerdings scheint diese lerp-Funktion eine DirectX-spezifische Funktion zu sein... aber das sollte ja nicht das Problem sein...

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 22:45
von dot
Hier bitte: lerp(a, b, t) = (1.0f - t) * a + t * b ;)

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 22.02.2014, 22:48
von joggel
dot hat geschrieben:Hier bitte: lerp(a, b, t) = (1.0f - t) * a + t * b ;)
:) ... danke-danke!!
Da muss ich ja fast gar nicht mehr selber nachdenken^^

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Verfasst: 25.02.2014, 10:14
von joggel
Es Funktioniert!!!!
-ein Traum- :D

Re: [gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpu

Verfasst: 25.02.2014, 10:25
von Artificial Mind
Kurzer Nachtrag: lerp steht für linear interpolate(d) ;)

Re: [gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpu

Verfasst: 25.02.2014, 10:26
von joggel
Artificial Mind hat geschrieben:Kurzer Nachtrag: lerp steht für linear interpolate(d) ;)
Jopp, haben meine Internetrecherchen auch ergeben ;)