[gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
[gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
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: 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ß
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: 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ß
Zuletzt geändert von joggel am 25.02.2014, 10:14, insgesamt 1-mal geändert.
- Schrompf
- Moderator
- Beiträge: 5114
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
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.
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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
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)
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
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;
}
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
Das sieht alles sehr brauchbar und vernünftig aus.
Ich danke den Beteiligten :)
schönes Wochenende...
Ich danke den Beteiligten :)
schönes Wochenende...
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
Habe da noch ein paar Fragen...
@Schrompf:
Was meinst Du mit "querfrequenz"?
@Schrompf:
Was meinst Du mit "querfrequenz"?
- Schrompf
- Moderator
- Beiträge: 5114
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
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...
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...
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
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
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...
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...
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
Hier bitte: lerp(a, b, t) = (1.0f - t) * a + t * b ;)
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
:) ... danke-danke!!dot hat geschrieben:Hier bitte: lerp(a, b, t) = (1.0f - t) * a + t * b ;)
Da muss ich ja fast gar nicht mehr selber nachdenken^^
Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt
Es Funktioniert!!!!
-ein Traum- :D
-ein Traum- :D
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: [gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpu
Kurzer Nachtrag: lerp steht für linear interpolate(d) ;)
Re: [gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpu
Jopp, haben meine Internetrecherchen auch ergeben ;)Artificial Mind hat geschrieben:Kurzer Nachtrag: lerp steht für linear interpolate(d) ;)