Dynamischen Ball an statischem Ball abprallen lassen



  • rapso schrieb:

    berechne den vector vom blobby-zentrum zum ball-zentrum, normalisiert diesen vektor, multiplizier ihn mit deiner wunschgeschwindigkeit und schon hasst du die neue ball-velocity 🙂

    Das ist physikalisch nicht korrekt. Man muss den alten Bewegungsvektor an der Tangente des Beruehrungspunktes spiegeln (wie das nunmal immer so ist, das sollte eigentlich jeder selbst rauskriegen!). Diese Tangente liegt orthogonal zu dem was du ausrechnest, das kann daher also nur stimmen, wenn die Bewegungsrichtung vorher schon paralell dazu war oder anders gesagt, die Mittelpunkte der Kreise/Kugeln sich genau aufeinander zubewegen. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • TGGC schrieb:

    rapso schrieb:

    berechne den vector vom blobby-zentrum zum ball-zentrum, normalisiert diesen vektor, multiplizier ihn mit deiner wunschgeschwindigkeit und schon hasst du die neue ball-velocity 🙂

    Das ist physikalisch nicht korrekt.

    so war es aber bei dem spiel als ich es das letzte mal sah.

    Man muss den alten Bewegungsvektor an der Tangente des Beruehrungspunktes spiegeln

    gespiegelt wird an der normale



  • Ich spreche auch nicht von einem Spiel, sondern der Realitaet.

    rapso schrieb:

    Man muss den alten Bewegungsvektor an der Tangente des Beruehrungspunktes spiegeln

    gespiegelt wird an der normale

    Du entaeuscht mich, wenn dir solch simples Grundwissen fehlt. Denk mal drueber nach, wenn du das naechste mal vorm Spiegel stehst. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • TGGC schrieb:

    Ich spreche auch nicht von einem Spiel, sondern der Realitaet.

    rapso schrieb:

    Man muss den alten Bewegungsvektor an der Tangente des Beruehrungspunktes spiegeln

    gespiegelt wird an der normale

    Du entaeuscht mich, wenn dir solch simples Grundwissen fehlt. Denk mal drueber nach, wenn du das naechste mal vorm Spiegel stehst. f'`8k

    Mir tut es leid wenn dir dein Autocogito selbst fehlt, wenn du den ball an der tangenten deines spiegels spiegeln wuerdest, wuerde der ball in der wand stecken und nicht abprallen, deswegen spiegeln wir in der physic, mathematik und graphik an der normalen um wen reflektionsvektor zu erhalten.



  • Ein Lichtstrahl wird am Spiegel gespiegelt. Ein Ball wird an einer Wand reflektiert. Immer das gleiche Prinzip. Es gibt in der Realitaet noch nicht mal eine Normale, sie ist ein rein mathematisches Konstrukt, eine Hilfslinie. Aber nein, beim Herrn rapso wird natuerlich an der Normale gespiegelt. Aber du gibst deinen Fehler ehh nicht zu. Also vergiss es rapso, ich hab keine Lust mehr drauf. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • ich glaube die grundlagendiskussion ob die allgemeine reflection formel mittels normale

    Out = 2 * (N.In) * N - In
    

    eher durch deine tangent-idee ersetzt werden sollte, bedarf viel mehr fachkenntniss als wir hier im Spieleprogrammierung liefern koennen. damit also der threadstarter zum glueck kommt, verschieb ich das mal zu den leuten vom fach mit denen du das klaeren kannst.



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Mathematik verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Eine wunderbare Diskussion, die man der Nachwelt unbedingt erhalten sollte.



  • Ja ^^

    Kann mir ma jemad so ein kokretes Beispiel anzeigen, sonst dauerts bei mir wieder so ewig bis ich drauf komme -.-^^



  • Hallo RobthaR,

    Im Prinzip geht es so wie es TGGC bereits gesagt hat. Mal angenommen die Position des Balls sei p\vec{p} im Moment der Kollision mit dem Blobby. Die Position des Blobbys sei q\vec{q}. Dann reicht es aus, den Geschwindigkeitsvektor v\vec{v} in einen Anteil senkrecht zur Tangentialebene durch den Berührungspunkt und in einen Anteil parallel zu dieser Ebene zu zerlegen.
    Da es sich beide Male um Kugel handeln, ist die Senkrechte der Ebene mit pq\vec{p}-\vec{q} gegeben.

    Der Vektor der senkrecht auf der Berührungsebene steht mit der Länge 1 ist dann
    n=(pq)/pq\vec{n}=(\vec{p}-\vec{q})/|\vec{p}-\vec{q}|

    Dann teilt man v\vec{v} in den senkrechten und parallelen Anteil auf:
    v=(vn)n+(v(vn)n)\vec{v}=(\vec{v}* \vec{n}) * \vec{n} + (\vec{v}-(\vec{v}* \vec{n}) * \vec{n})

    Bei der Reflektion wird die Richtung des senkrechten Anteils umgedreht. Damit erhält man den neuen Vektor u\vec{u} nach der Kollision
    u=(vn)n+(v(vn)n)\vec{u}=-(\vec{v}* \vec{n}) * \vec{n} + (\vec{v}-(\vec{v}* \vec{n}) * \vec{n})
    bzw.:
    u=v2(vn)n\vec{u}=\vec{v}-2(\vec{v}* \vec{n}) * \vec{n}

    Interessant für Dich könnte auch noch dieser Beitrag sein. Weiter kann ich Dir nur empfehlen gleich mit Vektoren im Code zu rechnen statt mit x und y - das ist relativ fehleranfällig. Ein Beispiel für einen Vektor findest Du hier.

    Gruß
    Werner



  • RobthaR schrieb:

    Ja ^^

    Kann mir ma jemad so ein kokretes Beispiel anzeigen, sonst dauerts bei mir wieder so ewig bis ich drauf komme -.-^^

    in etwa

    vec Reflect(Ball,Blobby)
    {
    //normale berechnen
    vec Nrm = normalize(Ball.Position-Blobby.Position);
    
    //in die reflektionsformel einsetzen
    vec NeueRichtung =  2.f * dot(Nrm,Ball.Bewegungsrichtung) * Nrm - Ball.Bewegungsrichtung;
    
    //eventuell normalisieren?
    return normalize(-NeueRichtung);
    }
    

    hab es nicht ausprobiert, sondern nur hingeschmiert, sollte so aber hinkommen *hehe*



  • die beiden verfahren machen doch genau das selbe: Bei dem einem mit der normalen, wird halt(bildlich) ein vektor um 180° um die normale gedreht,
    beim anderen verfahren um die (binormale?), bzw. umgeklappt, und 180° um die tangente gedreht.

    --> Beides ist das selbe



  • So habs jetzt hinbekommen, muss aber erstmal ne ordentliche Vektorklasse programmieren, weil der code so vermatscht is ^^ 😉


Anmelden zum Antworten