korrekte Kollision von 2 Kugeln...Verständnisprobleme

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

PSY

Betreff: korrekte Kollision von 2 Kugeln...Verständnisprobleme

BeitragDi, Jan 25, 2005 2:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

bin zufällig vor 2 Tagen über folgenden Code gestolpert (bischen gross, sorry). ein paar rems hab ich der grösse halber rausgenommen, war nur ne beschreibung.

Code: [AUSKLAPPEN]
; ID: 415
; Author: Phish

Graphics 800, 600, 16, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

;------------------------------------------
; MAIN DATA TYPE
;------------------------------------------
Type circle
   Field x#, y#      ;position
   Field dx#, dy#      ;x and y speeds
   
   Field radius#      ;radius of circle
   Field mass#         ;mass of circle
End Type
;------------------------------------------
;------------------------------------------
; SET UP BALLS INTO A POOL STYLE ARRANGEMENT
;------------------------------------------
.Setup
ballTriangleSize=5
For xloop = ballTriangleSize To 1 Step -1
   For yloop = 1 To xloop
      c.circle = New circle
      c\x = (5-xloop)*27 + 200
      c\y = yloop*31-(xloop*31)/2.0 + 300
      c\dx=0
      c\dy=0
      c\radius = 15
      c\mass = 1
   Next
Next

;Cue ball (smaller so you know which it is :)
cue.circle = New circle
cue\x = 800
cue\y = 300 +20
cue\dx = -20
cue\dy = Rnd(4)-2
cue\radius = 14
cue\mass = 1
;------------------------------------------
;------------------------------------------
;MAIN LOOP
;------------------------------------------
While Not KeyDown(1)

   Cls
   
   UpdateCirclePhysics()
   RenderCircles()
   
   ;------------
   ; Reset button
   Text 10, 10, "Press a mouse button to reset."
   Text 10, 25, "Press Esc to exit."
   If GetMouse() Then
      For c.circle = Each circle
         Delete c
      Next
      Goto setup
   End If
   ;------------
   
   Flip
   
Wend
;------------------------------------------
;------------------------------------------
End

;------------------------------------------
Function UpdateCirclePhysics()
;------------------------------------------
; This is the main physics function for the
; circles. It contains the very basic
; movement physics as well as the collision
; response code.
;------------------------------------------

   For c.circle = Each circle
   
      ;update positions
      c\x=c\x+c\dx
      c\y=c\y+c\dy
      
      ;gradually slow down
      c\dx=c\dx*0.99
      c\dy=c\dy*0.99
      
      ;------------------------------------------
      ;COLLISION CHECKING
      ;------------------------------------------
      ; Check each circle in the loop against
      ; every other (c against c2)
      For c2.circle = Each circle
      
         collisionDistance# = c\radius+c2\radius
         actualDistance# = Sqr((c2\x-c\x)^2+(c2\y-c\y)^2)
         
         ;Collided Or not?
         If actualDistance<collisionDistance Then
            
            collNormalAngle#=ATan2(c2\y-c\y, c2\x-c\x)

            ;Position exactly touching, no intersection
            moveDist1#=(collisionDistance-actualDistance)*(c2\mass/Float((c\mass+c2\mass)))
            moveDist2#=(collisionDistance-actualDistance)*(c\mass/Float((c\mass+c2\mass)))
            c\x=c\x + moveDist1*Cos(collNormalAngle+180)
            c\y=c\y + moveDist1*Sin(collNormalAngle+180)
            c2\x=c2\x + moveDist2*Cos(collNormalAngle)
            c2\y=c2\y + moveDist2*Sin(collNormalAngle)
            
            
            ;------------------------------------------
            ;COLLISION RESPONSE
            ;------------------------------------------
            ;n = vector connecting the centers of the circles.
            ;we are finding the components of the normalised vector n
            nX#=Cos(collNormalAngle)
            nY#=Sin(collNormalAngle)
            
            ;now find the length of the components of each movement vectors
            ;along n, by using dot product.
            a1# = c\dx*nX  +  c\dy*nY
            a2# = c2\dx*nX +  c2\dy*nY
            
            ;optimisedP = 2(a1 - a2)
            ;             ----------
            ;              m1 + m2
            optimisedP# = (2.0 * (a1-a2)) / (c\mass + c2\mass)
            
            ;now find out the resultant vectors
            ;r1 = c1\v - optimisedP * mass2 * n
            c\dx = c\dx - (optimisedP*c2\mass*nX)
            c\dy = c\dy - (optimisedP*c2\mass*nY)
            
            ;r2 = c2\v - optimisedP * mass1 * n
            c2\dx = c2\dx + (optimisedP*c\mass*nX)
            c2\dy = c2\dy + (optimisedP*c\mass*nY)

         End If

      Next
      ;------------------------------------------
      ;------------------------------------------
      
      
      ;Simple Bouncing off walls.
      If c\x<c\radius Then
         c\x=c\radius
         c\dx=c\dx*-0.9
      End If
      If c\x>GraphicsWidth()-c\radius Then
         c\x=GraphicsWidth()-c\radius
         c\dx=c\dx*-0.9
      End If
      If c\y<c\radius Then
         c\y=c\radius
         c\dy=c\dy*-0.9
      End If
      If c\y>GraphicsHeight()-c\radius Then
         c\y=GraphicsHeight()-c\radius
         c\dy=c\dy*-0.9
      End If
      
   Next

End Function

;------------------------------------------
Function RenderCircles()
;------------------------------------------
; Simple function draws all the circles
; on the screen.
;------------------------------------------

   For c.circle = Each circle
      If c\radius=15 Then Color 200, 50, 50 Else Color 255, 255, 255
      Oval c\x-c\radius, c\y-c\radius, c\radius*2, c\radius*2
   Next
   
End Function


Ich hab mir den Code mal angeschauen, Zeichnungen angefertigt, im Web recherchiert, aber bei der colli function ist mir manches noch unklar. trigonometrie ist lange her Smile

Falls jemand von Euch noch Fit in der Materie ist und Zeit hat, könnte er mir folgenden Teil des Codes bitte näher erläutern...ich sitz da jetzt 2 Tage dran und versteh immer weniger Shocked

Code: [AUSKLAPPEN]
collisionDistance# = c\radius+c2\radius
         actualDistance# = Sqr((c2\x-c\x)^2+(c2\y-c\y)^2)
         
         ;Collided Or not?
         If actualDistance<collisionDistance Then
also soweit ist noch alles klar. pythagoras kann ich schon noch 8)
aber hier geht´s los:

Code: [AUSKLAPPEN]
collNormalAngle#=ATan2(c2\y-c\y, c2\x-c\x);Position exactly touching, no intersection
            moveDist1#=(collisionDistance-actualDistance)*(c2\mass/Float((c\mass+c2\mass)))
            moveDist2#=(collisionDistance-actualDistance)*(c\mass/Float((c\mass+c2\mass)))
            c\x=c\x + moveDist1*Cos(collNormalAngle+180)
            c\y=c\y + moveDist1*Sin(collNormalAngle+180)
            c2\x=c2\x + moveDist2*Cos(collNormalAngle)
            c2\y=c2\y + moveDist2*Sin(collNormalAngle)


was passiert hier genau? und vor allem was besagt collnormalangle#?
bewirken diese zeilen, dass die bälle wieder auseinandergezogen werden, weil sie sich überlappen? und wenn ja, werden sie korrekt auseinandergezogen? ich hab irgendwie den eindruck sie werden falsch verschoben. wenn jemand bitte genau erklären oder skizzieren könnte was collnormalangle für eine funktion hat, wär ich SEHR dankbar Surprised

der rest dieser function ist natürlich auch nicht ganz klar, weil ich das wesentliche am anfang nicht verstehe.

Code: [AUSKLAPPEN]
optimisedP# = (2.0 * (a1-a2)) / (c\mass + c2\mass)

was sagt optimisesP# aus?

wie gesagt über jede tips, skizzen, erklärungen und sonstigen hilfen bin ich überaus dankbar. das web hab ich zwar schon durchsucht, finde aber nix konkretes, es gibt zwar tonnenweise andere lösungen,aber die hier würde ich gern benutzen und verstehen Wink

vielen dank im voraus.

P.S. ihr könnt auch gerne ne PM schreiben oder ne mail an pheryllt@t-online.de.

l8er,
PSY
 

Klaas

BeitragDi, Jan 25, 2005 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
collNormalAngle#=ATan2(c2\y-c\y, c2\x-c\x);


Hier werden die Vektoren der beiden Kugeln subtrahiert und der Winkel des resultierenden Vektor errechnet.
Was das dann genau sein soll weiß ich noch nicht.

Code: [AUSKLAPPEN]
 moveDist1#=(collisionDistance-actualDistance)*(c2\mass/Float((c\mass+c2\mass)))


(collisionDistance-actualDistance)
Ist der Abstand der Kugeln. Aber nicht vom Zentrum her sondern von dem Aussenrand (halt mit Radius).

c2\mass/Float((c\mass+c2\mass))
das hier ist irgendwie ne Kraft berechnung. (Elastischer stoß ?)

zumindest ergibt das zusammen die neue Geschwindigkeit nach dem Stoß, jeh nach Masse der kollidierenden Objekte.


Code: [AUSKLAPPEN]
c\x=c\x + moveDist1*Cos(collNormalAngle+180)


moveDist1*Cos(collNormalAngle+180)
Hier wird der Winkel (s.o.) zur Normale verrechnet und mal der neuen Kraft genommen. Das ergibt dann einen neuen Vektor. Plus 180 bestimmt weil der eine Ball ja in die entgegengesetzte Richtung abprallt.
Na und das Ergebniss wird dann auf die derzeitige Position addiert, also der Ball entsprechend bewegt.

Code: [AUSKLAPPEN]
c2\x=c2\x + moveDist2*Cos(collNormalAngle)


Das ganze entsprechend nochmal für den anderen ohne plus 180

rambo256

BeitragDi, Jan 25, 2005 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Klaas hat Folgendes geschrieben:



Code: [AUSKLAPPEN]
c\x=c\x + moveDist1*Cos(collNormalAngle+180)


moveDist1*Cos(collNormalAngle+180)
Hier wird der Winkel (s.o.) zur Normale verrechnet und mal der neuen Kraft genommen. Das ergibt dann einen neuen Vektor. Plus 180 bestimmt weil der eine Ball ja in die entgegengesetzte Richtung abprallt.
Na und das Ergebniss wird dann auf die derzeitige Position addiert, also der Ball entsprechend bewegt.



Dort werden die beiden Bälle so gesetzt, so dass sie nicht mehr kollidieren,sondern genau aneinander anliegen. Nun aber schon in den richtigen Winkeln,wie sie auch voneinander abprallen werden.

btw: ich hatte das ganze schonmal alles ausfürhrlich erläutert,auch das mit den Kräften und impulsen,muss ich mal nachher nochmal raussuchen,muss jetzt zur Schule Wink
Asus F53z

Das Leben ist eine reine Konkatenation...

PSY

BeitragDi, Jan 25, 2005 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@KLAAS

Zitat:
Code:
collNormalAngle#=ATan2(c2\y-c\y, c2\x-c\x);

Hier werden die Vektoren der beiden Kugeln subtrahiert und der Winkel des resultierenden Vektor errechnet.
Was das dann genau sein soll weiß ich noch nicht.

jo ich nehm an, es ist der vektor zwischen mittelpunkt kugel 1 und kugel2. bin halt noch nicht ganz sicher, wie er im folgenden code gebraucht wird.

Zitat:

moveDist1#=(collisionDistance-actualDistance)*(c2\mass/Float((c\mass+c2\mass)))
(collisionDistance-actualDistance)
Ist der Abstand der Kugeln. Aber nicht vom Zentrum her sondern von dem Aussenrand (halt mit Radius).

funktioniert auch ohne die massenberechnung, z.b. mit ner konstante. die massenberechnung ist in der hinsicht logisch, sobald die kugeln verschiedene massen haben.

Zitat:

c\x=c\x + moveDist1*Cos(collNormalAngle+180)
moveDist1*Cos(collNormalAngle+180)
Hier wird der Winkel (s.o.) zur Normale verrechnet und mal der neuen Kraft genommen. Das ergibt dann einen neuen Vektor. Plus 180 bestimmt weil der eine Ball ja in die entgegengesetzte Richtung abprallt.
Na und das Ergebniss wird dann auf die derzeitige Position addiert, also der Ball entsprechend bewegt.

geht auch so: c\x=c\x - moveDist1*Cos(collNormalAngle)
was ich halt noch nicht so ganz versteh, ist, wie genau die bälle wieder auf ihrem ursprungskurz VOR der kolli zurückgeschoben werden.

erstmal vielen dank, hab heute mal zeit gehabt zum ausschlafen, dann gehts eventuell besser Very Happy


@rambo256

Zitat:

Dort werden die beiden Bälle so gesetzt, so dass sie nicht mehr kollidieren,sondern genau aneinander anliegen. Nun aber schon in den richtigen Winkeln,wie sie auch voneinander abprallen werden.

btw: ich hatte das ganze schonmal alles ausfürhrlich erläutert,auch das mit den Kräften und impulsen,muss ich mal nachher nochmal raussuchen,muss jetzt zur Schule


wenn du das genauer erklären/raussuchen würdest, hast du bis lebensende was gut bei mir Laughing Wink Laughing

rambo256

BeitragDi, Jan 25, 2005 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
http://wp1002880.wp004.webpack...highlight=

Dort hab ich dann das mit dem Impuls erklärt.
Dort wurde der Code auch schojn ein wenig auseinander genommen.
Asus F53z

Das Leben ist eine reine Konkatenation...

PSY

BeitragDi, Jan 25, 2005 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
rambo256 hat Folgendes geschrieben:
http://wp1002880.wp004.webpack... genommen.


Vielen Dank Exclamation
Werd ich mir die Nacht mal ansehen Shocked

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group