AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Geschwindigkeit bei bewegten Objekten
Thema durchsuchen
Ansicht
Themen-Optionen

Geschwindigkeit bei bewegten Objekten

Ein Thema von Antigo · begonnen am 8. Aug 2006 · letzter Beitrag vom 8. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#11

Re: Geschwindigkeit bei bewegten Objekten

  Alt 8. Aug 2006, 14:17
zu der Wurfparabel: Ich würde gern flexibler bleiben. WIe gesagt möchte ich den Ball auch gerne gegen eine Wand fliegen bzw. dort abprallen lassen. Das haut mit der Wurparabel natürlich nicht hin. Bei Vektoren muss ich da z.B. nur die x1 Komponente umdrehen.

zu dem Time Based Movement: Ich habe schon verstanden wie das funktionieren soll. Mein Problem ist auch nicht die Bewegung, sondern wie gesagt die Vektoranpassung.

Wenn ich jetzt eine Framerate von 20FPS habe, wird der Timer 20 mal in der Sekunde aufgerufen. Die Pixelverschiebung kann ich durch das Time based Movement leicht anpassen, indem halt nur einen Bruchteil von pixeln gehe. Hier ist nicht das Problem.
Habe ich nun 20 FPS, wende ich auch folgendes 20 mal pro Sekunde an:
Delphi-Quellcode:
  Ball.vektor.addieren(Gravitation);
  Ball.vektor.addieren(wind);
Habe ich jetzt aber nur 10 FPS, wird der Vektor nur 10 mal pro Sekunde angepasst, und die Flugbahn sieht anders aus. Genau das muss ich jetzt irgendwie kompensieren. Aber ich hab absolut keinen Ahnung wie...

edit: Und dann kommt noch das Geschwindigkeitsproblem hinzu. Ich will abhängig von der Länge des Vektors des Balles natürlich auch eine größre Strecke in der selben Zeit zurücklegen. Ohne Time Based Movement habe ich wie gesagt einfach die Länge des Vektors genommen, und bin soviele Pixel auf einmal gegangen. Was zwar nicht schön aussah, aber geklappt hat....
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#12

Re: Geschwindigkeit bei bewegten Objekten

  Alt 8. Aug 2006, 14:53
Zitat von Antigo:
zu der Wurfparabel: Ich würde gern flexibler bleiben. WIe gesagt möchte ich den Ball auch gerne gegen eine Wand fliegen bzw. dort abprallen lassen. Das haut mit der Wurparabel natürlich nicht hin. Bei Vektoren muss ich da z.B. nur die x1 Komponente umdrehen.
Wie ich meinte: Du berechnest bei der Wurfparabel, obs ne Kollision gibt. Die Wand musst du natuerlich in die Kollisionsberechnung miteinfliessen lassen. Du speicherst dir dafuer den Kollisions(zeit)punkt, und wenn das Objekt diesen erreicht hast, handelst du dementsprechend, indem du bspw. die x-Komponente negierst oder einen physikalisch gesehen etwas flexibleren Algorithmus zum berechnen des Austrittsvektors durchfuehrst. Der Austrittsvektor ist dein neuer Vektor, mit dem du die Wurfparabel berechnest und die naechste Kollision berechnest.
Welchen Vorteil das hat? Ein Beispiel:
du hast eine Kugel, und 2 Waende, die (relativ) weit ausseinanderstehen. Nehmen wir an, die Kugel braucht 200 Takte zu je ein paar ms, um von einer Wand zur anderen zu gelangen.
Wenn du nun bei jedem Takt auf Kollision pruefst, pruefst du in einem Flug 200mal auf Kollisionen, wobei nur einmal eine Kollision auftritt. D.h. nur 0.5% der Berechnungen waeren wirklich notwendig gewesen.
Wenn du die Kollision mit der Parabel berechnest, so berechnest du in einem Flug einmal, um zu wissen, wo die Kollision auftritt. D.h. bei der anderen Variante rechnest du 200mal so oft, mit dem selben Ergebnis. Zudem loest die Wurfparabel auch das zweite Problem:
Zitat von Antigo:
zu dem Time Based Movement: Ich habe schon verstanden wie das funktionieren soll. Mein Problem ist auch nicht die Bewegung, sondern wie gesagt die Vektoranpassung.

Wenn ich jetzt eine Framerate von 20FPS habe, wird der Timer 20 mal in der Sekunde aufgerufen. Die Pixelverschiebung kann ich durch das Time based Movement leicht anpassen, indem halt nur einen Bruchteil von pixeln gehe. Hier ist nicht das Problem.
Habe ich nun 20 FPS, wende ich auch folgendes 20 mal pro Sekunde an:
Delphi-Quellcode:
Ball.vektor.addieren(Gravitation);
Ball.vektor.addieren(wind);
Habe ich jetzt aber nur 10 FPS, wird der Vektor nur 10 mal pro Sekunde angepasst, und die Flugbahn sieht anders aus. Genau das muss ich jetzt irgendwie kompensieren. Aber ich hab absolut keinen Ahnung wie...
edit: Und dann kommt noch das Geschwindigkeitsproblem hinzu. Ich will abhängig von der Länge des Vektors des Balles natürlich auch eine größre Strecke in der selben Zeit zurücklegen. Ohne Time Based Movement habe ich wie gesagt einfach die Länge des Vektors genommen, und bin soviele Pixel auf einmal gegangen. Was zwar nicht schön aussah, aber geklappt hat....
Ok, das Problem ist: durch unterschiedliche Zeitdifferenzen gibt es leicht abweichende Flugbahnen, da du diese immer nur zu bestimmten Punkten berechnest, und der naechste Punkt vom vorherigen Abhaengig ist. Diese Abhaengigkeit bringt dir die Abweichung in der Flugbahn.
Mit der Parabel hast du keine Abhaengigkeit vom zuvor berechneten Punkt. Du hast die entsprechende Parabelfunktion, mit der du berechnen kannst, zu welchem Zeitpunkt sich das Objekt wo befindet. Die Parabel ist dabei natuerlich abhaengig von der Geschwindigkeit v0 des Vektors. Wenn du die Parabel zusammen mit dem Timebased Movement verwendest, kriegst du, was du brauchst: Du speicherst dir lediglich nicht die Zeitdifferenz zum vorherigen Tick, sondern seit der letzten Parabel-neuberechnung. Die Position des Objektes erhaelst du dann, indem du einfach in die Parabelfunktion die vergangene Zeit einsetzt.
Damit hast du:
  • Eine Kollisionserkennung, die durchgefuerht wird, wie oft es noetig ist (naemlich genau einmal bis zwischen einer kollision und der naechsten)
  • Timebased Movement ohne den Nachteil der Abhaengigkeit der zuvor berechnenen Position
Also eine doch ganz akzeptable Loesung

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#13

Re: Geschwindigkeit bei bewegten Objekten

  Alt 8. Aug 2006, 17:44
genial es funktioniert einwandfrei. Vielen Dank für deine Hilfe
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#14

Re: Geschwindigkeit bei bewegten Objekten

  Alt 8. Aug 2006, 18:00
EIn Problem habe ich jetzt allerdings noch:
Der Ball trifft auf den Boden auf. Ich weiss zwar zu welchem Zeitpunkt das geschieht, und daher auch wo, allerdings kenn ich nicht den Winkel in dem er auftritt. Daher kann ich nicht nach guter alter EInfallswinkel gleich Ausfallswinkel Manier den Ball weiterhopsen lassen. Gut den Winkel könnte ich herausfinden, indem ich die Poisition des Balles kurz vor dem Aufprall mit der während des aufpralles vergleiche, und über die Steigung dann an den Winkel herankomme. Relativ kompliziert, aber dann weiss ich nicht mit welcher Geschwindigkeit ich ihn wieder losschicken soll.
Hat da jemand eine Idee?
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz