![]() |
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:
das klappt alles soweit gut doch wie Schaffe ich es die Schwerkraft einzubauen?
// 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; danke im vorraus ;-) mfg |
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.
|
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? |
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. |
Re: Andorra 2D Physik Problem
Also wenns wirklich nur ein bisschen Gravitation sein soll, geht das so:
Delphi-Quellcode:
Was da aber noch nicht mit drin ist, ist die Sache mit dem schneller fliegen <=> mehr Auftrieb
// 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; |
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? |
Re: Andorra 2D Physik Problem
Also ich würde da so rangehen:
1. Definiere einen record:
Delphi-Quellcode:
Damit können wir dann rechnen ;)
TVector = record
X, Y: Double; end; 2. Schreibe Methoden zum Rechnen:
Delphi-Quellcode:
Und dann kommt der interessante Teil: Das Flugzeug :stupid:
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; 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:
Und dann in der Step-Methode (oder wie die heißt, die mit dem TimeGap eben)
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ß!
Delphi-Quellcode:
So in etwa. Man muss wahrscheinlich noch an den Konstanten herumspielen, damit das funktioniert ...
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 ;-) P.S.: Es würde mich wundern, wenn du alles verstanden hast, als frag' ruhig ;) |
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. |
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:
Dann sollte es besser gehen
X := Round(Position.X);
Y := Round(Screen.Height - Position.Y); // Screen.Height bei Vollbild, sonst eben die Höhe des Anzeigebereichs |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz