3D Kugelkollision mit anderen Kugeln



  • Erstmal wieder vielen DANK!!
    So, die Kollisionserkennung klappt hervorragend die ich bereits hab. Grade was Speed > Durchmesser einer anderen Kugel angeht, und das daurch unausweichliche "Durchfliegen". So aber es ging mir jetzt speziell um die berechnung der neuen Richtungsvektoren, oder ist in deinem Beitrag bereits drin und ich bin nur zu doof um das zu erkennen zu dieser späten Stunde. Was meisnt du mit "eps" ??
    Und genau enthält j bzw J hinterher ?

    Danke für deinen ausführlichen Tipp 🙂

    Gruß Chris



  • Morgen.

    Ja, das ist eigentlich ein Rundum-Programm: Kollisionserkennung und -behandlung

    Ich sehe ich hab, vergessen zu erwähnen, dass v die Richtungsvektoren sein
    sollen. Naja war spät.
    Und wie du siehst wird ganz am Ende a.v und b.v neu berechnet.

    Das eps ist eine Stoßkonstante mit 0 <= eps <= 1.
    0 bedeutet maximaler Energieverlust
    1 bedeutet kein Energieverlust

    j ist eine positive reelle Zahl, die die Stärke des Kraftstoßes angibt.
    n ist die Richtung des Kraftstoßes

    J ist der Vektor des Kraftstoßes (also j * n)

    Und am Ende wird eben dann der Kraftstoß auf die Kugeln übertragen. Einmal
    + auf Kugel a und einmal - auf die Kugel b.
    Damit bleibt die relative tangentielle Geschwindigkeit erhalten. Nur die
    Geschwindigkeit parallel zu n muss verändert werden, da nur sie eine
    Durchdringung hervorruft.

    Du hast Recht. Da hab ich gar nicht mehr dran gedacht, dass sich diese beiden Kugeln durchfliegen können ohne Durchdringung. Aber der naive Ansatz geht auch bei normalen Simulationen, wie Snooker oder ähnliches.



  • Alles klar... Ich drehe die Impulsvektoren im moment mit der Y bzw Z Rotationsmatrix, damit ich die Komponenten haben, die wirklich zur Richtungsänderung beitragen, mein Problem war, dass bei 3D (Nicht bei 2D, da klappte alles wunderbar) anscheined iwie die MAtrixrotation falsch läuft was natürlcih eine Fehlberechnung der Impulsvektoren zur Folge hat. Ich werde es iwie schon hinkriegen, danke aber für die Ansätze!!

    Gruß Chris



  • Ganz schön kompliziert und ineffizient, wenn du mit Matrizen arbeitest in
    diesen Bereich.
    Mein Ansatz kickt viele von diesen Redundanzen raus. Aber das musst du selbst
    entscheiden.

    Übung macht den Meister 😉



  • Ehrlich gesagt bin ich etwas deprimiert, dass du das ohne kannst 😞 😞 Ich dachte immer man bräuchte für die berechnet des Impulses ne Matrize !!

    😞



  • Naja, siehst du in meinem Vorschlag eine Matrix, die kein Vektor ist?



  • Also deine Idee klappt hervorragend, nur eine Sache is mir aufgefallen war (Ich will nicht sagen falsch, aber wenn ich sie aßer Acht lassen, klappt alles)

    Du hast diese gepostet:
    - vrel = n * (a.v - b.v) (Skalarprodukt)
    - wenn (vrel < 0), dann ist ein Kraftsroß von Nöten, damit keine Durchdringung
    stattfindet, sonst Abbruch

    Ich habe den Betrag von vrel geprüft, (Ich hoffe das Meintest du damit), und dann klappte es nicht , wenn ich bei >= 0 aus meiner Funktion sprang.

    Hier der Code

    public static void betweenBalls(Ball tori, Ball uke)
    	{	
    		if(tori == null || uke == null)
    			return;
    
    		//Wir berechnen zuerst die Entfernung der beiden Bälle
    		Vector dist = tori.getPosition().sub(uke.getPosition()).unitVector();
    
    		Vector vrel = dist.mul( tori.getSpeed().sub(uke.getSpeed()) );
    
    		//if(!(vrel.track() < 0))
    			//return;
    
    		double j = vrel.mul(-(1 + 1)).div( 1 / tori.getMass() + 1 / uke.getMass() ).track();
    
    		Vector J = dist.mul(j);
    
    		tori.setSpeed( tori.getSpeed().add(J.div(tori.getMass()) ) );
    		uke.setSpeed( uke.getSpeed().sub(J.div(uke.getMass())) );
    	}
    

    Damit scheint es zu funktionieren. Einfach genial, und ich hantiere da mit MAtrizen rum, was auch geklappt hat, aber deines ist genialer 😞 Naja danke !!

    Gruß Chris



  • Zeile 9 : vrel ist kein Vektor sondern eine reelle Zahl(deswegen Skalarprodukt)

    Und diese vielleicht negative Zahl zeigt an, ob sich die beiden Kugeln im
    nächsten Zeitschritt durchdringen.



  • Sry, habs übersehen, aber als Vektor klappts auch :D^^ Ok, danke für alles! Dank dir hab ich ne neue Sicht der Dinge 😛

    Gruß Chris



  • Klar klappt's damit^^ du brauchst ja bloß den Betrag. Das Vorzeichen soll aber
    noch andere Informationen liefern. Aber wenn's geht, kann ich ja beruhigt
    Einkaufen fahren.


Anmelden zum Antworten