Collision

A

Alexander

Gast
Hallo,

ich möchte mit OpenGL einen Raum erstellen, in der 20 Kugeln sind. Die Geschwindigkeit und die Masse ist bei allen gleich und bleibt auch so. Nun möchte ich dass wenn 2 Kugeln aufeinandertreffen (oder eine Kugel die Wand trifft) diese voneinander abprallen.
Mathematisch ist das ganze kein Problem, aber so würde ich das programmiertechnisch machen:
Jedes Mal wenn sich eine Kugel ein Stück bewegen soll, überprüfe ich in einer Schleife ob einer von den 20 Kugeln oder die Wand zu nah an die jetztige Kugel kommt. Das würde bei 20 Kugeln, die sich immer bewegen, sehr sehr sehr viel rechenarbeit bedeuten..
Aber mir fällt keine andere Lösung des Problems ein. Weiß hier jemand wie man es "richtig" macht?

Danke im Vorraus für jede hilfreiche Antwort ;)
 
A

Alexander

Gast
Ich habe zu Testzwecken einfach mal 10 Kugeln in den Raum gestellt, sie sich alle im Kreis bewegung und das läuft schon verdammt langsam..
Ich habe die Beweg-Schleife in der public void DrawGLScene() function gesetzt, die 60x in der Sekunde aufgerufen wird. Aber soabdl 2-3 Kugeln dazukommen, dauert der Prozess länger.. was kann man dagegen machen? Bzw sollte ich irgendwie Multithreading aktivieren?
 

Marco13

Top Contributor
Du meinst sowas wie in diesem Video, mit >16000 (!) Kugeln? :D

Es gibt verschiedene Möglichkeiten, diese Kollisionserkennung schneller zu machen. So viele, dass man sie hier kaum auflisten kann, sondern bestenfalls an eine Websuche verweisen.

In der NVIDIA-Demo wird das soweit ich mich erinnere(!) mit einer Art "Spatial Hashing" gemacht. Da wird der Raum in ein "Gitter" eingeteilt, und dann für jede Kugel gespeichert, in welcher "Gitterzelle" sie gerade liegt, und ob in den benachbarten Gitterzellen andere Kugel liegen, mit denen sie vielleicht kollidieren könnte.

Aber eigentlich sollte bei 20 Kugeln noch kein Problem bestehen, insbesondere weil man ja nicht jede Kugel gegen 19 andere Kugeln testen muss, sondern nur die erste. Die zweite Kugel muss man nur noch gegen 18 testen, die dritte nur noch gegen 17 ...
 
A

Alexander

Gast
Ich brauche nicht mal Kollision einzuführen..

20 Dreiecken -> unbegrenzt (ihr wisst was ich meine ;))
60 Dreiecken -> ca. 200 Kugeln
180 Dreiecken -> 30-40 Kugeln
540 Dreiecken -> 10-15 Kugeln
1620 Dreiecken -> 5-10 Kugeln
4860 Dreiecken -> 2-4 Kugeln
Bei mehr Kugeln wird es viel langsamer, heißt < 20 FPS

Ist das normal?
 

Antoras

Top Contributor
Natürlich ist das normal. Umso "runder" du die Kugeln zeichnen möchtest (mit Hilfe von mehr Dreiecken), umso mehr Rechenzeit benötigt das natürlich. Es gibt andere, viel zeitsparendere Verfahren um Kugeln rund wirken zu lassen als eine hohe Anzahl an Dreiecken zu zeichnen.

Nimm weniger Dreiecke pro Kugel, dann klappt das auch mit der Geschwindigkeit.
 
A

Alexander

Gast
Ich habe jetzt 300 Kugeln mit je 1620 Dreiecken, die zwar mit 20 FPS, aber flüssig laufen, das sieht ja schonmal geil aus xD
Ok ich beginn morgen mit den berechnungen für die Kollision.. melde mich dann nochmal ;) danke soweit
 
A

Alexander

Gast
Was sind denn diese GLUQadric Dingern? :p
Neine habe ich nicht..
Ich hatte keine Display-Lists benutzt, welche ich aber nun benutzt habe, wesegen ich die 500k Dreiecke problemlos darstellen kann ;)

Ist es sinnvoller meinen Raum in einen Raster zu teilen und für jede Kugel im und am nächsten Raster schaun ob da ne relevant Kugel ist, die kollidieren könnte oder soll ich einfach jede Kugel mit allen anderen überprüfen, also die erste mit den 19 anderen, die zweite mit den 18 andere usw..
Oder gibts noch andere sinnvollen Methoden?
 

Marco13

Top Contributor
Wie gesagt, das mit den Gitterzellen ist eine Möglichkeit. Bei 20 Kugeln ist es wohl noch egal, bei 1000 vermutlich nicht mehr ;) Im Idealfall sollte die Kollisionserkennung "austauschbar" sein (soweit das geht).
 
A

Alexander

Gast
So ich habe nun die Kollision mit den Raum erkannt und die Reaktion richtig gemacht.
Ich erkenne auch die Kollision mit anderen Kugeln, aber ich weiß nicht wie man sie richtig abprallen lässt.
Ist es nötig, dass man Vectoren benützt? Denn ich hab z.Z. keine Ahnung wie das geht, hab ich noch nie gebraucht.. :p
 

Neue Themen


Oben