korrekte Kollision von 2 Kugeln...Verständnisprobleme
Übersicht

![]() |
PSYBetreff: korrekte Kollision von 2 Kugeln...Verständnisprobleme |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() Code: [AUSKLAPPEN] collisionDistance# = c\radius+c2\radius
also soweit ist noch alles klar. pythagoras kann ich schon noch 8)
actualDistance# = Sqr((c2\x-c\x)^2+(c2\y-c\y)^2) ;Collided Or not? If actualDistance<collisionDistance Then 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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Asus F53z
Das Leben ist eine reine Konkatenation... |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() @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 ![]() ![]() ![]() |
||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
rambo256 hat Folgendes geschrieben: http://wp1002880.wp004.webpack... genommen.
Vielen Dank ![]() Werd ich mir die Nacht mal ansehen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group