Entwickler-Ecke
Multimedia / Grafik - Ballberechnungen
MSBasti - So 16.11.03 11:57
Titel: Ballberechnungen
Hi Leutz!
Bin grad am rumdoktern wegen Berechnung der Flugbahn eines Balls. Also der Ball soll also über die Form fliegen und an Objekten und der Formrand abprallen. Für den Ball hab ich ne Klasse angelegt mit Variablen für die Position, Geschwindigkeit etc. Das ganze stell ich mit OpenGl dar, funzt auch, nur die Berechnungen hauen nicht hin, z.B. wird der Ball beim Aufprall auf ein Hindernis schneller oder der Abprallwinkel stimmt nich.
Hat da einer nen Standart oder nen Source, wie man sowas genau berechnet?
Basti
recall - Do 20.11.03 11:03
Hallo,
Du könntest das ganze mal näher beschreiben:
Prallte der Ball nur an vertikalen Objekten ( | ) ab, oder auch an schrägen ( / ) ? Falls ersteres musst du die x-Geschwindigkeit gar nicht neu berechnen... => ?!
- wo liegt dein Nullpunkt (oben links) ?
- willst du die Erdbeschleunigung auch mit drin haben ?
- siehe erste Frage !
Am besten stellst du deinen Code ins Netz, dann brauch ich nicht alles neu schreiben ;) ...
Viele Grüsse.
MSBasti - Fr 21.11.03 22:06
Hi Recall!
Ich stell mal son bisschen Code hierher. Der Ball soll zunächst nur an geraden Objekten bzw. dem Schläger abprallen. Ich bin damit erstmal nur am experimentieren. Also zunächst die Ball-Klasse:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TBall=class public x,y,xv,yv,angle:single; model : tall3dsmesh; constructor create; procedure render; procedure init; destructor free; end; |
x/y sind die Ballkoordinaten, xv,yv die Geschwindigkeit für x -und y Richtung, angle hatte ich für den Winkel vorgesehen.
Im Form-Create-Event dann den Ball erstellen
Delphi-Quelltext
1: 2: 3:
| Ball:=TBall.Create; |
Nun die eigentliche Procedure:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure BallMove; var nxv,nyv : single;
begin Ball.x := Ball.x + Ball.xv; Ball.y := Ball.y + Ball.yv; if ball.y>7.5 then ball.yv:=ball.yv-(ball.yv*2); if ball.y<-13 then ball.yv:=ball.yv+(-ball.yv*2); if ball.x>16 then ball.xv:=ball.xv-(ball.xv*2); if ball.x<-16.3 then ball.xv:=ball.xv+(-ball.xv*2);
if ball.y=-11.5 then begin if ball.x>=schlaeger.posx then begin if ball.x<schlaeger.posx+schlaeger.length then begin end; end; end; form1.Label1.Caption:=floattostr(ball.x)+' '+floattostr(ball.y); end; |
Dazu einige Bemerkungen: Nach der obigen Procedure ist der Winkel immer gleich am Formrand (z.B. xv=yv=45 Grad).
Die Koordinaten beziehen sich auf Weltkoordinaten von OpenGl. Der Ball und Schläger und zukünftige Objekte werden auch mit OpenGl gerendert.
Wie kann ich nun den Austrittswinkel berechnen, z.B. wenn der Ball auf den Schläger trifft? Hab da einiges versucht, aber kein brauchbares Ergebnis... leider
Moderiert von
tommie-lie: Delphi-Tags hinzugefügt
recall - Sa 22.11.03 00:00
Hallo,
Ich hoffe, ich habe dich richtig verstanden und dein Ball soll an einem vertikalen Schläger "physikalisch sinnvoll: Einfallswinkel=Ausfallswinkel" abprallen ?!
Dazu benutzt du nur das unabhängigkeitsprinzip: Die y-Geschwindigkeit bleibt erstmal erhalten ! Die x-Geschwindigkeit kehrt sich um , daher :
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if ball.x<schlaeger.posx+schlaeger.length then begin
Ball.xv := -Ball.xv;
end; |
Das wars.
Du solltest einen Code vielleicht noch optimieren ;) , z.B.:
Delphi-Quelltext
1: 2: 3: 4: 5:
| if ball.y>7.5 then ball.yv:=ball.yv-(ball.yv*2); if ball.y<-13 then ball.yv:=ball.yv+(-ball.yv*2); if ball.x>16 then ball.xv:=ball.xv-(ball.xv*2); if ball.x<-16.3 then ball.xv:=ball.xv+(-ball.xv*2); |
schreib als:
Delphi-Quelltext
1: 2: 3:
| if (ball.y>7.5) or (ball.y<-13) then ball.yv := -ball.yv; if (ball.x>16) or (ball.x<-16.3) then ball.xv := -ball.xv; |
Das ist eindeutig eleganter ;) .
Viele Grüsse.
P.S.: Vielleicht hab ich dich falsch verstanden, die Lsg kam mir etwas zu leicht vor ?! Soll dein Ball einen anderen Ausfallwinkel haben, wenn er weiter links oder rechts auf dem Schläger ankommt ?
Der Zusammenhang zwischen Winkel und x,y-Geschwindigkeit ist klar, oder ?
MSBasti - Sa 22.11.03 22:40
Hi,
Codeoptimierung is klar 8)
Also der Ball soll am Schläger links nen anderen Austrittswinkel als rechts bekommen etc.
Werd mal noch nen bisschen rumtesten, für nützliche Tips bin ich immer dankbar :D
Bis denn
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!