# [Projekt] Physik-Engine



## Battlejoe (20. Juni 2014)

Hi,

an dieser Stelle möchte ich euch ein kleines Projekt vor mir vorstellen. Ich bin gerade dabei, eine Art kleine Physik-Engine zu schreiben und dachte mir, ich könnte das Ganze ja mal im PCGHX-Forum festhalten. Vielleicht habt ihr ja noch Anregungen und Verbesserungsvorschläge, was man später noch alles einbauen kann.

Wie bereits im Titel ersichtlich ist es das Ziel, eine kleine Physik-Engine auf die Beine zu stellen. Was ich damit später anfangen will, steht noch in den Sternen. Naja, wie heißt es so schön? "Der Weg ist das Ziel" . Ich will dabei vor allem auch dazulernen.

Derzeit ist das Projekt allerdings noch weit von seinem Ziel entfernt, aber ich befinde mich soweit ich das beurteilen kann auf ganz gutem Wege 

Was das Programm bereits kann:


Kollisionserkennung kugelförmiger Körper inklusive Kollisionsantwort
Bewegungen finden bisher ausschließlich translatorisch statt, aber da ich bisher nur Kugeln verwende, macht das nix 
Für die, die etwas damit anfangen können: Die Bewegungen werden mit Hilfe von RK4 berechnet
Was ich noch vor habe einzubauen


NATÜRLICH rotatorische Bewegungen
Kollisionserkennung und Behandlung komplexerer dreidimensionaler Körper, zunächst werde ich mich wohl den Quadern widmen
Multithreading
Hier zum Abschluss noch ein paar Bilder:

Per Tastendruck werden 100 Kugeln hinzugefügt. Das ganze schaut dann erstmal so aus:






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        




Wenn die Kugel auf dem Boden auftreffen, verteilen sie sich logischerweise in alle Himmelsrichtungen. Damit die Interaktion untereinander aber besser zu beobachten ist, habe ich die Kugeln in einen unsichtbaren "Käfig" eingesperrt  Besser auf den folgenden Bildern zu sehen, was ich damit meine.






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        




So schaut es aus, wenn sich die Kugeln langsam beruhigt haben. Beim Auftrumpfen auf dem Boden verlieren sie einen Teil ihrer Bewegungsenergie. Das führt natürlich dazu, dass die Bewegung irgendwann zum Erliegen kommt.





			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        




Hier noch ein Bild von einer Simulation mit 600 Kugeln. Man sieht an den sich ineinander schiebenden Kugeln vorne rechts, dass die Engine noch nich 100%-ig richtig arbeitet, aber da habe ich auch schon verschiedene Pläne, das zu beheben.






			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        




Sodann: Feuer frei würde ich mal sagen


----------



## Kusarr (20. Juni 2014)

mach mal video, will das mal in Action sehn 

Ansonsten


----------



## Battlejoe (20. Juni 2014)

Kusarr schrieb:


> mach mal video, will das mal in Action sehn
> 
> Ansonsten


 
gesagt, getan 

Falls Interesse besteht, kann ich auch eine ausführbare Programmversion zur Verfügung stellen

€:

Jetzt hab ich doch ganz vergessen zu schreiben, was man da sieht:

Also das erste Video zeigt im Prinzip Bild 1 und 2 aus dem ersten Post

Im zweiten Video haben sich die Kugeln beruhigt und es werden weitere 100 Kugeln hinzugefügt.

Massen werden berücksichtigt! Die 200 Kugeln, die man im dritten Video zuerst sieht, haben je eine Masse von 10 kg. Die 201e Kugel wiegt eine 1 t. Schön zu sehen ist, wie die anderen Kugeln verdrängt werden und die schwere Kugel "eintaucht". (Erinnert sich noch jemand an den Cheat "Dampfhammer" in Driver 1? Erinnert mich irgendwie daran )


----------



## DOcean (20. Juni 2014)

sieht ganz witzig aus, bei Video1 fragt man sich erstmal geht das so überhaupt ? 

Aber dann fällt einem ein 100 Kugeln perfekt übereinander bekommt man halt so nicht hin... vlt mal von einer Rutsche runterkippen?

Planst du GPU Unterstützung?


----------



## Battlejoe (20. Juni 2014)

DOcean schrieb:


> sieht ganz witzig aus, bei Video1 fragt man sich erstmal geht das so überhaupt ?
> 
> Aber dann fällt einem ein 100 Kugeln perfekt übereinander bekommt man halt so nicht hin... vlt mal von einer Rutsche runterkippen?
> 
> Planst du GPU Unterstützung?


 
Wenn ich die Kugeln alle direkt übereinander spawne, dann bleiben die irgendwann auch als Turm stehen. Ich spawne die mit Absicht alle etwas versetzt, damit das ganze realistischer wirkt. 

GPU-Unterstützung habe ich eigentlich nicht geplant. Ich will auch nicht auf vorhandene Algorithmen zurückgreifen. Daher fällt z.B. PhysX schonmal raus


----------



## Java_Jim (21. Juni 2014)

Habe mir die Viedos mal angeschaut - sehen für den Anfang ja sehr gut aus. 



Battlejoe schrieb:


> GPU-Unterstützung habe ich eigentlich nicht geplant. Ich will auch nicht auf vorhandene Algorithmen zurückgreifen. Daher fällt z.B. PhysX schonmal raus


 
Man muss nicht unbedingt PhysX benutzen, du könntest deinen Algorithmus auch in OpenCL (fast wie C) schreiben.
Dann würde er sowohl auf Nvidia- als auch auf AMD-Karten laufen.


----------



## Battlejoe (22. Juni 2014)

Das mit PhysX sollte nur ein Beispiel sein  Vllt lass ich mich, wenn dann alles funktioniert mal dazu hinreißen, OpenCl zu verwenden 

Habe die Videos mit nem Kumpel jetzt nochmal auf YoutTube hochgeladen. Vielen Dank an dieser Stelle nochmal

https://www.youtube.com/watch?v=kaRhJwQ2DRc

https://www.youtube.com/watch?v=0CVC8Rruc8A

https://www.youtube.com/watch?v=v1iT-e_d1OQ


----------



## Crymes (24. Juni 2014)

Wenn du Anregungen brauchst dann schau mal auf der Seite von der Bullet Physic Engine vorbei. In der Download Sektion gibt es gute Vorträge von Erwin Coumans über die Kollisionserkennung und interaktion verschiedener Objekte, vll. hilft dir das weiter.
Sonst aber ein cooles Projekt 

Testest du eigentlich Brute-Force mäßig alle gegen alle Objekte auf Kollision oder oder hast du eine Broadphase integriert die erst testet welche Objekte miteinander kollidieren könnten ?


----------



## Battlejoe (29. Juni 2014)

Vielen Dank für den Link.

War ganz interessant  Hatte mir vorher auch schon diverse Studien- sowie Abschlussarbeiten angesehen.

Einen SAT werde ich für komplexere Objekte noch einbauern. Ist ja wohl das übliche Verfahren für konvexe Polygone.
Zusätzlich habe ich mir die Woche noch ein wenig einschlägige Literatur liefern lassen  Jetzt bin ich auf dem Geschmack gekommen 

Eine Broad-Phase habe ich bisher noch nicht integriert, da es sich ja bisher "nur" um Kugeln handelt. Einfacher als ein Kollisionstest zwischen Kugeln gehts ja nicht 

Ich bin gerade dabei, das "Eintauchen" der Kugeln ineinander schlussendlich komplett zu unterbinden. Das funktioniert auch schon echt gut. Ich muss nur noch einige Anpassungen am "Käfig" vornehmen. Die habens aber in sich.

Wenns was sehensweres Neues gibt, gibts wieder ein Video


----------



## dailydoseofgaming (29. Juni 2014)

Auf jeden Fall ne geile idee. Gab oder gibt ja so nen ähnliches Projekt hier im Forum mit ner Grafikengine. Wäre geil wenn du irgendwann vielleicht den Quellcode irgendwie zum angucken hochladen könntest. Geht mir z.B. nur mal darum das ich mal nen eindruck bekomme wie sowas funktioniert (bin selber zwar relativ gut im Programmieren, hab aber bei sowas schon keinen Plan wo ich anfangen soll  Hab mich auch bis jetzt nur mit 2D-Kollisionen beschäftigt(ist ja relativ simpel)).


----------



## Battlejoe (13. Juli 2014)

Also ich denk den reinen Quellcode hochladen werde ich nicht. Aber ich kann (wenns dann halbwegs brauchbar ist) mal ein paar Prinzipskizzen, Ablaufdiagramme etc. hochladen und anhand derer erklären, wie das ganze dann funktioniert.


----------



## dailydoseofgaming (16. Juli 2014)

Fänd ich auch schon in Ordnung ^^


----------



## Bunny_Joe (19. Juli 2014)

Hey ich hätte da noch ein Buch für dich: Game Engine Architecture

Das Buch "Game Engine Architecture" wurde vom Naughty Dog Lead Programmierer Jason Gregory geschrieben und erscheint am 5. August in einer zweiten Ausgabe.
In der überarbeiteten Ausgabe wurde viel hinzugefügt und überarbeitet.....unter anderem:* extended/updated sections on multicore programming, pipelined CPU architecture and optimization, localization, C++11, pseudovectors and Grassman algebra, dual quaternions, SIMD vector math, memory alignment and anti-aliasing*

Es ist zwar eher an Spieleengine Programmierung ausgerichtet, aber dürfte auch für dein Projekt ziemlich aufschlussreich sein.

Der einzige "Nachteil": es ist halt auf englisch^^





Edit:

Dieses Kapitel im Buch wäre wohl das Interessanteste für dich^^

*12. Collision and Rigid Body Dynamics*

12.1 Do You Want Physics in Your Game?

12.2 Collision/Physics Middleware

12.3 The Collision Detection System

12.4 Rigid Body Dynamics

12.5 Integrating a Physics Engine into Your Game

12.6 Advanced Physics Features


----------

