Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ballflug bei Tennisspiel (https://www.delphipraxis.net/70303-ballflug-bei-tennisspiel.html)

Yheeky 28. Mai 2006 12:36


Ballflug bei Tennisspiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich bin gerade dabei ein kleines Tennisspiel zu programmieren und stehe vor dem ersten Problem. Das Spiel soll in einer 2D-Perspektive programmiert werden. Nun bin ich gerade dabei den Ballflug zu realisieren. Eine einfache 2D-Verschiebung (im Bild die rote Linie) funktioniert da ja nicht. Meine Frage ist nun, wie ich die im Bild blau markierte Linie anhand Start- und Zielpunkt berechnet bekomme.
Wäre nett, wenn mir da jemand helfen könne. Danke.

Airblader 28. Mai 2006 12:41

Re: Ballflug bei Tennisspiel
 
Die Perspektive, die du da hast, ist aber nicht wirklich 2D, oder? ;)
Das einfachste dürfte wohl sein, wenn du schlichtweg die 3. Dimension mit reinnimmst und die Höhe mitberechnest.

Eine wirkliche 2D-Perspektive wäre, wenn du direkt von oben drauf schaust. :)

air

Yheeky 28. Mai 2006 13:44

Re: Ballflug bei Tennisspiel
 
Die Perspektive ist nicht 2D aber trotzdem wird das Spiel 2D gezeichnet. Ist ein ähnliches Prinzip wie bei einer ISO-Engine.
Für eine dritte Dimension muss ich ja ein 3D-Objekt erstellen. Möchte aber wenn´s geht bei 2D bleiben.
Vielleicht kennt jemand Spiele wie Smash Court Tennis auf dem SNES früher. Das war auch komplett 2D...also möglich scheint es ja zu sein ;)

JasonDX 28. Mai 2006 13:51

Re: Ballflug bei Tennisspiel
 
Ich sehe da eine Moeglichkeit:
Du zeichnest alles 2D, die Ballflugberechnung laeuft im Hintergrund aber in 3D. Sprich: Der Ball erhaelt eine z-Koordinate. Abhaengig der 3D-Position des Balles, und des Blickwinkels kannst du dir dann die Position von 3D auf 2D umrechnen, und damit dann zeichnen.
Einen anderen Ausweg, der das halbwegs elegant und flexibel erledigt seh ich im Moment nicht...

greetz
Mike

Yheeky 28. Mai 2006 14:03

Re: Ballflug bei Tennisspiel
 
Zitat:

Zitat von JasonDX
[...] die Ballflugberechnung laeuft im Hintergrund aber in 3D. [...]

Ja stimmt, das muss ich auf jeden Fall so machen. Der Ball braucht ja noch einen Schatten und deswegen muss ich auch die Höhe des Balles wissen. Danke für diesen Ansatz.

Zitat:

Zitat von JasonDX
Der Ball erhaelt eine z-Koordinate. Abhaengig der 3D-Position des Balles, und des Blickwinkels kannst du dir dann die Position von 3D auf 2D umrechnen, und damit dann zeichnen.

Das wäre nun das Problem - die Umrechnung. Hat da jemand Erfahrung mit?

DGL-luke 28. Mai 2006 14:46

Re: Ballflug bei Tennisspiel
 
weißt du, wie man eine parabelförmige flugbahn berechnet? solltest du im inet überall finden.

Zur Umrechnung würde ich einfach zur y-koordinate die z-Koordinate mal einen bestimmten faktor dazurechnen... einfach ausprobieren, was für ein faktor da am besten passt.

ansonsten kann man das auch sicher exakt berechnen... irgendwas trinagulares oder so... :gruebel:

JasonDX 28. Mai 2006 15:07

Re: Ballflug bei Tennisspiel
 
Zitat:

Zitat von DGL-luke
ansonsten kann man das auch sicher exakt berechnen... irgendwas trinagulares oder so... :gruebel:

Ja, sowas in die Richtung. Ich hab mir mal schnell ein Blatt Papier unter die Finger gekrallt und was ueberlegt....
Im Eigentlichen reicht dir diese Formel:
Code:
BallPos - (EyePos - BallPos) * (BallPos.Z / (EyePos.Z - BallPos.Z));
(EyePos und BallPos sind Vektoren, die die X, Y und Z-Position von Ball und Auge beinhalten ;))
Ok, ein bisschen zur Erklaerung: Stell dir einen Strahl vor, der bei deinem Auge startet und durch den Ball geht. Dort, wo der Strahl deinen "Tennisplatz" trifft, musst du den Ball zeichnen. Das zu berechnen ist am end nur Geometrie. (Falls ich dir des genauer erklaeren soll meld dich einfach ;)) Das Ergebnis ist wiederum ein 3D-Vektor. Allerdings ist dessen Z-Komponente immer 0 (bzw. sollte sie zumindest sein ^^), d.h. den kann man dann fast schon als 2D-Vektor betrachten, denn in X und Y stehen die Koordinaten, wo du den Ball zeichnen musst :)
Uebrigens: Das Prinzip funktioniert auch mit deinem Schatten: Die Sonne ist der Ausgangspunkt deines Strahles, der wieder durch den Ball verlaeuft. Dort, wo dieser Strahl den Boden trifft, muss der Schatten hin. Is doch einfach, oder? :D

greetz
Mike

Yheeky 28. Mai 2006 19:46

Re: Ballflug bei Tennisspiel
 
Zitat:

Zitat von JasonDX
Ich hab mir mal schnell ein Blatt Papier unter die Finger gekrallt und was ueberlegt....
Im Eigentlichen reicht dir diese Formel:
Code:
BallPos - (EyePos - BallPos) * (BallPos.Z / (EyePos.Z - BallPos.Z));
(EyePos und BallPos sind Vektoren, die die X, Y und Z-Position von Ball und Auge beinhalten ;))

Cool, dass du dir dafür soviel Zeit genommen hast - danke :)

Also laut deiner Erklärung wäre ja doch die rote Linie die Richtige, aber wie man die blaue hinbekommt, ist ja noch offen. Oder meintest du das irgendwie? Das "BallPos" im Anfang deiner Gleichung benötigt ja auch noch einen bestimmten Vektoren oder?

Zitat:

Zitat von JasonDX
Uebrigens: Das Prinzip funktioniert auch mit deinem Schatten: Die Sonne ist der Ausgangspunkt deines Strahles, der wieder durch den Ball verlaeuft. Dort, wo dieser Strahl den Boden trifft, muss der Schatten hin. Is doch einfach, oder? :D

Yep, das verstehe ich auch soweit :) Jedoch ist das mit dem Ballflug an sich nicht so einfach, vor allem auch, wenn man unterschiedliche Geschwindigkeiten hinbekommen möchte.

Yheeky 29. Mai 2006 00:13

Re: Ballflug bei Tennisspiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich bin inzwischen schon etwas weiter.
Ich habe mir mal die Mühe gemacht und meine Idee aufgezeichnet:

Bild nun im Anhang

Die lila farbene Linie zeigt den Verlauf des Schattens an, der auf einer Geraden verläuft. Nimmt man die Hälfte dieser Linie (hier die gelbe Linie) so kann man erkennen, dass es sich bei der blauen Linie um eine Parabel handelt. Die beiden schwarzen Eckpunkte sind die Nullstellen. Beispiel hierzu:
Die lila farbene Gerade ist 300 Pixel lang. Rechnet man von der Mitte aus, handelt es sich um die Nullstellen x01=-150 und x02=+150.

So, und nun bräuchte ich mal wieder eure Hilfe. Was ich weiss...die Parabel hat in meinem Fall die Formel y=-x² und ist nach unten geöffnet. Was ich nicht weiss, ist, wie ich die Parabel zeichnen soll. Welchen Punkt soll ich als Ursprung nehmen? Meine 2.Frage wäre: Wie kann ich anhand der Nullstellen nun die Funktion herausfinden?

fkerber 29. Mai 2006 00:18

Re: Ballflug bei Tennisspiel
 
Hi!

Könntest du das Bild den Modem-Usern zum Gefallen und vor allem, um späteren Dead-Links vorzubeugen, anhängen? Danke.


Ciao Frederic

JasonDX 29. Mai 2006 00:37

Re: Ballflug bei Tennisspiel
 
Zitat:

Zitat von Yheeky
So, und nun bräuchte ich mal wieder eure Hilfe. Was ich weiss...die Parabel hat in meinem Fall die Formel y=-x² und ist nach unten geöffnet. Was ich nicht weiss, ist, wie ich die Parabel zeichnen soll. Welchen Punkt soll ich als Ursprung nehmen? Meine 2.Frage wäre: Wie kann ich anhand der Nullstellen nun die Funktion herausfinden?

hmm, die Parabel als Konstant anzunehmen halte ich fuer nicht die allerbeste Idee. erstens macht das das Game ziemlich statisch und langweilig, und zweitens siehts ned ganz so doll aus. IMO.
Warum ned live-time-Berechnung der Parabel? A bissl Physik... ;)
Folgende Idee: Der Ball hat jetzt ned nur ne 3D-Position, sondern auch eine 3D-Geschwindigkeit :stupid:
In die Richtung, in die der Geschwindigkeitsvektor zeigt, wird der Ball Stueck fuer Stueck bewegt. Dabei wird a) der Ball a bissl langsamer (Luftreibung), was aber vernachlaessigbar ist, und b) durch die Gravitation Richtung Erde gezogen. Wenn er am Boden auftrifft, prallt er ab und kann sonstnoch was machen..., und wenn er von einem Spieler geschlagen wird, aendert sich wieder seine Richtung, je nach dem, wohin er den Ball spielen will.
So, was hat man von dem Spass? Man kann sagen, wie weit und in welche Richtung man schiessen kann D.h. der Ball kann ins aus, ins Netz, 2x am Boden aufprallen ect. Macht das Game noch interessanter, die Parabel-Frage waere geloest, und eine Anbindung an die oben genannten Moeglichkeiten waeren auch kein Problem mehr. Ausserdem wuerde der Schatten dann auch nicht in ner Geraden Linie verlaufen, was dem ganzen etwas mehr Realismus verpasst ;)

greetz
Mike

Yheeky 29. Mai 2006 01:17

Re: Ballflug bei Tennisspiel
 
Zitat:

Zitat von JasonDX
hmm, die Parabel als Konstant anzunehmen halte ich fuer nicht die allerbeste Idee. erstens macht das das Game ziemlich statisch und langweilig, und zweitens siehts ned ganz so doll aus. IMO.
Warum ned live-time-Berechnung der Parabel? A bissl Physik... ;)
Folgende Idee: Der Ball hat jetzt ned nur ne 3D-Position, sondern auch eine 3D-Geschwindigkeit :stupid:
In die Richtung, in die der Geschwindigkeitsvektor zeigt, wird der Ball Stueck fuer Stueck bewegt. Dabei wird a) der Ball a bissl langsamer (Luftreibung), was aber vernachlaessigbar ist, und b) durch die Gravitation Richtung Erde gezogen. Wenn er am Boden auftrifft, prallt er ab und kann sonstnoch was machen..., und wenn er von einem Spieler geschlagen wird, aendert sich wieder seine Richtung, je nach dem, wohin er den Ball spielen will.
So, was hat man von dem Spass? Man kann sagen, wie weit und in welche Richtung man schiessen kann D.h. der Ball kann ins aus, ins Netz, 2x am Boden aufprallen ect. Macht das Game noch interessanter[...]

Ja, bis hierhin kann ich dir zustimmen. Aber die Physik, die du verlangst, ist doch genau das, was ich vorhabe. Der Ball verhält sich doch so, wie ich es auf dem Bild aufgezeichnet habe. Dass der Ball an Geschwindigkeit verliert, je länger er in der Luft ist, kann ich ja ohne Probleme einbauen. Sache b) mit der Gravitation geschieht ja durch die Parabel und zwar durch die positive Nullstelle.

Zitat:

Zitat von JasonDX
[...] die Parabel-Frage waere geloest [...]

Inwiefern ist denn die Parabel-Frage für dich gelöst? ;)

Zitat:

Zitat von JasonDX
[...] und eine Anbindung an die oben genannten Moeglichkeiten waeren auch kein Problem mehr.

Was meinst du damit?

Zitat:

Zitat von JasonDX
Ausserdem wuerde der Schatten dann auch nicht in ner Geraden Linie verlaufen, was dem ganzen etwas mehr Realismus verpasst ;)

Tut er doch aber, oder?

Also alles in allem könnte ich doch noch etwas Hilfe gebrauchen. Also wenn Interesse besteht, könnt ihr ja mal ne PN schicken...

JasonDX 29. Mai 2006 01:29

Re: Ballflug bei Tennisspiel
 
Zitat:

Zitat von Yheeky
Aber die Physik, die du verlangst, ist doch genau das, was ich vorhabe. Der Ball verhält sich doch so, wie ich es auf dem Bild aufgezeichnet habe.

Achso, ich scheine dich falsch verstanden zu haben. Ich dachte, du wolltest die Parabel anhand einer Konstanten Formel (y=-x²) berechnen. Mein Ansatz mit der Physik war der, dass du in jedem Zeichenschritt die Neue Geschwindigkeit und daraus resultierende Position errechnest, also Vektor-Rechnung, keine Formeln wie du sie oben hattest ;)

Zitat:

Zitat von Yheeky
Zitat:

Zitat von JasonDX
[...] die Parabel-Frage waere geloest [...]

Inwiefern ist denn die Parabel-Frage für dich gelöst? ;)

Da du nicht mehr eine Parabel berechnen musst ;) Die Parabel ergibt sich dadurch, dass du die Physik, die in Realitaet wirkt, simulierst. D.h. alle paar Millisekunden veraenderst du den Geschwindigkeitsvektor, und bewegst den Ball. Dadurch ergibt sich die Flugbahn, die er haben soll.

Zitat:

Zitat von Yheeky
Zitat:

Zitat von JasonDX
[...] und eine Anbindung an die oben genannten Moeglichkeiten waeren auch kein Problem mehr.

Was meinst du damit?

Das Errechnen, der zu zeichnenden Position des Balles inkl. Schatten, das ich dir in #7 gezeigt habe ;)

Zitat:

Zitat von Yheeky
Zitat:

Zitat von JasonDX
Ausserdem wuerde der Schatten dann auch nicht in ner Geraden Linie verlaufen, was dem ganzen etwas mehr Realismus verpasst ;)

Tut er doch aber, oder?

Nicht ganz. Abhaengig von der Lichtquelle und Flugparabel des Balles laesst sich fast mit Sicherheit sagen, dass er nur in Seltenen Faellen sich entlang einer Linie bewegen wird: naemlich wenn die Lichtquelle genau in die (X:Y)-Richtung der Ball-Fluglinie zeigt. Ansonsten bewegt sich der Schatten ebenso entlang einer Parabel ;)

greetz
Mike

Yheeky 29. Mai 2006 13:20

Re: Ballflug bei Tennisspiel
 
Okay, also würde das alles am besten funktionieren, wenn man eine Physik-Engine erstellen würde. Gibt es da vielleicht schon fertige, die man mit Delphi verwenden kann?
Vielleicht hat ja auch jemand schonmal ein programmiert und die reicht für meine Ansprüche?! Wenn ja, bitte melden :)

DGL-luke 29. Mai 2006 14:38

Re: Ballflug bei Tennisspiel
 
Es gibt ODE ( Open Dynamics Engine ) und Newton ( www.newtondynamics.org ), die sind aber eher für 3d ausgelegt. natürlich kannst du das zeichnen weiterhin mit deiner ISO-Engine machen...

Yheeky 30. Mai 2006 16:05

Re: Ballflug bei Tennisspiel
 
Die Resonanz war jetzt nicht soooo gut ;) von daher würde ich doch lieber auf die Berechnung einer Parabel zurückgreifen.
Benutzen muss ich, wenn ich das richtig sehe, folgende Formel:

y = s * -x² + m

s ist die Stauchung und m ist die Verschiebung. In diese Formel muss ich nun aber irgendwie die Erkenntnis mit den Nullstellen einbeziehen, denn es soll ja so sein, dass der Start- und der Endpunkt der "eigentlichen" Ballfluglinie die Nullstellen sind. ICh hoffe mir kann da jemand helfen.

DGL-luke 30. Mai 2006 16:16

Re: Ballflug bei Tennisspiel
 
Nullstellenform einer ganzrationalen funktion:

y = (x-N1)^E1(x-N2)^E2....(x-Nn)^En

also bei dir

y = a(x-N1)(x-N2)

wobei a die stauchung und negativ sein sollte...

Yheeky 30. Mai 2006 16:34

Re: Ballflug bei Tennisspiel
 
Das sind doch dann aber 2 Unbekannte, denn ich muss die Stauchung und die Verschiebung ausrechnen...

Yheeky 10. Jun 2006 18:50

Re: Ballflug bei Tennisspiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube ich habe nun den richtigen Ansatz gefunden. Zumindest sieht das Testprogramm schon mal ansatzweise so aus, wie ich mir eine Ballflugbahn vorstelle. Die Linie lasse ich erstmal automatisch zeichnen. Ich weiss, dass der Code bisher noch nicht alle Linien (in alle Richtungen) berücksichtigt. Ich habe das Programm mal angehängt.

Das Problem ist noch:
- die Verschiebung der Flugbahn und
- dass die Parabel nicht die Länge der Linie hat

Vielleicht könnte sich einer den Code mal etwas näher anschauen und mir Verbesserungsvorschläge geben. Ausreichende Kommentierung ist vorhanden.


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