Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Sep 04, 2025 02:29

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: kollisionsberechnung quadrat
BeitragVerfasst: Sa Aug 14, 2010 15:21 
Offline
DGL Member

Registriert: Fr Aug 13, 2010 17:11
Beiträge: 1
Hi,

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. :)


Dateianhänge:
quadrat.png
quadrat.png [ 2.07 KiB | 4527-mal betrachtet ]
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: kollisionsberechnung quadrat
BeitragVerfasst: So Aug 15, 2010 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: kollisionsberechnung quadrat
BeitragVerfasst: So Aug 15, 2010 12:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

Also dann:
[linearVelocity.y + (j.y / mass)] + [angularVelocity + (p.x*j.y / inertia)] * p.x = -speed.y * restitution

Aber das ändert natürlich nichts an der grundsätzlichen Vorgehensweise. :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 18 Queries | GZIP : On ]