Autor Beitrag
MSBasti
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 16.11.03 11:57 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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:

ausblenden 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
ausblenden Delphi-Quelltext
1:
2:
3:
//...
 Ball:=TBall.Create;
//...


Nun die eigentliche Procedure:


ausblenden 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;
   
   //Abprallen am Formrand
    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);

    //Schlaeger prüfen
    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 user profile icontommie-lie: Delphi-Tags hinzugefügt
recall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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 :

ausblenden 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.:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
//Abprallen am Formrand 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
//Abprallen am Formrand 
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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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