Einzelnen Beitrag anzeigen

Benutzerbild von Fussel9
Fussel9

Registriert seit: 25. Mai 2009
322 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Kollision mit Reflektion - Ich raffs net...

  Alt 10. Feb 2011, 21:41
Zitat:
Naja, wenn der Ball rechts rausfliegt, wird der Ball (1) zurückgesetzt an den Rand und (2) die x Geschwindigkeit negiert, damit er wieder in die andere Richtung fliegt. (1) ist nötig weil es sonst passieren könnte, dass der Ball etwas zu weit raus fliegt und im nächsten Schritt wieder eine Kollision erkannt wird. Das darf nicht sein weil der Ball dann am rechten Rand hängen bleiben würde.
ok das hab ich jetz verstanden, aber das mit dem ganzen vektorengedönz...#_#

Zitat:
Wenn für T2 -T1 = 1 gilt dann
ist Vxy
Vx = dx = X2-X1
Vy = dy = Y2-Y1
T2-T1=1
das ist nur der Fall wenn T2 zufällig T1*2 ist
angenommen T2 wäre (4|4) dann muss T1 (2|2) sein damit diese Kondition erfüllt ist... nicht unbedingt wahrscheinlich...

und wo bleibt der Richtungsvektor? Ich hab jetz ma ne Zeichnung gemacht und erkenne keine Zusammenhänge...


Zitat:
Formel: v_neu = v_alt - 2 * (v_alt*n)*n
n ist der Normalenvektor der Fläche, v_neu und v_alt die vorher/nachher Geschwindigkeitsvektoren.
venn VNeu darstellt wo sich der Ball jetzt befinden wird und VAlt wo der Ball vorher war, woher nehme ich dann den Normalenvektor der Fläche (ich denke mal das soll z.B. der Schläger oder der Brick sein)
Und worauf basiert die Formel? 2* den alten Vektor*Normalenvektor und dann nochmal * den Normalenvektor ...
...

und das sind so die punkte an denen ich dann wieder raus bin,,,

ich speicher übrigens nicht die xy sondern den winkel für den ball hilft mir das irgendwie weiter?
ich glaub das kann ich so gar nicht machen oder?
Delphi-Quellcode:
procedure TFormMain.MoveByAngle(pWinkel: Integer);
begin
  if (pWinkel<90) then
    begin
      SBall.Top:=SBall.Top+10;
      SBall.Left:=SBall.Left-pWinkel;
    end
  else
    begin
      if (pWinkel=90) then
        begin
          SBall.Left:=SBall.Left-pWinkel;
        end
      else
        begin
          if (pWinkel<=180) then
            begin
              SBall.Top:=SBall.Top-10;
              SBall.Left:=SBall.Left-pWinkel;
            end
          else
            begin
              if (pWinkel<270) then
                begin
                  SBall.Top:=SBall.Top-10;
                  SBall.Left:=SBall.Left+pWinkel;
                end
              else
                begin
                  if (pWinkel=270) then
                    begin
                      SBall.Left:=SBall.Left+pWinkel;
                    end
                  else
                    begin
                      if (pWinkel<=360) then
                        begin
                          SBall.Top:=SBall.Top+10;
                          SBall.Left:=SBall.Left+pWinkel;
                        end;
                    end;
                end;
            end;
        end;
    end;
end;
Miniaturansicht angehängter Grafiken
vektor_t1_t2.jpg