Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Andorra 2D Physik Problem (https://www.delphipraxis.net/138446-andorra-2d-physik-problem.html)

sabbert 10. Aug 2009 16:41


Andorra 2D Physik Problem
 
Hallo zusammen,

Bin dabei so eine Art Fun Flugzeug Spiel zu programmieren. Soweit klappt alles mit dem fliegen,

zu dem Problem, so mehr "Gas" ich gebe desto schneller wird das Flugzeug, ist ja klar, doch wenn das "Gas" auf 0 steht,

also wenn ich bremse steht es ja in der Luft, bewegt sich das Flugzeug nicht mehr nach vorn, weil ich ja keine GegenFunktion

programmiert habe, die die Schwerkraft simuliert.

Zurzeit meine Funktion für die Bewegung:
Delphi-Quellcode:
  // Speed = 0 ; Gas geben erhöht, Bremsen erniedrigt dessen Wert, erhöht sich bis max. 150 ; min. 0
  FXSpeed := round(cos(PI/180*Angle)*Speed);
  FYSpeed := round(sin(PI/180*Angle)*Speed);
 
  X := X + FXSpeed * TimeGap;
  Y := Y + FYSpeed * TimeGap;
das klappt alles soweit gut doch wie Schaffe ich es die Schwerkraft einzubauen?

danke im vorraus ;-)

mfg

Florian H 10. Aug 2009 17:08

Re: Andorra 2D Physik Problem
 
Da die Schwerkraft immer gleich stark nach unten beschleunigt, kannst du doch einfach von der Y-Position in jedem Schritt einen gewissen Wert abziehen, sodass das Flugzeug also sinkt, wenn es bisher genau horizontal geflogen wäre. Ggf kannst du diese Sinkgeschwindigkeit auch umgekehrt proportional zur Geschwindigkeit machen: Ist das Flugzeug superschnell, sinkt es nicht, bleibt es fast stehen, plumst es vom Himmel.

jfheins 10. Aug 2009 17:20

Re: Andorra 2D Physik Problem
 
Ich würde folgendes Vorschlagen:

1. Du überlagst dir, welche Kräfte auf das Flugzeug wirken. Hier würde ich die Luftreibung, die Auftriebskraft, die Schwerkraft und den Schub der Triebwerke ansetzen.

2. Wovon hängen die Kräfte ab? Luftreibung kann schnell kompliziert werden, nehmen wir mal an, die Kraft ist proportional zum Quadrat der Geschwindigkeit. Auftrieb ebenfalls. Schwerkraft und Schub sind unabhängig bzw. konstant.

Daraus kann man dann eine realistische Bewegung simulieren.

So - bevor ich weitermache, ein paar Fragen:

Wie sieht dein Programm aus? Fliegt das Flugzeug z.B. immer nach Rechts und man kann es nach oben und unten lenken? Oder guckt man von oben drauf?

sabbert 10. Aug 2009 17:45

Re: Andorra 2D Physik Problem
 
Also da ich nicht sehr erfahren bin habe ich mich schon wie erwähnt an ein Fun - Flugezugspiel probiert.

Also es soll nicht sehr realistisch sein.

Es wird von der seite betrachtet und man steuert mit den Pfeiltasten.

Also Gas geben,bremsen,rechts-,links drehen.

Man kann damit nach oben und unten fliegen, also es wird nicht von oben betrachtet.

Es werden eigentlich keine Kräfte beachtet. Luftreibung existiert nicht.

Wollte deswegen nur die Schwerkraft einbauen.

Also sobald die Geschwindigkeit sich auf null befindet ,dass Flugzeug sinkt.

jfheins 10. Aug 2009 18:25

Re: Andorra 2D Physik Problem
 
Also wenns wirklich nur ein bisschen Gravitation sein soll, geht das so:

Delphi-Quellcode:
// Speed = 0 ; Gas geben erhöht, Bremsen erniedrigt dessen Wert, erhöht sich bis max. 150 ; min. 0 
  FXSpeed := round(cos(PI/180*Angle)*Speed);
  FYSpeed := round(sin(PI/180*Angle)*Speed + 0.5 * TimeGap);
 

  X := X + FXSpeed * TimeGap;
  Y := Y + FYSpeed * TimeGap;
Was da aber noch nicht mit drin ist, ist die Sache mit dem schneller fliegen <=> mehr Auftrieb

sabbert 10. Aug 2009 18:42

Re: Andorra 2D Physik Problem
 
ok das ist schonmal eine gute Antwort ;-)

Wie würde das denn Aussehen mit schneller fliegen <=> mehr Auftrieb?

Könntest du mir das näher erläutern oder sogar ein paar Beispiele nennen?

jfheins 10. Aug 2009 21:59

Re: Andorra 2D Physik Problem
 
Also ich würde da so rangehen:

1. Definiere einen record:
Delphi-Quellcode:
TVector = record
X, Y: Double;
end;
Damit können wir dann rechnen ;)

2. Schreibe Methoden zum Rechnen:
Delphi-Quellcode:
function Add(a, b:TVector):TVector;
begin
Result.X := a.X + b.X;
Result.Y := a.Y + b.Y;
end;

function Mult(a:TVector; b: Double):TVector;
begin
Result.X := a.X * b;
Result.Y := a.Y * b;
end;

function Drehen(betrag, phi: Double):TVector;
begin
Result.X := betrag * cos(phi);
Result.Y := betrag * sin(phi);
end;
Und dann kommt der interessante Teil: Das Flugzeug :stupid:

Benötigte Variablen:

Position, Velocity, Acceleration, F_S, F_R, F_A : TVector;
sowie
Angle, Masse, Grav, Schub, Reibung, Auftrieb: Double;

Am Anfang initialisieren wir das ganze:
Delphi-Quellcode:
Schub := 20; // Das was du bis jetzt als Speed hast ;-)

Position := // Deine Anfangsposition
Grav := -3; // eigentlich -9.81 aber das ist so schnell
Masse := 1000; // Musste mal ausprobieren
Angle := 0; // Der Winkel ist erstmal im Bogenmaß!
Und dann in der Step-Methode (oder wie die heißt, die mit dem TimeGap eben)
Delphi-Quellcode:
var
  F_res:TVector;
begin

Reibung := -0.1 * Velocity.X * Velocity.X * Velocity.Y * Velocity.Y; // Reibung prop. zum Quadrat der Geschw.
Auftrieb := 0.2 * Velocity.X * Velocity.X * Velocity.Y * Velocity.Y; // Auftrieb ebenfalls.

F_S := Drehen(Schub, Angle);
F_R := Drehen(Reibung, Angle);
F_A := Drehen(Auftrieb, Angle + Pi/2);

Acceleration := Mult(Add(F_A, Add(F_S, F_R)), 1/Masse); // a = F/m
Acceleration.Y := Acceleration.Y + Grav;

Velocity := Add(Velocity, Mult(Acceleration, TimeGap));

Position := Add(Position, Add(Mult(Velocity, TimeGap), Mult(Acceleration, -0.5*TimeGap*TimeGap)))
// s := s + vt - 1/2*a*t^2

// Jetzt hast du in Position.X und Position.Y deine Koordinaten ;-)
So in etwa. Man muss wahrscheinlich noch an den Konstanten herumspielen, damit das funktioniert ...

P.S.: Es würde mich wundern, wenn du alles verstanden hast, als frag' ruhig ;)

sabbert 10. Aug 2009 22:22

Re: Andorra 2D Physik Problem
 
Also habe alles mir angeschaut und versucht einzubinden, bloß ist jetzt mein flugzeug jetzt nur oben links in der Ecke hm^^

Hab da wohl etwas falsch verstanden?!

Habe auch an den Werten rumgespielt.

Edit:

Ok jetzt passiert schon etwas^^

Aber Flugzeug steigt von der Anfanbgsposition nur langsam nach oben...

Sollte aber nach unten, wegen der Schwerkraft.

jfheins 11. Aug 2009 08:54

Re: Andorra 2D Physik Problem
 
Ja, sorry ...

Das Koordinatensystem, was ich benutzt habe, ist mit der Y-Achse nach oben und X-Achse nach rechts.

Mach ganz am Ende sowas:

Delphi-Quellcode:
X := Round(Position.X);
Y := Round(Screen.Height - Position.Y); // Screen.Height bei Vollbild, sonst eben die Höhe des Anzeigebereichs
Dann sollte es besser gehen


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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