also, ich möchte berechnen wie ein Quadrat vom "Boden" abprallt. Dabei muss ich natürlich die Drehung und die Bewegung des Quadrates mit einbeziehen. Um dann nach dem Abprall einen neuen Bewegungsvektor und drehwinkel zu bekommen. Mein Ansatz ist folgender: Zuerst rechne ich mir über den Drehwinkel aus in welche Richtung sich die mit dem Boden kollidierte Ecke das Quadrates bewegt. Auf diesen Vektor addiere ich den Bewegungsvektor. Nun habe ich den Vektor wie sich die Ecke bewegt. Bei diesem Vektor drehe ich das Vorzeichen vom Y-Wert um, wegen der Kollision und "kürze" ihn ein wenig wegen der Reibung. Jetzt habe ich den Vektor wo hin sich die Ecke nach der Kollision bewegt. Mein Problem ist nun, wie rechne ich das jetzt wieder in den Drehwinkel und den Bewegungsvektor um???
Ich hoffe mein Ansatz ist so weit korrekt, und ihr könnt mir bei der letzten Rechnung helfen. hier noch ein Bild, zum besseren Verständnis: Ich weiß nicht grade schön aber selten.
Also du brauchst neben dem Bewegungsvektor, nennen wir ihn linearVelocity, auch eine Drehgeschwindigkeit angularVelocity. Da es sich hier um den 2D-Fall handelt ist angularVelocity einfach nur ein eindimensionaler Zahlenwert. (Im 3D-Fall wäre es ein Vektor der die Drehachse angibt.)
Zusätzlich braucht dein Objekt eine Masse mass, sowie einen Schwerpunkt c. Wenn du nun eine Kraft j auf dein Objekt anwendest, machst du das immer an einem bestimmten Punkt p relativ zum Schwerpunkt. In deinem Fall wäre p einfach die kollidierte Ecke das Quadrates.
Neben der Masse wird auch ein Inertia-Wert inertia benötigt, der die Trägheit bei Drehbewegungen angibt. (Im 3D-Fall wäre das eine 3x3-Matrix.) Dieser Berechnet sich aus der Größe deines Quadrates und der Masse:
Code:
inertia := mass * (size.x*size.x + size.y*size.y) / 12.0f;
Das Update der velocity-Werte funktioniert dann so:
Code:
linearVelocity := linearVelocity + (j / mass); angularVelocity := angularVelocity + ((p % j) / inertia); // p % j ist hier das 2D-Kreuzprodukt, also: p % j := p.x*j.y - p.y*j.x
Nun musst du noch die eigentliche Kraft j berechnen. Das ist nicht gerade einfach. Wenn du Reibung außer acht lässt zeigt die Kraft genau nach oben und ist so dosiert das sich der Kollisionspunkte nach der Anwendung der Kraft nicht mehr nach unten (Y-Achse) bewegt. Es muss also gelten: [linearVelocity + (j / mass)] + [angularVelocity + ((p % j) / inertia)] * vec2(-p.y, p.x) = vec2(irgendwas, 0)
Die X-Achse interessiert uns nicht, daher setzen wir j.x = 0 und betrachten dann nur den Y-Anteil: [linearVelocity.y + (j.y / mass)] + [angularVelocity + (p.x*j.y / inertia)] * p.x = 0
Das müsste man jetzt zu j.y umstellen können und hätte die notwendige Kraft berechnet. Diese Kraft würde man dann wie oben beschrieben anwenden. Wenn du Reibung willst wird das ganze noch eine Nummer komplizierter.
Für mehr Infos einfach nochmal fragen bzw. mal einen Blick in die Paper werfen die ich für mein Articulated Rigid Bodies - Projekt verwendet habe. Dort wird das ganze für den 3D-Fall erklärt.
P.S. Ich hab das jetzt einfach so runter geschrieben, also gut möglich das ich mich hier irgendwo verrechnet habe. Auch gut möglich das es irgendwie einfacher geht, ich habe das jetzt gerade aus dem 3D-Fall hergeleitet.
Argh...die Bewegung in Y-Richtung soll natürlich nicht 0 sein. Gewünscht ist da eher die alte Bewegung mit invertierter Y-Achse. Genau genommen: -speed.y * restitution
Dabei ist speed.y := linearVelocity.y + angularVelocity * p.x und restitution der Restitutionskoeffizient zwischen 0 und 1. Es gibt die Materialeigenschaften wieder: ein Wert von 0 wäre ein Objekt das einfach nur runter fällt und liegen bleibt....ein Wert von 0,95 wäre ein Flummi fast wieder genauso hoch springt wenn er fallen gelassen wird.
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.