billard/ball anstoßen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • billard/ball anstoßen

    Hallo,
    ich will ein Billard Spiel machen, aber ich habe keinen
    Schimmer wie ich machen soll, dass wenn die eine kugel eine andere kugel anstößt , die andere dann realistisch angestoßen wird und erstere realistisch langsamer wird.
    maxda
    p.s. hab die SuFu benutzt hab aber nix gefunden was mich berfidigt hat
  • hm ich würd das so lösen:
    bei deiner weißen kugel
    collsion mit blauer_kugel
    other direction= point_direction(x,y,kugel_blau.x,kugel_blau.y) speed=speed/1.5
    self direction= direction+180 speed=speed/1.5

    @kilink au der hat nen echt festen schlag.....ja aber hat recht ich sollte mich schämen und auch verprügeln....für diese idee von mir :headtouch:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von JOhannski ()

  • Mein ehem. Physiklehrer würde dir jetzt links und Rechts eine verpassen.
    Das würde ja bedeuten, dass egal in welchem Winkel die Kugeln
    aufeinanderprallen die Richtung nur übernommen wird,
    und die erste Kugel einfach wieder zurückrollt.

    Wie war das noch?
    Einfallswinkel = Ausfallswinkel

    ich würde es eher mit sowas versuchen:
    (Davon ausgehend, dass beide Kugeln gleich groß,
    gleich schwer sind und den Origin in der Mitte haben
    was beim Billard im Allgemeinen gegeben sein sollte)

    GML-Quellcode

    1. // kugel_1 ist die "aktive" Kugel
    2. // kugel_2 ist die "reaktive" Kugel
    3. diff_ang = point_direction(kugel_1.x,kugel_1.y,kugel_2.x,kugel_2.y); //Berechnung des Winkels zwischen den beiden Kugeln
    4. kugel_1.direction = (360 - diff_ang) + (360 - kugel_1.direction);
    5. kugel_2.direction = diff_ang;
    Hier werden sie geholfen:
    [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
    [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


    "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
    "Selber denken regt das Gehirn an."
    - Niffel f.k.a. Kilik
  • Dann kannste noch ein "speed /= bla;" einfügen (wobei Bla irgendeine Konstante darstellt, je nachdem wie stark die Geschwindigkeit gemindert werden soll).
    Ich würd da einfach mal ein wenig mit den Werten spielen.
    Hier werden sie geholfen:
    [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
    [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


    "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
    "Selber denken regt das Gehirn an."
    - Niffel f.k.a. Kilik
  • maxda hat schon recht, beim Anstoß wird die gesamte Geschwindigkeit übertragen.
    Ich würde allerdings die Geschwindigkeit um einen kleinen Teil verringern, weil
    sonst ja die Kugel ewig weiter rollen würde (wär irgendwie blöd fürs gameplay :D )
    Ich hab mal ein kleines Beispiel mit angehängt.
    example1.zip

    PS: Ist mein erster Hilfeversuch, also bitte nicht böse sein... ;(
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • @blackspark

    Bin ich im Recht, wenn ich sage, dass deine Berechnung eine Annäherung ist?
    Ich bin grade dabei ein Impuls Script zu basteln und hab grad irgendwie einen gehirnkrampf...
    Mein Ansatz ist es das ganze über Energieerhaltung zu lösen. Und zwar benutze ich (oder ich will benutzen) elastischen und plastischen Stoß und gebe das Verhältnis mit k an. Im Eindimensionalen Raum ist das ganze kein Problem...nur scheitere ich an den Winkelrechnungen (kein Witz, ich weiß wie ich es umsetzen will...kriege nur immer Krämpfe wenn ich mit den Winkeln rechne, weil ich mir das nie so recht vorstellen kann und immer herumprobieren muss).
    Hier ist der Code für die 1-dimensionale Geschwindigkeitsberechnung:

    Spoiler anzeigen

    GML-Quellcode

    1. //Geschwindigkeitsberechnung nach einem Impuls
    2. //(m1,m2,v1,v2,k1,k2)
    3. //(k=0) => rein plastischer Stoß
    4. //(k=1) => rein elastischer Stoß
    5. //Berechnung im Eindimensionalen Raum
    6. //Bei höheren Dimensionen, über Aufprallwinkel berechnen
    7. var m1,m2, v1,v2, k1,k2, k, m1v1,m2v2;
    8. m1 = argument0;
    9. m2 = argument1;
    10. v1 = argument2;
    11. v2 = argument3;
    12. k1 = argument4;
    13. k2 = argument5;
    14. k = min(k1,k2);
    15. m1v1 = m1*v1;
    16. m2v2 = m2*v2;
    17. v1n = ( ( (m1-m2)*v1+2*m2v2 )*k + (m1v1+m2v2)*(1-k)) / ( m1+m2 );
    18. v2n = ( ( (m2-m1)*v2+2*m1v1 )*k + (m1v1+m2v2)*(1-k)) / ( m1+m2 );
    Alles anzeigen


    Die Abprallwinkel Berechnung möchte ich dir jetzt lieber nicht mehr zeigen...schon zu viel rumgepfuscht.
    Wäre sehr nett, wenn du mir deinen Lösungsweg nennen würdest (damit meine ich einen ohne viel sinus und co, der ja recht langsam ist).
    Achja bevor ich es vergesse zu sagen, das ganze ist natürlich 2d :rolleyes:
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Bin ich im Recht, wenn ich sage, dass deine Berechnung eine Annäherung ist?

    Also wenn man von einem idealen elastischen Stoß ausgeht, also Reibung ect. vernachlässigt, sind meine Berechnungen schon korrekt. Ich hab dir mal eine Zeichnung gemacht wie sich die Kräfte zusammensetzen und berechnen lassen. Also v1 und v2 sind jeweils die Geschwindikeitsvektoren der beiden Kugeln wenn sie aufeinander treffen und w1 und w2 sind die durch den Aufprall jeweils resultierenden Geschwindigkeiten. Also eigentlich ganz einfache Berechnungen wenn man der Zeichnung folgt und es sind nicht einmal Winkelfunktionen nötig sondern lediglich einfache Vektorrechnung.
    Bilder
    • elastischer_stoss.png

      41,35 kB, 766×509, 246 mal angesehen
  • Sehr vielen Dank Blackspark. Wenn du nun auch noch weißt wie sich der ideal plastische Stoß verhält, bis du mein Held^^
    Kann es sein das beim plastischen Stoß die parallelen Komponenten (man nennt die glaub ich auch orthogonalen) der Geschwindikeiten addiert werden und dann durch zwei geteilt werden??
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • @Trompadon:
    Also ich weiß nicht genau was du meinst, aber soweit ich weiß ist es beim idealen Stoß so, dass die Kugel, die die andere anstoßt, liegen bleibt und die andere mit der gleichen Geschwindigkeit weggestoßen wird. Heißt also, dass die Energie komplett übertragen wird.
    Ich frage mich grade was ein plastischer Stoß ist. Kenne nur elastisch und unelastisch... naaja.
    Übrigens parallel und orthogonal ist genau das Gegenteil (orthogonal steht senkrecht und nicht parallel zu der Ausgangs-"richtung").
  • Auch beim plastischen Stoß müssen wir wieder ein paar Voraussetzungen geltend machen. Wie schon beim elastischen Stoß geh ich hier nur auf den Fall ein, dass beide aufeinander treffende Kugeln gleiche Masse haben und dass es sich um einen vollkommenen plastischen Stoß handelt, also beide Kugeln nach dem aufeinander treffen aneinander "kleben". Unter diesen Voraussetzungen lässt sich der Vorgang ganz gut an meiner Zeichnung erklären: Du musst lediglich die beiden Vektoren u2 und -u1 auf der linken Seite und die beiden Vektoren -u2 und u1 auf der rechten Seite jeweils durch 2 teilen, so wie du es auch schon vermutet hattest. Das geht aufgrund der gleichen Massen. Bei unterschiedlichen Massen ist es dann nicht genau die Hälfte sondern anteilig.

    Ich hoffe die Erklärung reicht dir soweit.

    @Superdaniel
    plastischer Stoß ist ein Synonym für unelastischer Stoß. Hättest du auf Wikipedia erfahren.
  • Bei unterschiedlicher masse hilft mir ja immer noch diese Formel:

    GML-Quellcode

    1. Für plastischen Stoß:
    2. v1n=v2n=(m1*v1+m2*v2)/(m1+m2)
    3. Und für elastischen Stoß:
    4. v1n=((m2-m1)*v2+2*m1*v1)/(m1+m2)
    5. v2n=nur ein paar größen umgetauscht


    Nun kann ich eigentlich wenn ich beide ausrechne und dann beide auf ihren Anteil bringe...k=0 => plastischer...k=1 => elastischer, den reelen Stoß errechnen, oder?
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Ja, so könntest du es machen. Bezogen auf mein Bild und mit deinen berechneten Geschwindigkeiten sind dann die resultierenden Geschwindigkeitsvektoren

    GML-Quellcode

    1. w1 = v1-u1+v1n*u2/|u2|
    2. w2 = v2-u2+v2n*u1/|u1|

    Die Berechnung ergibt sich daraus, dass du das Problem auf das eindimensionale zurückführst und zwar auf die Gerade durch die beiden Mittelpunkte der Kreise. Nur auf dieser Geraden wirken die Kräfte auf die Körper. Und wie genau, dafür hast du ja die Formeln. Die Geschwindigkeitskomponenten senkrecht dazu bleiben unverändert.
  • Bl@ckSp@rk schrieb:

    Bin ich im Recht, wenn ich sage, dass deine Berechnung eine Annäherung ist?

    Also wenn man von einem idealen elastischen Stoß ausgeht, also Reibung ect. vernachlässigt, sind meine Berechnungen schon korrekt. Ich hab dir mal eine Zeichnung gemacht wie sich die Kräfte zusammensetzen und berechnen lassen. Also v1 und v2 sind jeweils die Geschwindikeitsvektoren der beiden Kugeln wenn sie aufeinander treffen und w1 und w2 sind die durch den Aufprall jeweils resultierenden Geschwindigkeiten. Also eigentlich ganz einfache Berechnungen wenn man der Zeichnung folgt und es sind nicht einmal Winkelfunktionen nötig sondern lediglich einfache Vektorrechnung.

    Hallo, sag mal wie kommst du auf u1 und u2 ??

    Ich komm einfach nicht dahinter, ich programmier zwar in VB.Net aber das dürfte kein
    Problem für euch sein. Es geht auch hier um Bälle (Kreise) Die zusammenstoßen usw..
    ich habe die formel fürn elastische zentralen stoß benutzt, das funktioniert soweit
    sehr gut aber ich möchte natürlich auch dass sich bei einem dezentralen stoß
    die kugeln korrekt verhalten... hier mein code soweit:

    V1x = speedX(i)
    V1y = speedY(i)
    V2x = speedX(x)
    V2y = speedY(x)
    M1 = 1
    M2 = 1


    VeKY = (bCenterY(x) + bCenterY(i)) / 2
    VekX = (bCenterX(x) + bCenterX(i)) / 2


    U1x = (M1 * V1x + M2 * (2 * V2x - V1x)) / (M1 + M2)
    U1y = (M1 * V1y + M2 * (2 * V2y - V1y)) / (M1 + M2)

    U2x = (M2 * V2x + M1 * (2 * V1x - V2x)) / (M2 + M1)
    U2y = (M2 * V2y + M1 * (2 * V1y - V2y)) / (M2 + M1)



    speedX(i) = U1x
    speedY(i) = U1y

    speedX(x) = U2x
    speedY(x) = U2y