2 kugeln -> abprallwinkel? (2D)



  • wie berechne ich den winkel mit dem eine kugel von einer andren abprallet, wenn sie dagegen trifft? im zweidimensionalen raum...
    also eigentlich keine kugeln sondern kreise



  • Da würd ich dir raten ein Physikbuch deiner Wahl zu befragen. Kommt ganz drauf an wie genau du es haben willst und da kommt es auf sehr viele verschiedene Dinge draufan die zu spezifizieren sind: haben Kugeln unterschiedliche Masse, Größe, bewegt sich die andere Kugel auch noch, ist der Boden ne ideale Ebene undundund. Nen kleinen Hack wird dir hier jeder bieten können einfach wenn du die Kugel in der Mitte triefst die andere Kugel weiterbewegen lassen sonst lässt sie je nachdem abprallen wie weit sie am Rand getroffen hast...



  • dali schrieb:

    Da würd ich dir raten ein Physikbuch deiner Wahl zu befragen. Kommt ganz drauf an wie genau du es haben willst und da kommt es auf sehr viele verschiedene Dinge draufan die zu spezifizieren sind: haben Kugeln unterschiedliche Masse, Größe, bewegt sich die andere Kugel auch noch, ist der Boden ne ideale Ebene undundund. Nen kleinen Hack wird dir hier jeder bieten können einfach wenn du die Kugel in der Mitte triefst die andere Kugel weiterbewegen lassen sonst lässt sie je nachdem abprallen wie weit sie am Rand getroffen hast...

    unterschiedliche grösse: ja
    unterschiedliche masse: N/A
    getroffene kugel bewegt sich nicht
    boden ist glatt ( 2 dimensionaler raum!! wie zb ein billardtisch von oben)



  • Eben kommt es jetzt darauf an was du für ein Resultat willst... Wenns genau sein soll würde sich ne physikalische Formel anbieten. Ansonsten wäre es doch nicht so schwer glaubwürdige Resultate zu bekommen. Einfach beim Kollisionspunkt wo sich die beiden Kugeln berühren die getroffen Kugel mit dem Vektor vom Kollisionspunkt in die Kugelmitte davonfliegen lassen die andere läßt meinetwegen mit den Grad entegengesetzt zur Kollisionskugelmitte in die andere Richtung fliegen. Die Masse würdest dadürch vielleicht noch reinpacken können indem einfach schwerere Kugeln leichtere Kugeln mehr anstoßen umgekehrt weniger. Da könntest dann rumspielen...



  • dali schrieb:

    Eben kommt es jetzt darauf an was du für ein Resultat willst... Wenns genau sein soll würde sich ne physikalische Formel anbieten. Ansonsten wäre es doch nicht so schwer glaubwürdige Resultate zu bekommen. Einfach beim Kollisionspunkt wo sich die beiden Kugeln berühren die getroffen Kugel mit dem Vektor vom Kollisionspunkt in die Kugelmitte davonfliegen lassen die andere läßt meinetwegen mit den Grad entegengesetzt zur Kollisionskugelmitte in die andere Richtung fliegen. Die Masse würdest dadürch vielleicht noch reinpacken können indem einfach schwerere Kugeln leichtere Kugeln mehr anstoßen umgekehrt weniger. Da könntest dann rumspielen...

    das ist aber extrem ungenau, nehmen wir an die kugel streift die andere nur, dann würde sie ja in einem 90 grad winkel abprallen, denn der vektor von der kugelmitte berücksichtigt ja nicht die vorherige bewegungsrichtung sondern nur den kollisionspunkt!



  • könnte ich nicht die x und y koordinaten vom kugelmittelpunkt nehmen, auf werte zwischen 1 und 0 bringen und dann mit den bewegungsvektoren multiplizieren, bzw mit einem faktor multiplizieren und dann auf die bewegungsvektoren addieren?



  • wenn deine kugeln gleiche masse haben musst du blos (soweit ich das noch in erinnerung hab) den verbindungs vektor bilden und dann zwei vektoren vertauscen. Keine ahnung aber so oder so aehnlich war die reihenfolge irgendwie. hab das mal irgendwo gelesen vor laengerem. wieso googelst du nicht etwas danach?



  • void resolveCollision(const Vektor& centerA,   	// Mittelpunkt von Kugel A
    	        const Vektor& velocityA,       	// Geschwindigkeitsvektor von Kugel A
    		float massA,			// Gewicht von Kugel A
    		const Vektor& centerB,	    	// Mittelpunkt von Kugel B
    		const Vektor& velocityB,	// Geschwindigkeitsvektor von Kugel B
    		float massB,		  	// Gewicht von Kugel B
    		Vektor* p_outVelocityA,	    	// Neuer Geschwindigkeitsvektor von Kugel A
    		Vektor* p_outVelocityB) 	// Neuer Geschwindigkeitsvektor von Kugel B
    {
    	Vektor v(centerB - centerA);
    
    	Normalize(&v, &v); // Einheitsvektor von v bilden
    
    	const Vektor velocityA1(v * D3DXVec2Dot(&v, &velocityA));
    	const Vektor velocityA2(velocityA - velocityA1);
    	const Vektor velocityB1(v * D3DXVec2Dot(&v, &velocityB));
    	const Vektor velocityB2(velocityB - velocityB1);
    
    	if(p_outVelocityA) *p_outVelocityA = (((2.0f * massB * velocityB1) + (massA - massB) * velocityA1) / (massA + massB)) + velocityA2;
    	if(p_outVelocityB) *p_outVelocityB = (((2.0f * massA * velocityA1) + (massB - massA) * velocityB1) / (massA + massB)) + velocityB2;
    }
    

    Ich setze mal voraus, dass du Vektor in irgendeinerweise definiert hast, sonst must du o. g. Code abändern.
    Normalize habe ich mal aus DirectX übernommen, musst du eventl. auch selbst definieren. Jedenfalls muss ein Einheitsvektor gebildet werden.



  • BigBoomer schrieb:

    void resolveCollision(const Vektor& centerA,    // Mittelpunkt von Kugel A
                          const Vektor& velocityA,  // Geschwindigkeitsvektor von Kugel A
                          float massA,              // Gewicht von Kugel A
                          const Vektor& centerB,    // Mittelpunkt von Kugel B
                          const Vektor& velocityB,  // Geschwindigkeitsvektor von Kugel B
                          float massB,              // Gewicht von Kugel B
                          Vektor* p_outVelocityA,   // Neuer Geschwindigkeitsvektor von Kugel A
                          Vektor* p_outVelocityB)   // Neuer Geschwindigkeitsvektor von Kugel B
    {
        // ...
    }
    

    Wäre nett gewesen, wenn Du angegeben hättest, dass die Funktion aus meinem 2D-Spiele-Framework stammt ... 🙄
    Sie funktioniert übrigens sowohl für 2D als auch für 3D.

    BigBoomer schrieb:

    Jedenfalls muss ein Einheitsvektor gebildet werden.

    Na dann ist ja alles klar!
    Jedenfalls muss irgendwo irgendwas addiert und auch mal multipliziert werden.
    Sag doch gleich, dass Du nicht weißt, was die Funktion macht ...



  • musst natürlich noch einberechnen, dass die kugel(n) einen gewissen drall bekommen können :>



  • TomasRiker schrieb:

    Wäre nett gewesen, wenn Du angegeben hättest, dass die Funktion aus meinem 2D-Spiele-Framework stammt ... 🙄

    Woher sollte ich das den Wissen? Das habe ich von einem Freund gekriegt.

    TomasRiker schrieb:

    Sag doch gleich, dass Du nicht weißt, was die Funktion macht ...

    Ich weiß, was die Funktion macht. Hatte auch Physik in der Schule. Impulserhaltungssatz usw. Da ich das Prinzip eines (elastischen) Stoßes verstehe,
    muss ich mich nicht um die genauen Details der Funktion rumschlagen, da ich ja (wie gesagt) das Prinzip verstanden habe. Oder schaust du in jede Funktion der STL?


Anmelden zum Antworten